Zum Hauptinhalt springen

Erste Schritte mit dem Zumo 32u4 und 3pi+ 32u4

Nachdem der Treiber und die Bibliothek installiert worden sind, kann der Zumo 32u4 oder auch der 3pi+ 32u4 programmiert werden. Da beide Roboter auch mit Arduino programmiert werden, ist der Einstieg nicht besonders schwer. Allerdings gibt es einige neue Befehle, welche zur Steuerung des Roboters notwendig sind. In der vereinfachten Befehlsreferenz finden Sie eine Übersicht der wichtigsten Befehle. Schauen Sie sich die Referenz immer mal wieder an, um sich mit den Programmiermöglichkeiten der Roboter vertraut zu machen.

tip

Eine Zusammenfassung aller wichtigen Befehle gibt es für beide Roboter auch als Cheat Sheet:

Für einen schnellen Einstig und als guten Überblick über die Grundfunktionen lernen Sie im folgenden Beispiel Methoden zum Steuern der

kennen. Nach diesem Schnelleinstieg sollten Sie mithilfe der Befehlsreferenz in der Lage sein auch Sensoren (Bodensensor, Hindernisssensor) in Ihr Programm einzubinden. Erläuterungen finden Sie als Kommentar im Code oder etwas ausführlicher weiter unten.

Einbinden der Bibliothek

Die Befehle zum Steuern des Zumo 32u4 (bzw. 3pi+ 32u4) befinden sich in der Zumo 32u4 Arduino Library (bzw. 3pi+ Bibliothek). Diese Bibliothek muss einmal auf dem Rechner installiert werden und wird dann mit der folgenden Befehlszeile in einem Arduino-Programm eingebunden (noch vor der setup() Methode):

// Zumo 32u4
#include <Zumo32U4.h> // Zuerst die Bibliothek einbinden

void setup(){
// ...
}

Nur wenn die jeweilige Bibliothek korrekt installiert und in das Programm eingebunden wurde, können die unten aufgeführten Befehle verwendet werden.

LEDs

Zum Steuern der drei LEDs steht jeweils eine eigene Funktion zur Verfügung: ledRed(), ledYellow(), ledGreen(). Als Argument wird der Zustand der LED, als 0 für aus oder 1 für an übergeben.

// Blinkender Zumo
#include <Zumo32U4.h> // Einbinden der ZUMO Bibliothek

void setup(){
// ohne Inhalt
}

void loop(){
ledRed(1); // rote LED einschalten
ledGreen(0); // grüne LED ausschalten
delay(1000);

ledRed(0); // rote LED ausschalten
ledGreen(1); // grüne LED ansschaltens
delay(500);
}
Aufgaben
  1. Lassen Sie eine oder mehrere LEDs ohne den delay() Befehl blinken. Verwenden Sie die millis() Funktion.

Taster

Für die Nutzung der Taster werden drei Klassen (Zumo32U4ButtonA, Zumo32U4ButtonB, Zumo32U4ButtonC beim Zumo und ButtonA, ZButtonB, ButtonC beim 3pi+) bereitgestellt. Nach dem Erzeugen des entsprechenden Objektes stehen verschiedene Methoden zum Auslesen der Taster bereit.

Zumo32U4ButtonA buttonA;  // Objekt für den Taster A

Zum Beispiel wird mit dem Befehl waitForButton() die Programmausführung solange unterbrochen, bis der entsprechende Taster gedrückt würde. Ähnlich wie mit dieser while-Schleife.

// Blinken nach Tasterdruck
#include <Zumo32U4.h> // Einbinden der ZUMO Bibliothek

Zumo32U4ButtonA buttonA; // Objekt für den Taster A

void setup(){
ledRed(1);
buttonA.waitForButton(); // Programm wartet, bis Taster A gedrückt wurde
ledRed(0);
}

void loop(){
ledGreen(1); // LED einschalten
delay(1000);

ledGreen(0); // LED ausschalten
delay(500);
}

Die Methode isPressed() gibt true zurück, wenn der Taster gedrückt ist, ansonsten false. Diese Methode ist nicht entprellt. Die Methode eignet sich besonders um in Abhängigkeit der Taster Aktionen ausführen zu lassen. Hierfür wird die Methode mit eine if-else Verzweigung kombibiert.

if ( buttonA.isPressed() ){
// tue etwas, wenn der Taster A gedrückt wurde ...
}
Aufgaben
  1. Die rote LED soll immer, nachdem der Taster A gedrückt wurde drei Mal kurz aufblinken. Verwenden Sie die buttonA.waitForButton() Funktion.
  2. Die drei LEDs (rot, grün, gelb) sollen mit den Tastern A,B und C gesteuert werden. Wenn der Taster A (bzw. B und C) gedrückt ist, soll die gelbe (bzw. grüne und rote) LED aufleuchten. Ist der entsprechende Taster nicht gedrückt, ist die LED aus. Verwenden Sie die Funktion isPressed().

