Forum: Mikrocontroller und Digitale Elektronik Motorsteuerung mit Taster


von Emil (kega)


Lesenswert?

Hallo Zusammen,
ich bin neu in der Welt des Arduinos und will mich nun mal an einem 
Projekt versuchen. Mein Ziel ist es, den Arduino nur für einen Prototyp 
zu gebrauchen und die entstandene Schaltung als Grundlage für eine 
eigene Platine zu verwenden.
Mein Vorhaben ist nicht komplex, hat aber so seine Tücken.
Ein Baustein des Projekts ist die Ansteuerung eines Motors, wobei ein 
Taster verwendet werden soll.
Funktion 1: Wird der Taster gehalten, läuft der Motor; wird der Taster 
losgelassen, soll der Motor stehen.
Funktion 2: Wird der Taster zweimal kurz hintereinander betätigt, läuft 
der Motor und der Taster kann losgelassen werden. Zum Anhalten des 
Motors muss der Taster dann erneut betätig werden.

Hier der Code für Funktion 1:

void setup() {
pinMode(2, INPUT_PULLUP);
pinMode(3, OUTPUT);
}

void loop() {
if (digitalRead(2)== LOW) {
digitalWrite(3, HIGH);
} else {
digitalWrite(3,LOW);
}
}

Ich wurde zudem auf einen Umstand aufmerksam gemacht, der mit der 
Rechengeschwindigkeit zusammenhängt. Mein Kollege meinte, je größere das 
Programm ist, desto größer ist die Abweichung bei den Zeiten. Das könnte 
für mich bedeuten, dass ich bei einem kleinen Programm (Funktion 2) den 
Taster sehr schnell betätigen muss und mir bei einem großen Programm 
mehr Zeit bleibt.

Zu meinen Problemen, mir fehlen ein paar grundlegende Programmbausteine, 
die mir es ermöglichen von Funktion 1 u. 2 zu unterscheiden und Funktion 
2 auszuführen. Des Weiteren will ich im Hinterkopf behalten, dass der 
Arduino (so vielfältig die Möglichkeiten auch sind) nur für den Prototyp 
verwendet werden soll.

Eventuell hat jemand eine Idee, wie ich Funktion 2 auf dem Arduino 
umsetzen kann; oder eine Anmerkung.

von Sebastian R. (sebastian_r569)


Lesenswert?

Emil schrieb:
> Eventuell hat jemand eine Idee, wie ich Funktion 2 auf dem Arduino
> umsetzen kann; oder eine Anmerkung.

"kurz oder lang" sind schon einmal Zeiteinheiten. Das heißt, du musst 
erst einmal messen, wie lange der Taster schon gedrückt ist, nachdem er 
gedrückt wurde.

Beim Loslassen geht der Zähler wieder auf Null.

Wenn das läuft, kann Funktion 1 wieder rein. Wenn der Taster länger als 
z.B. 3 Sekunden gedrückt wurde, läuft der Motor, bis man den Taster 
wieder loslässt. Das sollte noch einfach sein.

Für Funktion 2 gibt es ziemlich viele Ansätze. Wenn der Taster 2x binnen 
3 Sekunden gedrückt wurde, geht's los oder wenn der Taster für <1s 
gedrückt, für <1s losgelassen und dann wieder gedrückt wurde, geht's 
los,...


Und falls alles frustet, gibt's bei Arduino immer einen, der genau das 
schon gemacht hat:
https://github.com/poelstra/arduino-multi-button

von Peter D. (peda)


Lesenswert?

Emil schrieb:
> Das könnte
> für mich bedeuten, dass ich bei einem kleinen Programm (Funktion 2) den
> Taster sehr schnell betätigen muss und mir bei einem großen Programm
> mehr Zeit bleibt.

Das kann Anfängern passieren, wenn sie keine konstante Zeitbasis zum 
Abzählen der Drückabstände benutzen (Timerinterrupt).

Hier mal ein Beispiel mit Doppeldruckerkennung:
Beitrag "Wartezeiten effektiv (Scheduler)"

von Michi S. (mista_s)


Lesenswert?

Emil schrieb:
> Funktion 1: Wird der Taster gehalten, läuft der Motor;

Soll der Motor dabei sofort beim Niederdrücken des Tasters loslaufen?

> wird der Taster losgelassen, soll der Motor stehen.

Und auch sofort beim Loslassen wieder stoppen?

Falls Deine Antwort zweimal ja ist dann...

> Funktion 2: Wird der Taster zweimal kurz hintereinander

läuft der Motor los, stoppt, läuft wieder los, bevor der Doppeldruck als 
solcher erkannt werden kann.

Ob das in Deiner Anwendung zum Problem oder auch nur einem ggf. 
unschönen kurzen Ruckler wird, mußt Du selbst beurteilen bzw. ergibt 
sich daraus eine maximale Zeit dafür wie schnell kurz hintereinander 
sein muß.

von Klaus H. (hildek)


Lesenswert?

Michi S. schrieb:
> läuft der Motor los, stoppt, läuft wieder los, bevor der Doppeldruck als
> solcher erkannt werden kann.

Die Fragen hatte ich mir auch gestellt. Ist aber lösbar 😀.

Damit er das zitierte nicht macht, gibt es noch die Option 1, dass er 
eben sofort startet und mindestens die Zeit t0 läuft, bis spätestens ein 
zweiter Tastendruck eingegangen sein muss für die Funktion 2.
Alternativ die Option 2: man lässt ihn generell erst loslaufen, wenn 
diese Zeit t0 abgelaufen ist oder der zweite Tastendruck erkannt wurde, 
was ja etwas früher sein wird.

von Joe L. (joelisa)


Lesenswert?

Stichwort Zustandsautomat, FSM (finite state machine)

https://de.wikipedia.org/wiki/Endlicher_Automat
https://www.mikrocontroller.net/articles/Statemachine

Damit der FSM formuliert man das Problem.

Die Eingaben (Taster lang/kurz/2x) und Aktionen (Motor an/aus) 
formuliert man vorteilhafterweise an anderer Stelle.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.