PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : start-taster



inka
18.07.2016, 13:09
hallo allerseits,

ich habe mir einen start-taster "gebastelt". Zwischen "masse" und "digitapin-5" habe ich einen taster geschaltet, es muss - wie hier am beispiel "blink" dargestellt - dieser code "drumherum" gebaut werden:


#include <Bounce2.h>
#include <Wire.h>


uint8_t start, halt;


Bounce debouncer = Bounce();


void setup()
{
pinMode(13, OUTPUT);
pinMode(5, INPUT_PULLUP);
Serial.begin(115200);
digitalWrite(5, HIGH);
debouncer.attach(5);
debouncer.interval(5);
}




void loop()
{


start = digitalRead(5);


if (start == LOW)
while (1)
{
{
Serial.println(start);

digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);

/*
halt = digitalRead(5);
if (halt == LOW) digitalWrite(5, LOW);
*/
}
}
}


das mit dem anhalten ("halt" auskommentiert) funktioniert -noch- nicht....

gibt es evtl. schon eine einfachere möglichkeit?

Sisor
18.07.2016, 15:05
Ich hätts so versucht (ungetestet):
#include <Bounce2.h>
#include <Wire.h>

boolean start = false;
Bounce pin5 = Bounce();

void setup() {
pinMode(5, INPUT_PULLUP);
Serial.begin(115200);
pin5.attach(5);
pin5.interval(5);
}

void loop() {
if(pin5.update()) {
if(pin5.fell()) {
start = !start; // toggle start each time button is pressed
}
}

if(start) {
Serial.println("started!");
}
}

inka
28.07.2016, 17:29
es funktioniert, danke...

ich poste hier mal den code wo ich deine lösung implementiert habe, der hintere bereich ist hier nicht so interessant, da sind nur die einzelnen funktionen fürs fahren mit dem robby definiert...

Das starten lässt sich auf beide arten, die in dem code drinn sind super bewerkstelligen, die auskommentierte, mit der "start_taster_1()" funktion funktioniert natürlich genauso, wie die hier als funktionell aufgeführte. Die gefiel mir irgendwie besser, weil ich direkt in der loop-schleife eingreifen kann und ergänzungen/änderungen einfügen kann.

- ist diese möglichkeit wirklich besser, oder ist es nur ein (falsches?) gefühl?

