Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

1 - LEDs ein- und ausschalten

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
  • Trenne das Board von der Energiequelle, indem du den Power-Schalter auf dem BoE Shield Board auf 0 setzt.
  • Löse das USB-Kabel.
  • Im Batteriehalter befinden sich keine Batterien.
  • Baue die Schaltung nach dem Schaltbild bzw. dem Schaltungsaufbau auf dem Steckbrett auf.
  • Achte darauf, dass die Kathodenanschlüsse der LEDs mit GND verbunden sind. Von den beiden Anschlüssen ist es der kürzere Anschluss.

Schaltskizze und Schaltungsaufbau

(Courtesy of Parallax Inc.)

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:

  • Welche Pins sollen angesprochen werden?
  • Definiere, welcher Pin Ausgang und welcher Eingang wird.
  • Welche Aktion soll ausgeführt werden?

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
  • Übertrage das Programm LED_1 in den Editor und speichere es ab.
  • Starte das Programm.
  • Überprüfe, ob die beiden LEDs im Wechsel an und aus gehen.

2 - Zeitdiagramm

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?

(Courtesy of Parallax Inc.)

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
  • Verändere im Sketch das Argument im Befehl delay auf 250. Vergiss nicht, alle delay-Befehle gleich zu verändern.
  • Wie weit muss man das Argument im delay-Befehl absenken, bis der Eindruck entsteht, dass die LED nicht mehr blinkt?
  • Verändere das Programm so, dass beide LEDs gleichzeitig blinken. Variiere die Pausenzeiten für die Einschalt- und Ausschaltphase und schaue dir die LEDs an.
  • Wie müssen die Argumente im delay-Befehl gewählt werden, dass der Eindruck einer gedimmten LED entsteht?

  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.

  

Abbildung 1 - Zeitdiagramm eines Servos 100-mal verlangsamt

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
  • Übertrage das Programm Servo_1.ino in den Editor und speichere es ab.
  • Starte das Programm.
  • Überprüfe, ob die LED an P13 alle zwei Sekunden kurz aufleuchtet.

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
  • Erniedrige die Argumente in den delay-Befehlen um den Faktor 10 und speichere das Programm unter dem Namen Servo_1_10 ab. Aus delay(170) wird delay(17) und aus delay(1830) neu delay(183).
  • Starte das Programm.
  • Überprüfe, ob die LED an P13 jetzt deutlich schneller (genauer: 10-mal schneller) hintereinander kurz aufleuchtet.
  • Erniedrige die Argumente in den delay-Befehlen noch einmal um den Faktor 10 und speichere das Programm unter dem Name Servo_1_100 ab. Aus delay(17) wird gerundet delay(2) und aus delay(183)  gerundet neu delay(18).
  • Starte das Programm. Die LED sollte jetzt schwach leuchten, denn sie ist nur 2ms an und 9 mal länger, nämlich 18ms, ausgeschaltet.

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.

Abbildung 2 - Fenster Bibliotheksverwalter

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.

3 - Funktionen aus der Bibliothek Servo

  • attach()
    

Beschreibung

Verbindet die Servo-Variable mit einem Pin.

 

Syntax

servo.attach(pin) 

servo.attach(pin, min, max)

 

Parameter

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()
    
    

Beschreibung

Ü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).

 

Syntax

servo.write(angle)

 

Parameter

servo: Variable vom Typ Servo

angle: ein Wert zwischen 0 und 180

 

 

  • writeMicroseconds()
    
    

Beschreibung

Ü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.

 

Syntax

servo.writeMicroseconds(uS)

 

Parameter

servo: Variable vom Typ Servo

uS: der Wert des Parameters in µs (int)

 

 

  • read()
    
    

Beschreibung

Liest den aktuellen Winkel ein (der Wert, der mit der Funktion write() übertragen wurde).

 

Syntax

servo.read()

 

Parameter

servo: Variable vom Typ Servo

 

Rückgabewerte

Der Winkel des Servos; der Wert liegt zwischen 0 und 180 Grad.

 

  • attached()
    
    

Beschreibung

Überprüft, ob die Servo Variable einem Pin zugeordnet ist.

 

Syntax

servo.attached()

 

Parameter

servo: Variable vom Typ Servo

 

Rückgabewerte

True, wenn der Servo einem Pin zugeordnet wurde; sonst False.

 

  • detach()
    
    

Beschreibung

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.

 

Syntax

servo.detach()

 

Parameter

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.

  • Deklariere und benenne eine Instanz der Servo Bibliothek für jedes Signal, das übertragen werden soll. Füge sie zwischen #include und der setup-Methode ein.
    Servo servoLinks;
  • Benutze in der setup-Methode den Namen, den du in Schritt 2 vergeben hast. Schließe den Namen mit einem Punkt ab gefolgt von der attach-Funktion. Damit wird der Signal Pin verbunden. Im folgenden Beispiel wird dem System mitgeteilt, dass das Servosignal mit dem Namen servoLeft über den Pin 13 übertragen werden soll.
    servoLinks.attach(13);
  • Stelle die Pulszeit mit der writeMicroseconds Funktion ein. Dies kann sowohl in der setup- als auch der loop-Methode erfolgen.
    servoLinks.writeMicroseconds(1500);

