Im Projekt #4.2 Servo langsam bewegen haben wir es geschafft, den Servo nicht Ruckartig auf eine Position zu bewegen, sondern langsam seine neue Position anzufahren.
Nun haben wir dort die Funktion Delay() verwendet. Nachteil an dieser Funktion: das ganze Program stoppt für die vorgegebene Zeit.
Es werden keine weiteren Taster ausgewertet noch kann solange eine weitere Funktion ausgeführt werden.
Die Lösung: millis()
Das Funktionsprinzip
Im Arduino läuft ein Timer dauerhaft mit. Anstatt einen delay() zu programmieren, speichert man sich den Wert des Timers ab und vergleicht diese mit sich selbst + die Zeit die verstreichen soll.
Beispiel
Eine LED soll jede Sekunde ihren Status ändern.
An - Aus - An - Aus - An - Aus ....
Denn wird die LED eingeschaltet und der aktuelle Wert des Timers gespeichert.
-> LEDprevMil = millis() // sagen wir Lillis hat den Wert 9563
Dann vergleichen wir in jedem Durchlauf den aktuellen Wert mit gespeicherten + Zeit X
-> if(millis() > LEDprevMil + 1000)
Wenn das der fall ist, können wir den Status ändern.
Dieses Prinzip können wir uns jetzt zu Nutze machen, wenn wir den Servo all X Millisekunden 1 Grad weiter Takten möchten.
Zunächst brauchen wir wieder die Servo Library und ein paar Variablen auf die wir Wert schreiben und speichern können.
Wir müssen der Servo benennen, den Pin bekannt machen, eine Variable für die Ausgangsposition und eine für die Zielposition anlegen, eine für die Millisekunden die zwischen jedem Schritt verstreichen sollen, und eine in der wir den Wert des Timers festhalten.
Zusätzlich wollen wir den Servo über 2 Taster steuern und auch dazu legen wir die entsprechenden Variablen an.
Im Setup Bereich definieren wir dann unsere Pins nach ihren Funktionen.
Und dann gehts los.
Zunächst speichern wir uns den aktuellen Wert unseres Timer.
Dann prüfen wir ob ein Taster gedrückt wurde, und legen ggf. eine neue Sollposition fest.
Entspricht die Ist- nicht der Sollposition aktivieren wir den Servo. Dann prüfen wir nach dem oben erklärten Muster, ob die letzte Bewegung lang genug her ist, um eine neue Bewegung anzustoßen.
Wenn ja geht es ein Schritt in die entsprechende Richtung.
Erreicht der Servo die Sollposition wird der Servo wieder deaktiviert.
Wird nun z.B. wieder eine taste gedrückt, wird der Tastendruck sofort ausgewertet und der Servo dreht bei Bedarf um.
Zusätzlich könnte auch ein Blinklicht integriert werden. Wie das geht zeige ich unter Anderem in meinem YouTube Video.
Um nach diesem Prinzip zwei Servos mit einem Arduino zu bewegen, Müssen wir zunächst alle Variablen doppelt anlegen.
Die Pins natürlich im Setup Bereich wieder ihrer Funktion zuordnen.
Und im Loop den zweiten Servo mit den entsprechenden Variablen einfügen.
Diese Webseite wurde mit Jimdo Creator erstellt! Jetzt kostenlos registrieren auf https://de.jimdo.com