LBotics.at

In diesem Beispiel wird gezeigt, wie zeitgesteuerte Bewegungsabläufe in eine Ablaufsteuerung mit Ereignisbehandlung integriert werden können. Der Roboter, der hier zum Einsatz kommen soll verfügt über zwei Motoren für den Antrieb und einen Touch-Sensor an der Vorderseite um auf das Berühren eines Hindernisses reagieren zu können.

Wichtigstes Ziel bei der Umsetzung ist, dass der Programmcode innerhalb der while-Schleife so schnell wie möglich durchlaufen wird und dieser an keiner Stelle durch die Verwendung der Funktion SLEEP() oder eine weitere Schleife, die auf das Eintreten eines Ereignisses wartet, angehalten wird.

So ist gewährleistet, dass die if-Abfragen im Bereich Ereignisbehandlung ununterbrochen und in möglichst kurzen Zeitabständen hintereinander ausgeführt werden und somit umgehend auf Sensor- Informationen reagiert werden kann.

Mit diesem Programm soll der Roboter durch einen Druck auf den UP-Button einen vorgegebenen, zeitgesteuerten Pfad abfahren und bei einer Kollision jederzeit anhalten. Dazu wird diese Aufgabenstellung in drei Status-Bereiche unterteilt:

Status 0 - Programmstart, keine Aktionen

Wird das Programm gestartet, so ist der Roboter im Status 0 und führt keine Aktionen aus.

Status 1 - zeitgesteuerter Pfad

Durch einen Druck auf den UP-Button am EV3 Brick wird der Status auf 1 und der Counter auf 0 gesetzt. In der Folge wird der Programmcode ausgeführt, der Status 1 zugeordnet ist und den Roboter folgenden Pfad abfahren lässt: 2 Sekunden vorwärts, 1 Sekunde Drehung, 1 Sekunde vorwärts

Status 2 - Kollision

Trifft der Touch-Sensor auf ein Hindernis so liefert dieser den Wert 1 zurück und die Variable Status wird auf 2 gesetzt. In dem dazugehörenden Programmcode werden beide Motoren angehalten und der Roboter bleibt vor dem Hindernis stehen.

Das Abfahren des vorgegebenen Pfades kann jederzeit durch Drücken des UP-Buttons wieder gestartet werden. Auch ist es jederzeit möglich, das Programm mit dem Exit-Button zu beenden.

#include "evclibrary.h"
int main()
{
// 1. Konfiguration
SET_OUT(OUT_A,OUT_MOTOR);
SET_OUT(OUT_B,OUT_MOTOR);
SET_IN(IN_1,IN_EV3_TOUCH);
// 2. Initialisieren des Brick
EVC_INIT();
// 3. Programm - Roboter
int Status = 0;
while(NOTEXITBUTTON)
{
// Ereignisbehandlung
if(READ_BUTTON(BUTTON_UP)==1)
{
COUNTER = 0;
Status = 1;
}
if(READ_IN(IN_1)==1)
{
Status = 2;
}
// Aktionen
if(Status==1)
{
if (COUNTER>=0)
{
WRITE_OUT(OUT_A, MOTOR_POWER, 50);
WRITE_OUT(OUT_B, MOTOR_POWER, 50);
}
if (COUNTER>=20)
{
WRITE_OUT(OUT_A, MOTOR_POWER, 0);
WRITE_OUT(OUT_B, MOTOR_POWER, 50);
}
if (COUNTER>=30)
{
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(Status==2)
{
WRITE_OUT(OUT_A, MOTOR_STOP, MOTOR_BRAKE);
WRITE_OUT(OUT_B, MOTOR_STOP, MOTOR_BRAKE);
}
}
// 4. Programmende - Freigeben der Hardwarezugriffe
EVC_CLOSE();
return 0;
}