User manual
RP6 ROBOT SYSTEM - 4. Programmierung des RP6
Der Roboter wird versuchen die gewünschte Strecke möglichst genau abzufahren. In
der motionControl Funktion wird dazu zunächst ganz normal auf die gewünschte Ge-
schwindigkeit beschleunigt, dann aber kurz vor dem Ziel abgebremst um nicht zu weit
zu fahren. Das klappt aber nur auf ein paar Millimeter genau (etwa plusminus 5mm) –
was in den meisten Fällen aber gut ausreichen sollte.
Ganz kurze Strecken kann man mit der Funktion leider nicht genau fahren, es sollten
schon mindestens 5cm sein. Das kann allerdings noch stark verbessert werden!
Der letzte Parameter der Funktion, „blocking“ ist eine kleine Besonderheit, die wir et-
was genauer erklären müssen.
Die Funktion setzt normalerweise nur ein paar Variablen und es würde dann sofort mit
dem normalen Programmablauf weitergemacht. Die Fahrt würde „im Hintergrund“ au-
tomatisch von der motionControl Funktion gesteuert. Das ist sinnvoll, wenn der Robo-
ter nebenbei noch andere Dinge tun muss, wie z.B. auf Hindernisse reagieren. Aber
wenn man einfach nur ein bestimmtes Muster abfahren möchte, kann man das über
den blocking Parameter beeinflussen.
Ist der Parameter „true“ (also 1) ruft die Funktion in einer Schleife solange die mo-
tionControl Funktion auf, bis die gewünschte Strecke abgefahren worden ist. Die
Funktion wird dann nicht einfach verlassen, sondern blockiert den normalen Program-
mablauf für diese Zeit.
Ist der Parameter false, verhält sich die Funktion wie oben beschrieben und wird so-
fort verlassen, nachdem der „Auftrag zum Fahren einer Strecke“ erteilt wurde. Wenn
man dann während dieser Zeit andere Funktionen aufruft, die z.B. die Geschwindigkeit
setzen, neue Fahrbefehle geben o.ä., könnte das Programm nicht wie gewünscht
funktionieren. Man muss entweder solange warten bis die Strecke abgefahren wurde,
oder den Vorgang vorzeitig abbrechen.
Mit der Funktion
uint8_t isMovementComplete(void)
kann man überprüfen ob der Bewegungsvorgang abgeschlossen ist. Liefert die Funkti-
on false zurück, ist die Bewegung noch im Gange, andernfalls ist sie abgeschlossen
und es können neue Befehle gegeben werden.
Muss man die Bewegung vorzeitig abbrechen, weil z.B. ein Hindernis entdeckt wurde,
kann man mit der Funktion:
void stop(void)
alle Bewegungsabläufe abbrechen und den Roboter anhalten.
Jetzt könnte man die oben genannte Funktion sogar schon für das Rotieren um be-
stimmte Winkel verwenden, indem man einfach für den Richtungsparameter LEFT
oder RIGHT anstatt FWD oder BWD angibt und dann die Distanz angibt die zum ge-
wünschten Winkel passt. Das ist aber umständlich und funktioniert außerdem nicht
besonders gut. Daher gibt es eine eigene Funktion, die auf die Rotation auf der Stelle
zugeschnitten ist:
void rotate(uint8_t desired_speed, uint8_t dir, uint16_t angle,
uint8_t blocking)
Das funktioniert genau wie die move Funktion. Einziger Unterschied ist, dass die An-
gabe der zu fahrenden Distanz durch einen Winkel ersetzt worden ist. Auch das Ver-
halten dieser Funktion wird über den Parameter blocking gesteuert.
- 103 -