4 - Servos kalibrieren

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
  • Übertrage das Programm Servo_2LRS_stop.ino in den Editor.
  • Stelle den Power-Schalter auf dem BoE-Shield in die Position 2.
  • Speichere das Programm und lade es in den Arduino.
  • Beginne mit dem Servo links und verstelle mit einem Schraubenzieher (Abb. 3) vorsichtig das Potentiometer im Servo so lange, bis sich das Rad nicht mehr dreht.
  • Wiederhole die Prozedur am rechten Servo.

Das Programm

Abbildung 3 - Drehe den Schraubenzieher vorsichtig so lange, bis die Drehbewegung der Räder stoppt.

5 - Pulsweite steuert Geschwindigkeit und Richtung

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).

(Courtesy of Parallax Inc.)
Aufgaben
  • Übertrage das Programm Servo_LS_max.ino in den Editor.
  • Markiere das linke Rad mit einem kleinen Tesastreifen, um später die Umdrehungen des Rades zu kontrollieren.
  • Speichere das Programm und lade es in den Arduino.
  • Miss die Anzahl der Umdrehungen, die das Rad in 10 Sekunden macht. Multipliziere diesen Wert mit 6 und du kommst auf die Umdrehungen pro Minute (UpM). Liegt der Wert zwischen 50 und 60?

Programm Servo_LS_max.ino

Jetzt kommst du! - Maximale Umdrehung für das rechte Rad bestimmen

Aufgaben
  • Schreibe ein Programm Servo_RS_max.ino, das das rechte Rad mit maximaler Geschwindigkeit im Uhrzeiger drehen lässt. Die Impulslänge muss 1,7ms betragen. Die Pinnummer ist 12.
  • Markiere das rechte Rad mit einem kleinen Tesastreifen, um später die Umdrehungen des Rades zu kontrollieren.
  • Speichere das Programm und lade es in den Arduino.
  • Miss die Anzahl der Umdrehungen, die das Rad in 10 Sekunden macht. Multipliziere den Wert mit 6 und du kommst auf die Umdrehungen pro Minute (UpM). Liegt der Wert zwischen 50 und 60?

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
  • Übertrage das Programm Servo_Gegenlfg.ino in den Editor und speichere es ab.
  • Lade das Programm in den Arduino.
  • Überzeuge dich, dass sich die Servos gegenläufig drehen.

Programm

6 - Kombinationen von Pulsweiten beim Servoantrieb

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
  • Speichere das Programm Servo_Gegenlfg.ino unter dem neuen Namen Servo_Kombi.ino ab.
  • Verändere in den Programmzeilen mit den Befehlen writeMicroseconds die Zeitenargumente, wie in der folgenden Tabelle angegeben. Beginne mit 1700 und 1300.
  • Drucke dir die folgende Tabelle aus.
  • Starte das Programm und beobachte die Bewegung der Räder. Ergänze die Felder in der Tabelle.
  • Gehe alle Kombinationen der Liste durch.

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.

  1. Man erkennt sehr schnell, bei welcher Pulsweite der Servo welche Rotationsgeschwindigkeit hat.
  2. Bei einer Pulsweite zwischen 1300 und 1400µs ändert sich die Rotationsgeschwindigkeit kaum; ein Servo arbeitet bei 1300µs an seiner Leistungsgrenze und ist überreguliert. Das geht auf Kosten seiner Lebensdauer. Ähnliches gilt auch für den Bereich zwischen 1600 und 1700µs.
  3. Zwischen 1400 und 1600µs haben wir eine fast lineare Abhängigkeit zwischen Rotationsgeschwindigkeit und Pulsweite. Servos sollten in diesem Bereich betrieben werden.

7 - Rotationsgeschwindigkeiten eines Servos bestimmen

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
  • Klebe einen Markierungsstreifen auf das rechte Servorad.
  • Kippe den BoE-Shield Bot so, dass er hochkant steht und die Räder frei drehen können.
  • Übertrage das Programm Servo_Rotationsv.ino in den Editor, speichere es ab und starte es.
  • Öffne den seriellen Monitor und wähle Kein Zeilenende und 9600 Baud unten rechts im Monitorfenster.
  • Klicke in das Fenster Übertragen des Terminals und gib einen beliebigen Buchstaben ein. Klicke auf den Button Senden.
  • Bestimme die Anzahl der Umdrehungen des Rades und multipliziere den Wert mit 10. Achte auch auf die Drehrichtung. Notiere die Messwerte.
  • Übertrage am Ende der Messung alle Messwerte in ein Diagramm. Trage auf der Rechtsachse die Pulsweite und auf der Hochachse die Geschwindigkeit an.

Das Programm Servo_Rotationsv.ino

Terminalfenster oder serieller Monitor

Terminalfenster

Kommentar schreiben

Kommentare

  • olaf (Sonntag, 10. Dezember 2017 08:35)

    wow...die mit Abstand beste Site, die ich bisher zu diesem Thema gesehen habe :-))
    Vielen Dank dafür. Hilft super beim Erklären!!

  • David Eisenblätter (Sonntag, 11. Februar 2018 13:38)

    Sehr schön erklärt, und zufällig heute, wo ich nochmal nach einer detailierten Gedankenstütze diesbezüglich gesucht habe!

    Vielen vielen Dank!

    David.

Bitte geben Sie den Code ein
* Pflichtfelder
Druckversion Druckversion | Sitemap
© Reinhard Rahner - Gettorf