LBotics.at

Weist man bei einem Roboter, der von zwei Motoren angetrieben wird, beiden Motoren die gleiche Geschwindigkeit oder die gleiche Leistung zu, so wird der Roboter aufgrund von produktionsbedingten Unterschieden in den Motoren bzw. den darin enthaltenen mechanischen und elektronischen Komponenten über längere Strecken nie genau geradeaus fahren.

Soll ein Roboter seine Fahrtrichtung exakt beibehalten, so kann dazu der Gyro-Sensor verwendet werden. Mit Hilfe dieses Sensors wird laufend die aktuelle Richtung ermittelt und mit der gewünschten Richtung verglichen. Fall es dabei eine Abweichung gibt, wird die Geschwindigkeit der Motoren angepasst um den Roboter wieder in die gewünschte Richtung zurückzudrehen.

Programmbeispiel - Exaktes Geradeausfahren mit dem Gyro-Sensor ausgehend von einer Startrichtung

In diesem Codebeispiel wird zu Beginn des Programms die aktuelle Richtung ermittelt in die der Roboter fahren soll und in der Variable ZielWert abgelegt.

In der while-Schleife wird zunächst der aktuelle Wert des Gyro-Sensors eingelesen und der Variable AktuellerWert zugewiesen. In der Folge wird in if-Abfragen überprüft, ob die aktuelle Richtung links oder rechts von der gewünschten Richtung abweicht. Ist dies der Fall, wird die Geschwindigkeit des jeweiligen Motors um drei erhöht, damit sich der Roboter wieder zur gewünschten Richtung zurückdreht.

Gleicht die aktuelle Richtung der gewünschten Richtung, so bekommen beide Motoren die gleiche Geschwindigkeit zugewiesen.

Dieses Programm kann jederzeit mit einem Druck auf den Exit-Button abgebrochen werden.

Das closed loop - Verfahren

Das Verfahren, das hier zur Anwendung kommt, wird als closed loop bzw. als Regelkreis mit Rückkopplung bezeichnet.

Die Änderung von gemessenen Werten führt dazu, dass ein Prozess (hier die Ansteuerung von Motoren) geregelt wird. Bei einem closed loop Verfahren fließen die Änderungen, die sich aus diesem Regelprozess ergeben, bei den nächsten Entscheidungen oder Berechnungen für die folgenden Aktionen direkt mit ein.

#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 ZielWert = READ_IN(IN_1);
int AktuellerWert = 0;
while(NOTEXITBUTTON)
{
AktuellerWert = READ_IN(IN_1);
if(AktuellerWert>ZielWert)
{
WRITE_OUT(OUT_A, MOTOR_POWER, 43);
WRITE_OUT(OUT_B, MOTOR_POWER, 40);
}
if(AktuellerWert==ZielWert)
{
WRITE_OUT(OUT_A, MOTOR_POWER, 40);
WRITE_OUT(OUT_B, MOTOR_POWER, 40);
}
if(AktuellerWert<ZielWert)
{
WRITE_OUT(OUT_A, MOTOR_POWER, 40);
WRITE_OUT(OUT_B, MOTOR_POWER, 43);
}
}
// 4. Programmende - Freigeben der Hardwarezugriffe
EVC_CLOSE();
return 0;
}
Erklärungen zu diesem Programmbeispiel
Zeile 11: int ZielWert = READ_IN(IN_1);

Hier wird die Integer-Variable ZielWert definiert und dieser der aktuelle Wert des Gyro-Sensors zu Programmstart zugewiesen.

Zeile 12: int AktuellerWert = 0;

Definition der Integer-Variable AktuellerWert in der während der Fahrt die aktuelle Richtung des Gyro-Sensors abgelegt wird.

Zeile 15: AktuellerWert = READ_IN(IN_1);

Kontinuierliches Einlesen des aktuellen Werts des Gyro-Sensors zu Beginn der while-Schleife.

Zeile 16-20: if(AktuellerWert>ZielWert) { ... }

Hier wird überprüft, ob die aktuelle Richtung größer als die Zielrichtung ist, der Roboter also von der gewünschten Richtung aus nach rechts gedreht hat. Ist dies der Fall, wird die
Geschwindigkeit des Motors am Ausgang A (Motor auf der rechten Seite) um 3 erhöht, damit der Roboter wieder in Richtung des gewünschten Werts zurückdreht.

Zeile 21-25: if(AktuellerWert==ZielWert) { ... }

Stimmt die aktuelle Richtung genau mit der gewünschten Richtung überein, so werden die Geschwindigkeiten bei beiden Motoren auf den gleichen Wert gesetzt.

Zeile 26-30: if(AktuellerWert<ZielWert) { ... }

Wenn der aktuelle Richtungswert kleiner als der Zielwert ist, so hat sich der Roboter zu weit nach links verdreht und muss durch Erhöhen der Geschwindigkeit des linken Motors wieder nach rechts zurückdrehen.