Einen Arduino-Roboter bauen und testen
Einen Roboter mit einem Arduino bauen, der später auch selbständig einer Linie folgen kann, ist nicht sehr schwer. Wenn Sie die Inhalte aus dem Bereich Arduino durchgearbeitet haben, sollten Sie in der Lage sein einen Roboter mit zwei Motoren und einigen Tastern und LEDs aufzubauen. Hierfür kann entweder aus Acrylglas oder Sperrholz ein Chassis selber gefertigt werden oder es kann im Internet ein fertiges Chassis mit zwei geeigneten Motoren gekauft werden (Suchbegriff: roboter chassis 2wd).
Eine mögliche Schaltung für einen Roboter mit zwei Tastern, drei (Status-)LEDs und dem Motortreiber DRV8833 ist im Folgenden abgebildet. Achten Sie auf die externe Spannungsversorgung der Motoren.
Bauteilliste
Bauteil | Anzahl |
---|---|
Arduino (Uno) | 1 |
LED | 3 |
Taster | 2 |
Widerstand 220 Ohm | 3 |
Motortreiber DRV8833 | 1 |
TT - Motor mit Räder | 2 |
Chassis (z.B. Acrylplatte) | 1 |
Batteriehalter mit 4 AA Batterien | 1 |
9V Block mit Anschlusskable | 1 |
Steckbrett (half size) | 1 |
Verbindungskabel | ca. 10 |
Grundfunktion zur Geschwindigkeitssteuerung
Bevor der Roboter verschiedene einfache Aktionen (Kreis oder Viereck) ausführen kann, ist es sinnvoll, wenn eine Funktion zum Steuern der Geschwindigkeit programmiert wird. Die Funktion, nennen wir sie setSpeeds()
oder setzeGeschwindigkeit()
, sollte zwei Parameter int pPwmLinks
und int pPwmRechts
haben, welche Werte im Bereich von -255
bis 255
akzeptieren. Die beiden Parameter geben als PWM-Wert die Geschwindigkeiten der beiden Motoren an, wobei ein negativer Wert bedeutet, dass sich der entsprechende Motor rückwärts dreht.
Damit die Funktion setSpeeds()
bzw. setzeGeschwindigkeit()
die Motoren auch in beide Richtungen drehen lassen kann, muss der Motortreiber in Abhängigkeit vom Vorzeichen der Parameter im korrekten Betriebsmode für Vorwärts- oder Rückwärtslauf konfiguriert werden.
Das Gerüst der Funktion könnte wie folgt aussehen:
void setSpeeds(int pPwmLinks, int pPwmRechts){
// --------- Linker Motor ---------
if (pPwmLinks < 0) // rückwärts
{
// abs() ist die Betragsfunktion, die aus dem negativen `pPwmLinks` einen positiven Wert macht
speedRight = abs(pPwmLinks);
digitalWrite(IN1, LOW);
analogWrite(IN2, pPwmLinks);
}
else if (pPwmLinks > 0) // vorwärts
{
// Konfiguration des Motortreibers
// für eine geänderte Drehrichtung ...
}
else { // Motorbremse
// Konfiguration des Motortreibers
// für die Motorbremse ...
}
// --------- Rechter Motor ---------
if (pPwmRechts < 0) // rückwärts
{
// ...
}
else if (pPwmRechts > 0) // vorwärts
{
// ...
}
else { // Motorbremse
// ...
}
}
Mit diesem Programmgerüst kann der Roboter schon einige Aufgaben durchführen. Damit er aber auch mit seiner Umwelt interagieren kann und zum Beispiel als Linienfolger genutzt werden kann, ist es notwendig den Roboter um einen IR-Sensor zu erweitern.
Aufgaben
Für die folgenden Aufgaben wird ein Roboter mit Differentialantrieb (differential drive), also ein Roboter mit zwei unabhängig steuerbaren Rädern vorausgesetzt. Zusätzlich sollte der verwendete Roboter mindestens zwei Taster und zwei oder mehr LEDs aufweisen. Weitere Sensoren werden an dieser Stelle nicht benötigt.
Aufgaben
Bei der ersten Aufgabe geht es darum, den Roboter sicher losfahren und wieder stoppen zu lassen. Programmieren Sie einen Taster so, dass beim ersten Drücken des Tasters der Roboter losfährt und beim erneuten Drücken stoppt. Wenn der Roboter fährt, soll zusätzlich eine (grüne) LED aufleuchten. Berücksichtigen Sie das Prellen des Tasters.
Schreiben Sie ein Programm, welches den Roboter genau 1,5 Meter eine gerade Linie fahren lässt. Schreiben Sie hierfür eine eigene Funktion
setSpeed(int pLeft, int pRight)
, welche die Geschwindigkeit der beiden Motoren steuert.- Notieren Sie das Tastverhältnis des PWM-Signals, ab welchem die Motoren sich zu drehen anfangen.
- Nutzen Sie einen Kalibrierungsfaktor für die beiden Motoren, damit der Roboter bei gleichen PWM-Werten (für
pLeft
undpRight
) geradeaus fährt. Überlegen Sie sich ein Experiment zum Bestimmen des Kalibrierungsfaktors. - Testen Sie, ob der Kaliebrierungsfakter auch bei anderen Geschwindigkeiten funktioniert.
float motorKalibrierung = 0.95; // Werte zwischen 1.1 und 0.9 sollten funktionieren
void setSpeed(int pLinks, int pRechts)
{
int lPwmLinks = pLinks; // PWM-Wert für den linken Motor
int lPwmRechts = motorKalibrierung * pRechts; // PWM-Wert für den rechten Motor
/*
Code für die Motorsteuerung mit dem Motortreiber ...
*/
}Schreiben und testen Sie verschiedene Programme, welche folgende Aktionen ausführen. Nutzen Sie jeweils die selber geschriebene Funktion
setSpeeds()
.- Der Roboter fährt genau 1,5 Meter geradeaus. Dabei beschleunigt er zu erst und bremst dann kontinuierlich ab.
- Der Roboter fährt einen Kreis mit einem Durchmesser von ca. einem Meter. Schreiben Sie hierfür eine Funktion
void fahreKreis(int pZeit)
, welche den Roboter für die angegebene Zeit einen Kreis fahren lässt. - Der Roboter fährt ein Quadrat mit einer Kantenlänge von ca. einem Meter. Beginnen Sie diese Aufgabe, in dem Sie eine Funktion
void drehen(int pZeit)
schreiben, welche den Roboter für die angegebene Zeit auf der Stelle drehen lässt. Programmieren Sie anschließend eine Funktionvoid fahreRechteck(int pZeitKantenlaenge)
, welche die Funktionvoid drehen(int pZeit)
verwendet, um den Roboter ein Rechteck mit der angegebenen Kantenlänge fahren lässt. - Der Roboter fährt eine Acht.
- Der Roboter zeichnet (wenn möglich mit Stift), das Haus vom Nikolaus. Erweitern Sie hierfür das Programm für das Rechteck.
Die Start- und Endpunkte sollten (wenn möglich) nahe beieinander liegen.
Erweitern Sie den Roboter um drei Taster und zwei bis vier LEDs (7 Segementanzeige oder Display ist auch möglich). Schreiben Sie für den Roboter eine Menüsteuerung, bei der mit zwei Tastern eine aus vier verschiedene Roboteraktionen der 3. Aufgabe ausgewählt und mit den dritten Taster aktiviert werden kann. Die LEDs sollen entsprechend der ausgewählten Funktionen unterschiedlich leuchten.
Der Eintrag Menüsteuerung kann Ihnen bei der Realisierung helfen.