LBotics.at

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

Im diesem Beispiel soll ein Roboter eine Sekunde nach Programmstart mit einer Leistung von 50% für 3 Sekunden vorwärts fahren. Nachdem der Roboter 4 Sekunden lang stehengeblieben ist, soll dieser 4 Sekunden mit einer Leistung von 70% rückwärts fahren bevor das Programm beendet wird.

Um diese zeitabhängige Steuerung der Motoren umzusetzen, werden mit if-Abfragen die entsprechenden Zeitintervalle seit dem Start des Programms 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 Programm kann im Gegensatz zum Einsatz der Funktion SLEEP() jederzeit mit dem Exit-Button beendet werden, da die Ausführung des Programmcodes an keiner Stelle angehalten wird.

Programmbeispiel - Zeitgesteuerter Bewegungsablauf unter Verwendung des Counters
#include "evclibrary.h"
int main()
{
// 1. Konfiguration
SET_OUT(OUT_A, OUT_MOTOR);
SET_OUT(OUT_B, OUT_MOTOR);
// 2. Initialisieren des Brick
EVC_INIT();
// 3. Programm - Roboter
while(NOTEXITBUTTON)
{
if (COUNTER==10)
{
WRITE_OUT(OUT_A, MOTOR_POWER, 50);
WRITE_OUT(OUT_B, MOTOR_POWER, 50);
}
if (COUNTER==40)
{
WRITE_OUT(OUT_A, MOTOR_STOP, MOTOR_COAST);
WRITE_OUT(OUT_B, MOTOR_STOP, MOTOR_COAST);
}
if (COUNTER==80)
{
WRITE_OUT(OUT_A, MOTOR_POWER, -70);
WRITE_OUT(OUT_B, MOTOR_POWER, -70);
}
if (COUNTER==120)
{
break;
}
}
// 4. Programmende - Freigeben der Hardwarezugriffe
EVC_CLOSE();
return 0;
}
Erklärungen zu diesem Programmbeispiel
Zeile 12-16: if (COUNTER==10) { ... }

Mit dieser if-Abfrage wird überprüft, ob der aktuelle Wert der Variable COUNTER 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% gesetzt.

Zeile 27-30: if (COUNTER==120) { ... }

Die Bedingung dieser if-Abfrage ist dann erfüllt, wenn der Wert der Integer-Variable COUNTER den Wert 120 hat, also seit dem Programmstart 12 Sekunden vergangen sind. Zu diesem Zeitpunkt wird die while-Schleife mit break verlassen und das Programm somit beendet.