Labortagebuch - Arduino - Raspberry Pi
2-WD-Fahrzeug - 02.01.2021
Lieferumfang des 2WD-Fahrzeuges
Zusammenbau des 2WD-Fahrzeuges
Ziel dieses Projektes ist es, ein Fahrzeug mit zwei angetriebenen und einem beweglichen Rad mit Hilfe einer IR-Fernbedienung zu steuern. Folgende Befehle sollen dabei implementiert werden:
Vorwärts - rückwärts - links - rechts - stopp.

Um eine einfachere Programmierung für die Steuerung der DC-Motoren zu erreichen, verwendet man das Motor Drive Shield L293D. Dieses wird einfach auf den Arduino aufgesteckt.
Teileliste (Preise: Stand Aug. 2017)

1. Arduino uno - Original: ca. 15 Euro Nachbau: ca: 10 Euro
2. Roboter-Chassis - 14,99 Euro
3. Motor Drive Shield L293D - 9,00 Euro
4. IR-Sender + IR-Empfänger - 2,35 Euro
Dann werden die beiden Motoren an das Shield angeschlossen, dies geschieht mit Schraubanschlüssen. Am Motor dagegen müssen die Kabel angelötet werden.
Bei der vorgesehenen Anordnung sind es die beiden Anschlüsse Motor #3 und Motor #4. Unter Umständen muss man die Kabel an den Ausgängen des Shields umschrauben, damit beide Motoren in dieselbe Richtung drehen.

Der IR-Empfänger muss über das Shield angeschlossen werden. Dabei können nicht die digitalen I/O verwendet werden, da diese irgendwie mit den Ausgängen der Motoren verbunden sind. Frei sind dafür die analogen Eingänge A0 bis A5 (dies sind Pin 14 bis Pin 19). Diese können aber auch als digitale Eingänge benutzt werden. In diesem Beispiel wird der Eingang A0 (= Pin 14) benutzt. Zusätzlich benötigt man für den IR-Empfänger eine Spannungsversorgung.
Um herauszufinden, welche Codierung die einzelnen Tasten des IR-Senders haben, hilft ein kleines Programm, mit dem der Code der gedrückten Taste auf dem Bildschirm angezeigt wird. Diese Daten muss man dann unbedingt notieren, da dadurch die If-Abfrage gesteuert wird.
Tasten-Code
Mit Hilfe dieses Sketch können die Codes der Tasten des IR-Senders erfasst werden

#include <IRremote.h>
int RECV_PIN = 14;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
}

void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, DEC);
irrecv.resume(); // Naechster Tastendruck
}
}
Achtung
Die verschiedenen IR-Sender haben verschiedene Codes für die einzelnen Tasten. Daher ist es unumgänglich, diese Tastencodes zu ermitteln und aufzuschreiben.

Anschluss des IR-Empfängers
Da man nicht direkt an die Arduino-Anschlüsse gelangen kann, muss der IR-Empfänger über das Shield angeschlossen werden. Dabei können jedoch nicht die digitalen I/O verwendet werden, da diese irgendwie mit den Ausgängen der Motoren verbunden sind. Frei sind dafür die analogen Eingänge A0 bis A5 (dies sind Pin 14 bis Pin 19). Diese können aber auch als digitale Eingänge benutzt werden. In diesem Beispiel wird der Eingang A0 (= Pin 14) benutzt. Zusätzlich benötigt man für den IR-Empfänger eine Spannungsversorgung, die über den Anschluss eines Akkus an das Shield erreicht wird. Damit ist auch der Arduino an eine Spannung angeschlossen.
Taste
Code
0
16738455
1
16724175
2
16718055
3
16716045
4
16716015
5
16726215
6
16734885
7
16728765
8
16730805
9
16732845
Programm zur Steuerung
#include < AFMotor.h >
#include < IRremote.h >
int RECV_PIN = 14;
AF_DCMotor motor3(3, MOTOR34_64KHZ);
AF_DCMotor motor4(4, MOTOR34_64KHZ);
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup(){
Serial.begin(9600);
irrecv.enableIRIn();
} //Ende setup

void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value);
// vorwärts
if (results.value == 16718055) {
motor3.setSpeed(200);
motor4.setSpeed(200);
motor3.run(FORWARD);
motor4.run(FORWARD);
delay(200);
}
// Linkskurve
if (results.value == 16716015) {
motor3.setSpeed(220);
motor4.setSpeed(120);
motor3.run(FORWARD);
motor4.run(FORWARD);
delay(200);
}
// Rechtskurve
if (results.value == 16734885){
motor3.setSpeed(120);
motor4.setSpeed(220);
motor3.run(FORWARD);
motor4.run(FORWARD);
delay(200);
}
// rückwärts
if (results.value == 16730805) {
motor3.setSpeed(150);
motor4.setSpeed(150);
motor3.run(BACKWARD);
motor4.run(BACKWARD);
delay(200);
}
// stop
if (results.value == 16726215) {
motor3.run(RELEASE);
motor4.run(RELEASE);
delay(200);
}
// Neue Taste
results.value = 0;
delay(200);
irrecv.resume();
}
} // Ende loop