Spannungsversorgung

Da der Zumo 32u4 und der 3pi+ keine Schaltung zum Ausschalten bei geringer Batteriespannung haben, sollte die Versorgungsspannung (insbesonders bei Verwendung von Akkus) bei jedem Start überprüft werden. Das Tiefentladen von Akkus schädigt die Akkus und kann bei zu starker Entladung zum Ausfall der Akkus führen.

Zum Messen der Batteriespannung kann die Funktion int readBatteryMillivolts() verwendet werden, welche die aktuelle Batteriespannung in Millivolt zurückgibt.

// Zumo 32u4 / 3pi+
int spannung = readBatteryMillivolts(); // Batteriespannung in mV einlesen
Aufgaben
  1. Schreiben Sie eine Funktion, welche die void setup() Funktion von Arduino nur dann beenden lässt, wenn die Batteriespannung größer als 4,4 Volt ist. Ist die Spannung kleiner, wird die rote LED angeschaltet und die void loop() Funktion wird nicht aufgerufen.

Motoren

Für die Motoren steht die Klasse Zumo32U4Motors zur Verfügung. Die wichtigste Methode zum Steuern der beiden Motoren ist setSpeeds(int left, int right). Die Argumente geben jeweils die Drehgeschwindigkeit der beiden Motoren an. Die erlaubten Werte liegen im Bereich von -400 bis 400.

// Drehender Zumo
#include <Zumo32U4.h> // Einbinden der ZUMO Bibliothek

Zumo32U4ButtonA buttonA; // Objekt für den Taster A
Zumo32U4Motors motors; // Objekt für die Motoren

void setup(){
ledGreen(1);
buttonA.waitForButton(); // Programm wartet, bis Taster A gedrückt wurde
ledGreen(0);
}

void loop(){
motors.setSpeeds(-200, 200); // auf der Stelle drehen
delay(1000);

motors.setSpeeds(0, 0); // Motoren stoppen
delay(500);

motors.setSpeeds(200, -200); // auf der Stelle drehen
delay(1000);
}
caution

Die Geschwindigkeit der Motoren wird mit Werten zwischen -400 und +400 eingestellt. Beim 3pi+ führen Werte von über 150 bereits zu sehr hohen Geschwindigkeiten.

Aufgaben
  1. Lassen Sie den Roboter, immer nachdem ein beliebiger Taster gedrückt wurde, einen Kreis mit einem Durchmesser von ca. 30 cm fahren. Start und Zielpunkt des Roboters sollen an der gleichen Stelle liegen.

LCD Display (Zumo)

Auf dem Roboter befindet sich ein einfaches LCD-Display für 8x2 Zeichen. Im nachfolgenden Beispiel sind die wichtigsten Methoden zum Ansteuern des Displays beschrieben.

/* Einfaches Beispiel für das LCD Display*/

#include <Zumo32U4.h>

Zumo32U4LCD lcd; // Objekt für das LCD-Display
Zumo32U4ButtonA buttonA; // Objekt für den Taster A
int counter = 0;

void setup()
{
lcd.clear(); // Löscht das Display und setzt den Cursor nach oben links (0,0).
lcd.print("Hey,"); // Gibt Text aus. Alter Text wird überschrieben.
lcd.gotoXY(0, 1); // Setzt den Cursor auf die angegebenen xy-Koordinaten.
lcd.print("drueck A");
buttonA.waitForButton(); // Warten auf Taster A.

lcd.clear();
lcd.print("Zaehler"); // Keine Umlaute verwenden.
}

void loop()
{
lcd.gotoXY(0, 1); // Setzt den Cursor (X,Y): 1. Stelle, 2. Zeile,
lcd.print(counter); // Gibt den Wert der Variablen aus.
counter++;
delay(100);
}

Oled Display (3pi+)

Der 3pi+ verfügt im Gegensatz zum Zumo über ein OLED Display mit 128x64 Pixeln. Für die Nutzung des Displays stellt Pololu eine Bilbiothek zur Verfügung, welche automatisch durch die Bilbiothek des 3pi+ (Pololu3piPlus32U4.h) geladen wird.

Standardlayout

In dem folgenden Beispiel werde die Grundfunktionen in Standardauflösung des OLED-Displays verwendet. Die verwendenten Befehle sind die selben wie beim LCD Display.

/* Einfaches Beispiel für das OLED Display */

#include <Pololu3piPlus32U4.h>
using namespace Pololu3piPlus32U4;

OLED oled; // Objekt für das LCD-Display
int counter = 0;

