LBotics.at

Soll ein Roboter eine exakte Drehung um einen bestimmten Winkel durchführen, so kann diese exakter ausgeführt werden, wenn man den Gyro-Sensor verwendet und nicht nur die Motoren mit unterschiedlichen Geschwindigkeiten für eine bestimmte Zeit drehen lässt.

Da sich der Gyro-Sensor nicht zurücksetzen lässt, sondern als Wert immer den absoluten Drehwinkel seit dem Einschalten des EV3 Bricks liefert, muss zu Beginn einer Drehung der aktuelle Winkel bestimmt und in der Folge als Referenz für die gewünschte Drehung verwendet werden.

ACHTUNG: Im Gyro-Sensor läuft eine Auto-Kalibrierung ab, sobald der EV3 Brick eingeschaltet wird. In dieser Zeit darf der Gyro-Sensor auf keinen Fall bewegt werden!

Programmbeispiel - Exakte Drehung mit dem Gyro-Sensor

Im folgenden Beispiel wird vor Beginn der Drehung des Roboters um die Hochachse der aktuelle Wert des Gyro-Sensors ermittelt und in der Variable GyroStartWert abgelegt.

Innerhalb der while-Schleife wird zunächst der aktuelle Wert des Gyro-Sensors eingelesen. Wenn die Drehung genau 90 Grad betragen soll, wird in einer if-Abfrage während der Drehung überprüft, ob der aktuelle Wert gleich dem Startwert plus 90 Grad ist.

Da es sein könnte, dass die Werte des Gyro-Sensors nicht kontinuierlich in 1-Grad-Schritten zurückgeliefert werden, oder sich der Roboter zwischen zwei Abfragen mehr als 1 Grad gedreht hat, sollte man als Vergleichsoperator >= und nicht nur == verwenden. Somit würde die Bedingung der if- Abfrage auch erfüllt sein wenn der Gyro-Sensor z. B. zunächst den Wert 89 Grad und beim nächsten Auslesen den Wert 91 liefert.

Das Programm kann auch jederzeit mit dem Exit-Button beendet werden, da der Programmcode in der while-Schleife kontinuierlich ausgeführt und an keiner Stelle angehalten wird.

#include "evclibrary.h"
int main()
{
// 1. Konfiguration
SET_IN(IN_1,IN_EV3_GYRO);
SET_OUT(OUT_A,OUT_MOTOR);
SET_OUT(OUT_B,OUT_MOTOR);
// 2. Initialisieren des Brick
EVC_INIT();
// 3. Programm - Roboter
int GyroStartWert = READ_IN(IN_1);
int GyroAktuellerWert = 0;
while(NOTEXITBUTTON)
{
GyroAktuellerWert = READ_IN(IN_1);
WRITE_OUT(OUT_A, MOTOR_POWER, -20);
WRITE_OUT(OUT_B, MOTOR_POWER, 20);
if(GyroAktuellerWert>=GyroStartWert+90)
{
WRITE_OUT(OUT_A, MOTOR_STOP, MOTOR_BRAKE);
WRITE_OUT(OUT_B, MOTOR_STOP, MOTOR_BRAKE);
break;
}
}
// 4. Programmende - Freigeben der Hardwarezugriffe
EVC_CLOSE();
return 0;
}
Erklärungen zu diesem Programmbeispiel
Zeile 11: int GyroStartWert = READ_IN(IN_1);

Hier wird die Integer-Variable GyroStartWert definiert und dieser dann der aktuelle Wert des Gyro-Sensors bei Programmstart zugewiesen.

Zeile 12: int GyroAktuellerWert = 0;

Definition der Integer-Variable GyroAktuellerWert, in der innerhalb der while-Schleife der aktuelle Wert des Gyro-Sensors während der Drehbewegung abgelegt wird.

Zeile 15: GyroAktuellerWert = READ_IN(IN_1);

Einlesen des aktuellen Werts des Gyro-Sensors und Ablegen in der Variable GyroAktuellerWert.

Zeile 16-17: WRITE_OUT(OUT_A, MOTOR_POWER, -20);

Drehen der beiden Motoren in entgegengesetzte Richtung mit der Geschwindigkeit 20%.

Zeile 18-22: if(GyroAktuellerWert>=GyroStartWert+90) { ... }

Wenn der aktuelle Wert des Gyro-Sensors größer oder gleich dem zu Programmstart ermittelten Wert des Gyro-Sensors plus 90 Grad ist, werden die beiden Motoren angehalten, mit
break die while-Schleife verlassen und somit das Programm beendet.