Material |
1x BoE-Shields für Arduino 1x Arduino UNO 1x USB-Kabel 1x Steckernetzteil 2x LED rot 2x Widerstand – 220 Ohm (rot-rot-braun) 3x Steckdraht |
Aufgaben |
|
Schaltskizze und Schaltungsaufbau
Auf dem BoE-Shield für Arduino befinden sich in der oberen Steckleiste ganz rechts mehrere Anschlussbuchsen mit der Aufschrift 5V und in der unteren schwarzen Steckleiste ganz links mit der Beschriftung GND. Die Elektronik auf dem BoE-Shield stellt über diese Buchsen eine separate Spannungsversorgung bereit.
Im nächsten Schritt sollen die LEDs an P13 und P12 so programmiert werden, dass sie gegenläufig im Sekundentakt blinken. Die Vorgehensweise beim Arduino verläuft immer nach dem gleichen Schema:
Schritt eins wird über die Befehle
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
umgesetzt. Diese Befehle werden in der Methode void setup() aufgerufen, die nur einmal beim Start des Programms durchlaufen wird.
Die auszuführenden Aktionen sind: eine LED ein- bzw. ausschalten und eine Pause einlegen. Das gelingt mit den Befehlen
digitalWrite(13, HIGH);
digitalWrite(12, LOW); delay(500);
Dies sind die immer wiederkehrenden Ereignisse. Sie gehören deshalb in die Methode void loop().
Das komplette Programm sieht nun wie folgt aus:
Das Programm LED_1.ino
Aufgaben |
|
In einem Zeitdiagramm werden HIGH- und LOW-Zustände über der Zeitachse aufgetragen. Im folgenden Zeitdiagramm ist für eine der beiden LEDs ein Ausschnitt von 1000ms dargestellt. Fällt dir auf, wie mit dem Befehl delay(500) die Blinkrate gesteuert wird?
Jetzt kommst du! – Experimentiere mit der Blinkrate beider LEDs
Wie lässt sich die Blinkrate verdoppeln? Was passiert, wenn man das Argument im delay-Befehl halbiert?
Aufgaben |
|
Die HIGH- und LOW Signale, mit denen man einen Servo steuert, müssen sehr genau im Zeitverhalten sein. Er reagiert auf die Zeitdauer eines anliegenden HIGH-Signals; es enthält für ihn die Information, wie schnell und in welcher Richtung der Motor sich drehen soll. Das Zeitdiagramm (Abb. 1) zeigt ein Servosignal, das die Antriebsräder des Shield-Arduino Bots mit full-speed entgegen dem Uhrzeigersinn antreibt mit einer Ausnahme: alle Signale dieses Zeitdiagramms dauern 100-mal länger als sie tatsächlich bei einem Servo anliegen. Bei dieser herabgesetzten Geschwindigkeit können wir besser verstehen, was eigentlich vor sich geht.
Programmbeispiel
Material |
1x Boe-Shield Bot für Arduino 1x Steckernetzteil 1x USB-Kabel 1x LED rot 1x Widerstand 220 Ohm (rot-rot-braun) |
Aufgaben |
|
Schaltskizze und Schaltungsaufbau
Wie in Der BoE-Shield Bot – LEDs ein- und ausschalten beschrieben.
Das Programm Servo_1.ino
Jetzt kommst du!
Das Programm Servo_1.ino signalisiert über die LED im Zeitlupentempo wie lange ein HIGH-Signal gefolgt von einem LOW-Signal am Servo anliegen muss um ihn zum Laufen zu bringen. Im folgenden Schritt wird das Zeitverhalten zweimal um den Faktor 10 erniedrigt.
Aufgaben |
|
Das Zeitverhalten im Programm Servo_1_100.ino kommt dem Zeitdiagramm für einen schnell drehenden Servo schon sehr nahe. Der HIGH-Impuls ist im Programm 2ms lang, sollte aber tatsächlich am schnell drehenden Servo bei 1,7ms liegen. Wie man dies programmtechnisch einfach einstellen kann, werden wir jetzt zeigen.
Dazu muss eine sogenannte Bibliothek vorher in das Arduino Programm eingebunden werden, die zusätzliche Befehle für das Arbeiten mit Servos bereitstellt. Der Name dieser Bibliothek ist Servo. Standardmäßig sind schon einige Bibliotheken in den Arduino Editor eingebunden. Um zu überprüfen, ob dies auch für Servo zutrifft, wähle im Hauptmenü Sketch – Bibliothek einbinden – Bibliotheken verwalten … Es öffnet sich ein Fenster Bibliotheksverwalter, in dem überprüft werden kann, ob diese Bibliothek bereits installiert ist.
Im Arduino Editor Version 1.6.9 ist die Programmbibliothek Servo bereits installiert. Über Hilfe – In der Referenz suchen … - Libraries erhält man weitere Informationen zur Servo-Bibliothek.
attach()
Verbindet die Servo-Variable mit einem Pin.
Syntax
servo.attach(pin)
servo.attach(pin, min, max)
servo: Variable vom Typ Servo
pin: Pinnummer, die mit dem Servo verbunden ist.
min (optional): Pulsweite in µs, die mit dem kleinsten Winkelmaß (0°) des Servos übereinstimmen (Voreinstellung: 544)
max (optional): Pulsweite in µs, die mit dem größten Winkelmaß (180°) des Servos übereinstimmen (Voreinstellung: 2400).
write()
Überträgt einen Wert an einen Servo und steuert damit entsprechend seine Drehachse. Bei einem Standardservo wird damit der Winkel beschrieben, um den sich die Achse dreht (in Grad). Bei einem Freilaufservo wird damit die Geschwindigkeit eingestellt (0 bedeutet full-speed in einer Richtung, 180 full-speed in entgegengesetzter Richtung; ein Wert um 90 bedeutet dann keine Bewegung).
servo.write(angle)
servo: Variable vom Typ Servo
angle: ein Wert zwischen 0 und 180
writeMicroseconds()
Überträgt einem Wert in µs an einen Servo und steuert damit entsprechend seine Drehachse. Bei einem Standardservo wird damit der Drehwinkel der Achse beschrieben. Die Mittelstellung wird durch den Wert 1500, die maximale Linksstellung durch 1000 und die maximale Rechtsstellung durch 2000 beschrieben.
Hersteller bedingt kann es davon Abweichungen geben. Die Werte bewegen sich dann zwischen 700 und 2300. Dies sollte im Einzelfall vorsichtig ausprobiert werden.
Freilaufservos reagieren auf diesen Befehl in analoger Weise zur write-Funktion.
servo.writeMicroseconds(uS)
servo: Variable vom Typ Servo
uS: der Wert des Parameters in µs (int)
read()
Liest den aktuellen Winkel ein (der Wert, der mit der Funktion write() übertragen wurde).
servo.read()
servo: Variable vom Typ Servo
Der Winkel des Servos; der Wert liegt zwischen 0 und 180 Grad.
attached()
Überprüft, ob die Servo Variable einem Pin zugeordnet ist.
servo.attached()
servo: Variable vom Typ Servo
True, wenn der Servo einem Pin zugeordnet wurde; sonst False.
detach()
Löst die Zuordnung einer Servo Variablen zu einem Pin. Sind alle Servo Variable gelöst, lassen sich die Pin 9 und 10 mit der Funktion analogWrite() als PWM Output benutzen.
servo.detach()
servo: Variable vom Typ Servo
Gesteuert werden Freilaufservos mit HIGH-Impulsen, die sie in gleichmäßigen Zeitabständen erhalten. Bleibt ein solcher Impuls aus, stoppt die Drehbewegung. Sobald in einem Sketch die Funktionen zum Betreiben eines Servos aufgerufen worden sind, laufen sie im Hintergrund weiter, während die Arbeit mit Sensoren u.a. weiter vorangetrieben werden kann. In regelmäßigen Abständen wird durch Interrupts überprüft, ob andere Aufgaben auszuführen sind, während die Servos ihre Arbeit weiterhin verrichten.
Es sind vier Schritte notwendig, um mit Hilfe der Servo-Bibliothek Steuersignale zu übertragen.
Teile dem Arduino Editor mit, dass du Zugriff auf die Servo Bibliotheksfunktion haben möchtest. Dazu muss zu Beginn eines Sketches die Zeile
#include <Servo.h>
eingefügt werden.
Zum Kalibrieren eines Servos muss an diesen ein Signal von 1,5ms (Ruhestellung) geschickt werden. Schauen wir uns das zugehörige Zeitdiagramm an. Es liegt gleichweit entfernt vom 1.7ms Signal für eine full-speed Drehung entgegen dem Uhrzeigersinn, wie vom 1,3ms Signal für eine full-speed Drehung im Uhrzeigersinn.
Material |
1x BoE-Shield Bot mit Arduino UNO 1x Schraubenzieher |
Aufgaben |
|
Das Programm
Das folgende Zeitdiagramm zeigt einen mit full-speed im Uhrzeigersinn drehenden Servo, der mit Pulsweiten von 1,3ms angesteuert wird. Full-speed bedeutet für einen Parallax-Freilaufservo 50 bis 60 Umdrehungen pro Minute (UpM).
Aufgaben |
|
Programm Servo_LS_max.ino
Jetzt kommst du! - Maximale Umdrehung für das rechte Rad bestimmen
Aufgaben |
|
Programmbeispiel - Beide Servos drehen gegenläufig
Bei einem Roboter müssen wir in der Lage sein beide Servos gleichzeitig ansteuern zu können, um eine problemfreie Navigation zu gewährleisten. Im folgenden Programm machen wir uns noch einmal klar, dass bei einem Vorwärtslauf der eine Servo links, der andere rechts herum dreht.
Aufgaben |
|
Programm
Die Bewegung eines Roboters wird gesteuert durch die Paramterwerte im Befehl writeMicroseconds. Es gibt eine Vielzahl unterschiedlicher Kombinationen zwischen dem rechten und linken Antriebsrad; mit der nachfolgenden Tabelle bekommst du sehr schnell ein Gefühl dafür, wie sich der Roboter bei den unterschiedlichen Parametereinstellungen bewegen wird. Teste jede der aufgeführten Einstellungen am BoE-Shield-Bot aus und trage deine Beschreibungen und das Verhalten des Robots in der Tabelle ein.
Aufgaben |
|
Programmbeispiel zur Laufzeit
Die Laufzeit der beiden Antriebsservos wird über den Befehl delay gesteuert. Im folgenden Programmbeispiel drehen sich beide Räder zuerst in Uhrzeigerrichtung. Es folgt eine Pause von 3s. Anschließend drehen die Räder entgegen der Uhrzeigerrichtung, gefolgt von einer 3s Pause. Danach passiert (hoffentlich) nichts. Die Räder sollten still stehen. Probiere es aus.
Test zur Geschwindigkeitsregelung
Das folgende Diagramm zeigt die Abhängigkeit der Rotationsgeschwindigkeit eines Servos (UpM) von der Pulsweite in Mikrosekunden. Die Drehbewegung im Uhrzeiger wird mit Negativ-, entgegen dem Uhrzeigersinn mit Positivwerten dargestellt. Die Rotationsgeschwindigkeit liegt zwischen +48 und -48 UpM bei einem Pulsweitenbereich von 1300 bis 1700µs.
Aus dem Graphen lassen sich einige Informationen herauslesen.
Mit dem folgenden Programm werden Rotationsgeschwindigkeiten des rechten Servos gemessen. Gestartet wird mit einer Pulsweite von 1375µs; in Schritten von je 25µs wird bei jedem Durchlauf die Rotationsgeschwindigkeit des Servos gemessen. Dazu wird auf dem Gummi des Rades mit Tesa ein schmaler Papierstreifen aufgeklebt, der als Orientierung dient, um die Anzahl der Umdrehungen auszählen zu können. Jeder Durchlauf dauert 6 Sekunden. Die ermittelte Anzahl an Umdrehungen muss mit 10 multipliziert werden, um auf die Einheit UpM (Umdrehungen pro Minute) zu kommen.
Aufgaben |
|
Das Programm Servo_Rotationsv.ino
Terminalfenster oder serieller Monitor