- zum stoppen während der ausführung der "fahrt_1()" funktion ist mir nichts anderes eingefallen als in allen diesen fahr-funktionen die abfrage "if (start == true)" einzufügen - :-( ...und das auch noch rein theoretisch, probiert habe ich es noch nicht...

- die abfrage " if (start){} - ist die von der funktion her mit "if (start == true)" gleichzusetzen?


#include <CustomStepper.h>
//#include <NewPing.h>
//#include <Servo.h>
//#include <LCD.h>
//#include <LiquidCrystal_I2C.h>
#include <Bounce2.h>
#include <Wire.h>


uint8_t idx;


boolean start = false;
Bounce pin5 = Bounce();


enum stepper_e
{ stepper_HM, stepper_VR, stepper_VL, stepper_MAX };




CustomStepper stepper[stepper_MAX]
{
// CustomStepper(23, 25, 27, 29),
// CustomStepper(47, 49, 51, 53),
CustomStepper(35, 37, 39, 41),//stepper_HM-I
CustomStepper(23, 25, 27, 29),//stepper_VR-II
CustomStepper(47, 49, 51, 53) //stepper_VL-III
};






void setup()
{
pinMode(5, INPUT_PULLUP);
Serial.begin(115200);
pin5.attach(5);
pin5.interval(5);


}


void loop()
{
// start_taster_1();


if (pin5.update())
{
if (pin5.fell())
{
start = !start; // toggle start each time button is pressed
}
}


if (start)
{
fahrt_1();
}
else halt();


}


/************************************************** *********/
/*
void start_taster_1()
{
{
if (pin5.update())
{
if (pin5.fell())
{
start = !start; // toggle start each time button is pressed
}
}


if (start)
{
fahrt_1();
}
else halt();
}
}
*/




void fahrt_1()
{
rotate_right();
fahrt_ausfuehren();


alle_stepper_stop();
fahrt_ausfuehren();


richtung_HM();
fahrt_ausfuehren();


alle_stepper_stop();
fahrt_ausfuehren();


richtung_VR();
fahrt_ausfuehren();


alle_stepper_stop();
fahrt_ausfuehren();


richtung_VL();
fahrt_ausfuehren();


alle_stepper_stop();
fahrt_ausfuehren();


rotate_left();
fahrt_ausfuehren();


alle_stepper_stop();
fahrt_ausfuehren();
}


void halt()
{
alle_stepper_stop();
fahrt_ausfuehren();
}


void alle_stepper_stop()
{
for (idx = stepper_HM; idx < stepper_MAX; idx++)
{
stepper[idx].setRPM(0);
stepper[idx].setSPR(4075.7728395);
stepper[idx].setDirection(STOP);
}
}


void richtung_HM()
{
stepper[stepper_HM].setRPM(12);
stepper[stepper_VR].setRPM(12);
stepper[stepper_VL].setRPM(12);


stepper[stepper_HM].setSPR(4075.7728395);
stepper[stepper_VR].setSPR(4075.7728395);
stepper[stepper_VL].setSPR(4075.7728395);


stepper[stepper_VL].setDirection(CCW);
stepper[stepper_VL].rotate(2);


stepper[stepper_VR].setDirection(CW);
stepper[stepper_VR].rotate(2);
}


void richtung_VL()
{
stepper[stepper_HM].setRPM(12);
stepper[stepper_VR].setRPM(12);
stepper[stepper_VL].setRPM(12);


stepper[stepper_HM].setSPR(4075.7728395);
stepper[stepper_VR].setSPR(4075.7728395);
stepper[stepper_VL].setSPR(4075.7728395);


stepper[stepper_VR].setDirection(CCW);
stepper[stepper_VR].rotate(2);


stepper[stepper_HM].setDirection(CW);
stepper[stepper_HM].rotate(2);
}


void richtung_VR()
{
stepper[stepper_HM].setRPM(12);
stepper[stepper_VR].setRPM(12);
stepper[stepper_VL].setRPM(12);


stepper[stepper_HM].setSPR(4075.7728395);
stepper[stepper_VR].setSPR(4075.7728395);
stepper[stepper_VL].setSPR(4075.7728395);


stepper[stepper_VL].setDirection(CW);
stepper[stepper_VL].rotate(2);


stepper[stepper_HM].setDirection(CCW);
stepper[stepper_HM].rotate(2);
}


void test_richtung() //VR
{
stepper[stepper_HM].setRPM(12);
stepper[stepper_VR].setRPM(12);
stepper[stepper_VL].setRPM(12);


stepper[stepper_HM].setSPR(4075.7728395);
stepper[stepper_VR].setSPR(4075.7728395);
stepper[stepper_VL].setSPR(4075.7728395);


stepper[stepper_VL].setDirection(CW);
stepper[stepper_VL].rotate(2);


stepper[stepper_HM].setDirection(CCW);
stepper[stepper_HM].rotate(2);
}




void rotate_right_deg(void)
{
for (idx = stepper_HM; idx < stepper_MAX; idx++)
{
stepper[idx].setRPM(12);
stepper[idx].setSPR(4075.7728395);
stepper[idx].setDirection(CW);
stepper[idx].rotateDegrees(60);
}
}


void rotate_left_deg(void)
{


for (idx = stepper_HM; idx < stepper_MAX; idx++)
{
stepper[idx].setRPM(12);
stepper[idx].setSPR(4075.7728395);
stepper[idx].setDirection(CW);
stepper[idx].rotateDegrees(60);
}
}


void rotate_right(void)
{
for (idx = stepper_HM; idx < stepper_MAX; idx++)
{
stepper[idx].setRPM(12);
stepper[idx].setSPR(4075.7728395);
stepper[idx].setDirection(CCW);
stepper[idx].rotate(2);
}
}


void rotate_left(void)
{


for (idx = stepper_HM; idx < stepper_MAX; idx++)
{
stepper[idx].setRPM(12);
stepper[idx].setSPR(4075.7728395);
stepper[idx].setDirection(CW);
stepper[idx].rotate(2);
}
}








boolean fahrt_fertig()
{
return stepper[stepper_HM].isDone() && stepper[stepper_VR].isDone()
&& stepper[stepper_VL].isDone();
}


void fahrt_ausfuehren()
{
while ( ! fahrt_fertig() )
{
for (idx = stepper_HM; idx < stepper_MAX; idx++)
{
stepper[idx].run();
// delay(1);
}
}
}

Sisor
28.07.2016, 18:49
- die abfrage " if (start){} - ist die von der funktion her mit "if (start == true)" gleichzusetzen?
In C / C++ steht die Zahl 0 für 'false'. Alle anderen Werte repräsentieren 'true'. In if-Abfragen wird der Ausdruck in den Klammern auf 'true' abgeprüft. Also ja, if(start) ist praktisch das gleiche wie if(start == true).

- ist diese möglichkeit wirklich besser, oder ist es nur ein (falsches?) gefühl?
Die funktion loop() wird im Hintergrund in einer while(true)-Schleife ständig aufgerufen. Die Frage ist, ob auf die Taster ständig reagiert werden soll. Wenn ja, sollte auch ständig die update()-Funktion der Bounce-Objekte aufgerufen werden.