Im vorangehenden Kapitel wurde gezeigt, was getan werden muss, damit Arduino-Boards über Bluetooth miteinander kommunizieren können. Dieses Wissen ermöglicht es, mit diesen Mitteln ein Roboter-Fahrzeug fernzusteuern.
Die folgenden Abbildung zeigt Fahrzeug und Fernsteuerung. Arduino Nano sowie HC-05 sind mithilfe von Buchsenleisten (und am Fahrzeug mit einem Sockel für den Motorentreiber L293D) auf Lochrasterplatinen platziert und unterseitig verkabelt worden. Das Fahrzeug entspricht dem im Kapitel „Durstige Motoren„.
Ein Aufbau ohne Löten ist mithilfe eines Breadboards möglich.
Fahrzeug
Für die Fernsteuerung empfiehlt sich ein AD_Key, wie er bereits im Kapitel „Reaktionsspiel“ vorgestellt und zum Nachbau empfohlen worden ist. Die Anordnung der Tasten passen gut zu den möglichen Bewegungsrichtungen des Fahrzeugs: vor, zurück, links, rechts. Die 5. Taste kann ggfs. dem Stoppen dienen.
Fernsteuerung
Der Nano auf dem Fahrzeug sollte wie folgt programmiert werden:
#include <SoftwareSerial.h>
#define rxPin 3
#define txPin 4
SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin);
int state = 20;
int buttonState = 0;
void setup() {
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(6, OUTPUT);
mySerial.begin(38400);
}
void loop() {
if (mySerial.available() > 0) {
state = mySerial.read();
}
if (state == '1') {
analogWrite(11, 150);// beide Motoren an
digitalWrite(10, LOW);
analogWrite(9, 150);
digitalWrite(6, LOW);
state = 0;
}
if (state == '2') {
analogWrite(11, 150); // rechter Motor an
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(6, LOW);
state = 0;
}
if (state == '3') {
digitalWrite(11, LOW); // linker Motor an
digitalWrite(10, LOW);
analogWrite(9, 150);
digitalWrite(6, LOW);
state = 0;
}
if (state == '4') {
digitalWrite(11, LOW); // beide Motoren rückwärts
analogWrite(10, 150);
digitalWrite(9, LOW);
analogWrite(6, 150);
state = 0;
}
/*if (state == '5') {
digitalWrite(11, LOW); // Stoppen der Motoren auf Tastendruck.
digitalWrite(10, LOW); // Deaktivieren, wenn "else if"
digitalWrite(9, LOW); // aktiviert wird
digitalWrite(6, LOW);
state = 0;
}*/
else if (state == '0') {
digitalWrite(11, LOW); // Wenn aktiv, stoppen die
digitalWrite(10, LOW); // Motoren beim Loslasssen
digitalWrite(9, LOW); // der Tasten
digitalWrite(6, LOW);
state = 0;
}
}
Der Code beinhaltet zwei Möglichkeiten: die Motoren auf Tastendruck zu stoppen oder sie anhalten zu lassen, wenn die Tasten losgelassen werden. Was zum Steuern geeigneter ist, soll dahingestellt bleiben.
Der Nano auf der Fernbedienung ist wie folgt zu programmieren:
#include <SoftwareSerial.h>
#define rxPin 3
#define txPin 4
int button;
int value = 0;
#define nobutton 0
#define button1 1
#define button2 2
#define button3 3
#define button4 4
#define button5 5
int readbutton()
{
value = analogRead(A0);
if (value > 1000) //Wert 1023
return nobutton;
if (value < 20) //Wert bei 10
return button1;
if (value < 180) //Wert bei 140
return button2;
if (value < 370) //Wert bei 330
return button3;
if (value < 540) //Wert bei 500
return button4;
if (value < 780) //Wert bei 740
return button5;
}
SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin);
int state = 20;
void setup() {
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
mySerial.begin(38400);
}
void loop() {
if (mySerial.available() > 0) {
state = mySerial.read();
}
button = readbutton(); //gedrückten Knopf finden.
if (button == 0)
mySerial.write("0");
if (button == 1) {
mySerial.write("1");
}
if (button == 2) {
mySerial.write("2");
}
if (button == 3) {
mySerial.write("3");
}
if (button == 4) {
mySerial.write("4");
}
if (button == 5) {
mySerial.write("5");
}
}