Ziel dieses Projektes ist es, dass Ihr ein Fahrzeug baut, dass Hinternissen von alleine ausweicht.
Fertige zunächst ein Mindmap darüber an, was Du alles für dieses Projekt benötigst.
So, nach der nötigen Vorbereitung geht es jetzt los. Allerdings sollten wir uns zuerst um den Arduino kümmern. Das Fahrzeug werden wir erst ganz am Schluss zusammenbauen.
Die benötigten Teile für das zweite Projekt
1.) Ein Arduino uno
2.) Ein Roboter Raupenfahrgestell mit zwei Elektromotoren
3.) Ein „Motor Shield“ (= Steuerungsmodul für
Elektromotoren) für den Arduino. L298 Shield 2A High-
Power-H-Brücken DC-Motor Treiber (Arduino-kompatibel)
Treiberchip LGS L298P, direkter Antrieb DC-Motoren, zwei-
Phasen-, Vier-Phasen-Schrittmotoren, max 2A Motorleistung
Zusatzmodule für den Arduino werden „Shields“ genannt und werden einfach oben auf den Arduino aufgesteckt. Die Pins bzw. Ports des Arduino werden dabei „durchgeschleift“. Dieses Motor Shield kann die beiden Motoren des Fahrgestells ansteuern und jeweils vorwärts, rückwärts und in verschiedenen Geschwindigkeiten laufen lassen. Die Geschwindigkeitsregulierung erfolgt über die sogenannte Pulsweitenmodulation (PWM), die ich im ersten Projekt schon
beschrieben habe. Das hier verwendete Shield heißt „Motor Shield 2A“ von
DFRobot. Es kann einfach oben auf den Arduino aufgesteckt werden und wird von der Arduino Entwicklungsumgebung unterstützt. Im Prinzip ist das Motor Shield eine sogenannte H-Schaltung. Es wird benötigt um Motoren mit bis zu 2A Stromaufnahme anzusteuern. Der Arduino kann das nicht direkt gewährleisten, weil er dauerhaft maximal 20 mA bei 5V Spannung liefern kann. Das reicht für keinen Elektromotor aus. Hier können gut und gerne 1 bis 2 A bei 12 V zusammen kommen. Es ist also eine Art Verstärker, mit einem separaten Stromanschluss (Spannungsquelle) für die Motoren. Das von mir verwendete Shield kann hier bestellt werden.
4.) Der Ultraschallsensor (Typ HC-SR04)
5.) Ein Modellbau NiMh Akku (9,6 V mit 8 Zellen mit 2.400 mAh) und ein
geeignetes Ladegerät. Es gibt auch kleinere Bauformen, die besser in das Fahrgestell passen und ggfs etwas weniger Leistung haben (z.B. 1.200 mAh), aber völlig ausreichend sind. Wichtig ist, dass der Akku eine Lötfahne hat, damit er mit dem Motorshield verbunden werden kann. Ich habe einen alten Akku aus einem Flugmodell im Keller gefunden, den ich problemlos verwenden konnte.
6.) Einen 9V Block als Energiequelle für den Arduino mit einem passenden
Stecker für den Stromanschluss an den Arduino.
7.) Ein paar der SteckkabelII. Den Roboter zusammenbauen. Zusätzlich zur Beschreibung hier im Blog gibt es auch ein kurzes Montage- und Demovideo auf YouTube…
Zunächst wollen wir uns mal der „Verdrahtung“ der einzelnen Komponenten widmen. Zuerst steckt Ihr das Motor Shield einfach oben
auf den Arduino auf. Vorne rechts auf dem Motor Shield befinden sich die Anschlussklemmen für die extra Stromversorgung der Motoren. Hier schließt Ihr den Modellbauakku an. Wichtig ist, dass Ihr den Minuspol (schwarzes Kabel) rechts anschließt und den Pluspol (rotes Kabel) links.
Links daneben sind die Anschlüsse für die beiden Motoren des Fahrgestells. Sie sind mit M1 und M2 und der jeweiligen Polangabe ( + und – ) gekennzeichnet. Auch hier wieder rot für + und schwarz für – nehmen.
Jetzt fehlt nur noch der Ultraschallsensor. Den Trigger Anschluss (habe ich mit einem grünen Kabel belegt) müsst Ihr mit Pin 9 des Arduino verbinden. Den Echo Anschluss (bei mir gelbes Kabel) mit Pin 8. Damit der Sensor auch Strom bekommt muss nur noch GND (bei mir das orange Kable) mit GND auf dem Arduino und Vcc (bei mir blaues Kabel) mit dem 5V Pin auf dem Arduino verbunden werden.
Was ich der Übersichtlichkeit halber auf dem Bild noch nicht angeschlossen
habe ist der 9V Block zur Versorgung des Arduino. Dazu müsst Ihr nur das
Kabel an den 9V Block anklemmen und den Stecker in die dazu vorgesehene
Buchse (unterhalb der Stromklemme des Motor Shields) einstecken.
Damit ist die Verkabelung komplett. Eigentlich müsst Ihr jetzt nur noch alle
Komponenten am und im Fahrgestell unterbringen und den Sketch hochladen.
Den Ultraschallsensor solltet ihr am besten vorne am Fahrwerk
befestigen. Sobald Ihr den 9V Block an den Arduino anschließt, fängt der
Roboter an, seine Umgebung zu erkunden. Den Sketch erkläre ich wieder direkt über die Kommentierung des Sourcecodes. Einige Elemente sind nahezu deckungsgleich zum PDC Projekt. Neu ist nur die
Motorsteuerung über das Motor Shield.
III. Der Sketch.
// Autonomer Ultraschall Roboter
int m1speed=6; // Digital Pins zur Geschwindigkeitssteuerung (Motor Shield)
int m2speed=5;
int m1direction=7; // Digital Pins zur Steuerung der Richtung (Motor Shield)
int m2direction=4;
int signal=9; // Digital Pin zur Steuerung des Signaltriggers des
Ultraschallsensors
int echo=8; // Digital Pin zur Steuerung des Echo Ports des Ultraschallsensors
long dauer=0;
boolean crash=false; // Boolsche Variable zur Erkennung einer Kollision
void setup()
{
pinMode(m1direction, OUTPUT);
pinMode(m2direction, OUTPUT);
pinMode(signal, OUTPUT);
pinMode(echo, INPUT);
Serial.begin(9600);
}
long getDistance()
// Misst die Entferung zum nächsten Objekt in cm
{
long entfernung=0;
digitalWrite(signal, LOW);
delay(5);
// Sendet einen 10uS Signal aus
digitalWrite(signal, HIGH);
delay(10);
digitalWrite(signal, LOW);
// Misst die Dauer, bis das Signal wieder beim Sensor ankommt (als Echo)
dauer=pulseIn(echo, HIGH);
// Dauer durch 2 teilen, weil wir ja nur die halbe Zeit messen dürfen
dauer=dauer/2;
// Umrechnung in cm
entfernung = dauer/29.1;
return entfernung;
}
void backUp()
{
digitalWrite(m1direction,LOW); // rückwärts fahren
digitalWrite(m2direction,LOW);
delay(2000);
digitalWrite(m1direction,HIGH); // links drehen, Motor 1 fährt vorwärts, Motor 2
rückwärts
digitalWrite(m2direction,LOW);
analogWrite(m1speed, 200); // Geschwindigkeit auf 200 setzenanalogWrite(m2speed, 200);
delay(2000);
analogWrite(m1speed, 0); // Geschwindigkeit auf 0 setzen
analogWrite(m2speed, 0);
}
void goForward(int duration, int pwm)
{
long a,b;
int dist=0;
boolean move=true;
a=millis();
do
{
dist=getDistance(); // Während der Fahrt wird immer wieder die Distanz
gemessen
Serial.println(dist);
if (dist<10) // Ist sie kleiner als 10 cm wird die Crash Variable auf true gesetzt { crash=true; } if (crash==false) // So lange crash gleich false ist, wird gerade aus gefahren { digitalWrite(m1direction,HIGH); // Beide Motoren vorwärts digitalWrite(m2direction,HIGH); analogWrite(m1speed, pwm); // Die Geschwindigkeit wird durch den Prozeduraufruf festgelegt, hier beträgt sie für beide Motoren 255 analogWrite(m2speed, pwm); } if (crash==true) // Wenn ein Crash vorliegt, wird zuerst das Ausweichmanöver aufgerufen… { backUp(); crash=false; // … und danach die Crash Variable auf false gesetzt, damit wieder gerade aus gefahren werden kann } b=millis()-a; if (b>=duration)
{
move=false;
}
}
while (move!=false);
// Motoren anhalten
analogWrite(m1speed, 0);
analogWrite(m2speed, 0);}
void loop()
{
goForward(1000, 255);
}