void setup()
{
oled.clear(); // Löscht das Display und setzt den Cursor nach oben links (0,0).
oled.print("Hallo"); // Gibt Text aus. Alter Text wird überschrieben.
delay(1000);
oled.clear();
oled.print("Zaehler"); // Keine Umlaute verwenden.
}

void loop()
{
oled.gotoXY(0, 1); // Setzt den Cursor (X,Y): 1. Stelle, 2. Zeile,
oled.print(counter); // Gibt den Wert der Variablen aus.
counter++;
delay(100);
}

Layout konfigurieren

Das OLED Display erlaubt neben der Standardeinstellung mit 8x2 Zeichen auch die Verwendung von kleineren Schrifteire und damit auch die Ausgabe von mehr Text.

  • setLayout8x2(): 8 Zeichen in 2 Zeilen (Standard)
  • setLayout11x4(): Die selbe Schriftgröße wie setLayout8x2(), aber mit 11 Zeichen in 4 Zeilen
  • setLayout21x8(): Kleinere Schriftgröße mit 21 Zeichen in 8 Zeilen.
/* Umschalten des Layouts beim OLED-Display */
#include <Pololu3piPlus32U4.h>
using namespace Pololu3piPlus32U4;

OLED oled; // Objekt für das LCD-Display
ButtonA buttonA; // Objekt für den Taster A

void setup(){ }

void loop()
{
oled.setLayout8x2(); // Umschalten auf 2 Zeilen, 8 Zeichen pro Zeile
oled.clear();
oled.print("8x2");
oled.gotoXY(0, 1);
oled.print("Taster A");
buttonA.waitForButton(); // Warten auf Taster A.

oled.setLayout11x4(); // Umschalten auf 4 Zeilen, 11 Zeichen pro Zeile
oled.clear();
oled.print("11x4");
oled.gotoXY(0, 3);
oled.print("Taster A");
buttonA.waitForButton(); // Warten auf Taster A.

oled.setLayout21x8(); // Umschalten auf 8 Zeilen, 21 Zeichen pro Zeile
oled.clear();
oled.print("Layout 21x8");
oled.gotoXY(0, 7);
oled.print("Taster [A] druecken");
buttonA.waitForButton(); // Warten auf Taster A.
}

Zusammenfassende Aufgaben

Aufgaben
  1. Vervollständigen Sie das unten gegebene Programm (Vorlage Aufgabe 1) so, dass der Roboter die angegeben Aufgaben ausführt.
  2. Schreiben Sei eine Funktion void drehen(in grad), welche den Roboter um die angegebene Gradzahl drehen lässt. Ein negativer Winkel soll eine Drehung nach rechts und ein positiver Winkel eine Drehung nach links verursachen. Verwenden Sie die Funktion, um den Roboter das Haus vom Nikolaus fahren zu lassen.
  3. Erstellen Sie sich eine eigene Befehlsreferenz mit Word oder OpenOffice. Notieren Sie sich zu jedem Befehl auch eine eigenes Beispiel.
Vorlage Aufgabe 1 (3pi+)
/* Vervollständigen Sie die Vorlage mit den angegebenen Funktionen */

#include <Pololu3piPlus32U4.h> // Bibliothek für den 3pi+
using namespace Pololu3piPlus32U4; // Vereinfachter Zugriff auf die Bibliothek

oled oled; // OLED Display
ButtonA buttonA; // Taster A
ButtonB buttonB; // Taster B
ButtonC buttonC; // Taster C
Motors motors; // Motoren

int leftSpeed = 80; // Werte zwischen -400 ... +400
int rightSpeed = 80;

void setup() {
oled.setLayout21x8();
oled.clear();
oled.print("A B C");
}

void loop() {
if ( buttonA.isPressed() ) { // Abfrage, ob Taster gedrückt wurde
// - gelbe LED anschalten, Textausgabe "gerade"
// - 0,5 Sekunden warten
// - 50 cm geradeaus fahren
// - gelbe LED ausschalten, Menü anzeigen "A B C"
}
else if (buttonB.isPressed()) {
// - grüne LED anschalten, Textausgabe "beschleunigen"
// - 0,5 Sekunden warten
// - den Roboter (ca. 1 Sekunde) auf Maximalgeschwindigkeit beschleunigen
// - den Geschwindigkeit wieder (ca. 1 Sekunden) bis zum Stillstand verringern
// - grüne LED ausschalten, Menü anzeigen "A B C"
}
else if (buttonC.isPressed()) {
// - rote LED anschalten, Textausgabe "Viereck"
// - 0,5 Sekunden warten
// - den Roboter ein möglichst exaktes Quadrat fahren lassen (ca. 20cm x 20cm)
// - Start und Ziel sollen identisch sein
// - rote LED ausschalten, Menü anzeigen "A B C"
}
}