LBotics.at

Möchte man zeitgesteuerte Bewegungsabläufe realisieren, ohne dass dabei die Ausführung des Programmcodes mit der Funktion time.sleep() angehalten wird, so kann man dazu den Timer verwenden.

Im diesem Beispiel soll ein Roboter eine Sekunde nach dem Start des Skripts mit 50 RMP für 3 Sekunden vorwärts fahren. Nachdem der Roboter 4 Sekunden lang stehengeblieben ist, soll dieser 4 Sekunden mit 70 RMP rückwärts fahren bevor am Display der String "FERTIG" angezeigt wird.

Um diese zeitabhängige Steuerung der Motoren umzusetzen, werden mit if-Abfragen die entsprechenden Zeitintervalle seit dem Start des Skripts abgefragt und darauf basierend die jeweiligen Motorleistungen gesetzt.

Die Anordnung der if-Abfragen muss dabei nicht der Reihenfolge des zeitlichen Ablaufs folgen, sondern könnte auch beliebig durchmischt werden und würde zu dem selben Bewegungsablauf führen.

Dieses Skript kann im Gegensatz zum Einsatz der Funktion time.sleep() jederzeit auf die Auswertung von Sensoren reagieren, da die Ausführung des Codes an keiner Stelle angehalten wird.

Beispiel - Zeitgesteuerter Bewegungsablauf unter Verwendung des Timers
import cyberpi, mbot2

while True:
if int(cyberpi.timer.get())==1:
mbot2.EM_set_speed(50, 1)
mbot2.EM_set_speed(-50, 2)
if int(cyberpi.timer.get())==4:
mbot2.EM_stop()
if int(cyberpi.timer.get())==8:
mbot2.EM_set_speed(-70, 1)
mbot2.EM_set_speed(70, 2)
if int(cyberpi.timer.get())==12:
mbot2.EM_stop()
cyberpi.display.show_label("FERTIG",12,0,0)

 

Erklärungen zu diesem Programmbeispiel

Zeile 4-6: if int(cyberpi.timer.get())==1:

Mit dieser if-Abfrage wird überprüft, ob der aktuelle Wert des Timers gleich 10 ist. Dies bedeutet, dass seit Start des Programms (bei dem der Counter von 0 zu zählen
beginnt) eine Sekunde vergangen ist. Zu diesem Zeitpunkt werden die Leistungen für beide Motoren auf 50 RPM gesetzt.

Dabei wird die Dezimalzahl, welche die Zeit mit Tausendstel beinhaltet, zunächst mit der Funktion int() in einen ganzzahligen Wert umgewandelt. Dies ist unbedingt notwendig, da es sein kann, dass der Wert des Timers bei einem Schleifendurchlauf 0.992, dann beim nächsten 1.003 ist und der Wert 1.0 nie genau erreicht wird, da ein Schleifendurchlauf eine gewisse Zeit benötigt.

Zeile 12-14: if int(cyberpi.timer.get())==12:

Die Bedingung dieser if-Abfrage ist dann erfüllt, wenn der Wert des Timers den Wert 12 hat, also seit dem Programmstart 12 Sekunden vergangen sind. Die beiden Motoren werden angehalten und es erfolgt die Ausgabe des Strings "FERTIG" am Display.