ca 3 Jahre nach meinem letzten Post hier habe ich mich mal wieder etwas mit dem Duino beschäftigt.
Allerdings ist mein Wissen stark eingerostet und ich suche vergeblich nach einem Lösungsansatz.
Folgendes sind die Rahmenbedingungen:
1 Motor der mittels eines Mosfet angesteuert wird und an einer Zahnradkonstruktion hängt
1 Momentary Switch, der sich innerhalb der Zahnradkonstruktion befindet und mittels einer ovalen Scheibe angesteuert wird (dh nach einer vollen Umdrehung wird der Switch kurz betätigt)
1 Pushbutton der den Motor anfahren lassen soll
Das Soll Szenario:
Ich drücke auf den Pushbutton und der Motor läuft solange, bis der Momentary Switch von 0 auf 1 geht. Und von vorne wenn ich wieder drücke. Klingt einfach, hat mich gestern aber 2h gekostet ohne Erfolg.
Das Problem ist, dass ich nicht garantieren kann dass der Momentary Switch manchmal an der Scheibe "hängt", also noch 1 ausgibt wenn der Motor steht, was ich also ignorieren möchte wenn der Button gedrückt wird.
Vereinfacht gesagt soll der Motor immer anlaufen wenn ich den Knopf einmal drücke, und immer stehenbleiben wenn sich das Reading des Momentary switch von 0 auf 1 ändert (nicht aber andersrum)
Habe schon so ziemlich alles mit ButtonStateChange, if-schleifen, while etc ausprobiert, aber irgendwie kein erfolg. entweder der Motor läuft einfach weiter, oder er bleibt stehen und läuft nicht mehr an oder...
Welchen Ansatz würdet ihr hier wählen, bzw welche Codeschnipsel wären hier passend?
Für solche Kinkerlitzchen bemüht man keinen Rechner.
Würd ich LowTech machen: Sprungschalter und Taster parallel schalten, fertig. 8)
Braucht allerdings nen Sprungschalter, der EIN schaltet-ist aber easy, den zu besorgen.
-Wird Taster gedrückt, ist der Sprungschalter überbrückt und das Ding läuft
-Wird der Taster gehalten, läuft das Ding bis er losgelassen wird, und dann noch bis zum Ende (Sprungschalter trennt ebenfalls)
-Wird der Taster kurz gedrückt, läufts ne Umdrehung
Wenn man das mechanisch vernünftig baut, ist es nen Rundum-Sorglos-Paket.
apogee:
Vereinfacht gesagt soll der Motor immer anlaufen wenn ich den Knopf einmal drücke, und immer stehenbleiben wenn sich das Reading des Momentary switch von 0 auf 1 ändert (nicht aber andersrum)
Was Du machen möchtest, nennt sich auf Neudeutsch "state change detection" und dafür gibt es ein Arduino-Beispielprogramm.
Schaue mal in Deiner Arduino-IDE nach unter: Datei - Beispiele - 02.Digital - StateChangeDetection
Anhand des Beispiels sollte es eigentlich klar werden, wie man eine bestimmte Statusänderung erkennt.
Wie ich ja bereits eingangs schrob, habe ich ButtonStateChange etc schon durchgearbeitet.
Hier ist das Problem, dass sich ja der Status auch wieder ändert wenn der Momentary von 1 auf 0 springt, was ganz am Anfang auch passieren kann. Dann läuft der Motor nicht an.
apogee:
Wie ich ja bereits eingangs schrob, habe ich ButtonStateChange etc schon durchgearbeitet.
Hier ist das Problem, dass sich ja der Status auch wieder ändert wenn der Momentary von 1 auf 0 springt, was ganz am Anfang auch passieren kann. Dann läuft der Motor nicht an.
OK, ich habe nochmal überlegt, eigentlich kannst Du den Zyklus anfängermäßig auch komplett straight-forward programmieren und es ganz billig machen.
Dass der Motor beim Einschalten noch auf seiner Ausschaltbedingung steht, muss man dadurch berücksichtigen, dass der Motor eben nicht abschaltet, bevor nicht der Motorschalter seinen Roundtrip-Status signalisiert hat. Mein Beispielprogramm wartet dazu nach dem Einschalten erstmal auf das Verschwinden des Abschaltsignals plus 5 Millisekunden zum Entprellen des mechanischen Kontakts.
Bei den Schaltern gehe ich davon aus, dass Du keine externen Pull-Widerstände verbaust, sondern die internen PullUp-Widerstände des Controllers verwendest, also die Schalter zwischen jeweils GND und Digitalpin anschließt.
Beispielprogramm:
// Buttonpin zwischen Pin-2 und GND
// Momentarypin zwischen Pin-8 und GND
// Motor schaltet mit Pin-13
const int buttonPin = 2; // the pin that the pushbutton is attached to
const int momentaryPin=8; // Motor-Abschaltkontakt
const int motorPin= 13; // Schaltpin für Motor
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(momentaryPin, INPUT_PULLUP);
pinMode(motorPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
Serial.println("Press button to start engine...");
while (digitalRead(buttonPin)==HIGH); // Geht LOW wenn Button gedrückt
digitalWrite(motorPin, HIGH); // Motor an
Serial.println("OK. Engine is running...");
while (digitalRead(momentaryPin)==LOW); // über den Abschaltstatus drüberfahren
delay(5); // Entprellen des mechanischen Kontakts
while (digitalRead(momentaryPin)==HIGH); // warten auf Abschaltstatus
digitalWrite(motorPin, LOW); // Motor aus
Serial.println("Motor STOP.");
}