Menü Schließen

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„.

Links das Robot-Fahrzeug: hinten die Batterie zwischen den Getriebemotoren, vorn von links das HC-05-Modul, der Arduino Nano und der Motorentreiber L293D.
Rechts das Fernsteuer-Modul: von hinten nach vorn das HC-05-Modul, die Batterie und der Keyes_AD_Key.

Ein Aufbau ohne Löten ist mithilfe eines Breadboards möglich.

Fahrzeug

Von links nach rechts: Getriebemotoren, Motorentreiber L293D, 9V-Block, Arduino Nano, HC-05 Bluetooth-Modul
Schaltbild

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

Von links nach rechts: HC-05 Bluetooth-Modul, 9V-Batterie, Arduino Nano, Keyes_AD_Key K845037
Schaltbild

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");
  }
}

Folgekapitel (Krabbeltier) >>>