LBotics.at

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

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

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

Innerhalb der while-Schleife wird zunächst der aktuelle YAW-Wert des IMU-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 YAW-Werte des IMU-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 IMU-Sensor z. B. zunächst den Wert 89 Grad und beim nächsten Auslesen den Wert 91 liefert.

Programmbeispiel - Exakte Drehung mit dem Gyro-Sensor ausgehend von einer beliebigen Startrichtung
#include "KeplerOpenBOT.h"

uint16_t StartWert;
uint16_t AktuellerWert;

void setup()
{
KeplerOpenBOT_INIT();
WRITE_I2C_BNO055_INIT();
StartWert = READ_I2C_BNO055_YAW();
AktuellerWert = 0;
WRITE_MOTOR(ML,-20);
WRITE_MOTOR(MR,20);
}

void loop()
{
AktuellerWert = READ_I2C_BNO055_YAW();
if(AktuellerWert>=StartWert+90)
{
WRITE_MOTOR(ML,0);
WRITE_MOTOR(MR,0);
}
}

 

Erklärungen zu diesem Programmbeispiel

Zeile 3, 4:

Hier werden die Integer-Variablen StartWert und AktuellerWert definiert.

Zeile 9:

Zum Initialisieren und Kalibrieren des IMU-Sensors muss die Funktion WRITE_I2C_BNO055_INIT() aufgerufen werden, bevor dieser verwendet werden kann.

Zeile 10:

An dieser Stelle wird der Integer-Variable StartWert der aktuelle YAW-Wert des IMUSensors bei Programmstart zugewiesen.

Zeile 12, 13:

Mit Start des Programms beginnen sich die Motoren entgegengesetzt zu drehen.

Zeile 18:

Einlesen des aktuellen YAW-Werts des IMU-Sensors und Ablegen in der Variable AktuellerWert.

Zeile 19-23:

Wenn der aktuelle YAW-Wert des IMU-Sensors größer oder gleich dem zu Programmstart ermittelten YAW-Wert plus 90 Grad ist, werden die beiden Motoren angehalten.