Schnelle Lieferung
Rabattkonditionen für Unternehmen
Bis zu 10% Rabatt für Schüler, Studenten und Bildungseinrichtungen
Europaweit: Versicherter Versand ab 4,90€
Filter schließen
Filtern nach:

RC Car für Arduino bauen: Autonomes Fahrzeug - Teil 3

Mit Roboterautos die Mobilität der Zukunft verstehen, Teil 3

Willkommen zur dritten Folge unserer Blogreihe über Roboterautos. Im ersten Teil haben wir die Grundlagen für das Basisfahrzeug kennengelernt. Im zweiten Teil haben wir ein universelles Codesystem entwickelt, mit dem wir Fahrtstufen des Roboterautos festlegen, und eine einfache Fernsteuerung mit einer Infrarot-Fernbedienung realisiert. Aufgrund der physikalischen Grenzen dieser Fernsteuerung möchte ich in dieser Folge die Übertragung der Fahrtanweisungen mit Bluetooth, z.B. von einem Smartphone an den BT-Empfänger HC-05, zeigen. Bluetooth ist ein 2,4GHz-Funksignal mit kurzer Reichweite. Sicher bis ca. 10m und störungsfrei bei Sonnenlicht.

Das Bluetooth-Modul HC-05 ist eigentlich ein Transceiver=Transmitter + Receiver. Wir benutzen es allerdings nur als Empfänger, für das Senden der Fahrtanweisungen verwenden wir eine Bluetooth-APP am Android Smartphone (wegen des Sonderweges von Apple bei Bluetooth funktioniert es nicht mit einem iPhone). Es ist grundsätzlich möglich, auch eine Bluetooth-Fernbedienung mit dem HC-05 zu bauen; dafür werden jedoch ein zweiter HC-05, weiterer Micro Controller und ein Eingabegerät (Joystick-Controller) benötigt.

 HC-05 Modul - Vorderseite und Rückseite


Von den sechs Pins des HC-05 Moduls werden nur vier benötigt: VCC (5V) und GND für die Spannungsversorgung des Moduls, sowie RXD und TXD zum Anschluss an zwei Pins des Mikrocontrollers, an denen SoftwareSerial eingerichtet wird. Allerdings kann man die Aufschrift LEVEL: 3.3V nicht ignorieren, um das Modul nicht zu beschädigen. An unserem Mikrocontroller mit 5V-Logik benötigen wir zumindest für den RXD Pin einen Spannungsteiler von 5V auf 3,3V, also z.B. Widerstände von 1 kOhm und 2,2 kOhm.

Der Schaltplan: HC-05 Modul am Mikrocontroller

Schaltbild - HC-05 Modul

Die AT-Befehle des HC-05 Moduls für Arduino Mikrocontroller

Links neben dem mit Key gekennzeichneten Anschluss befindet sich ein kleiner Taster (Button), der für die Konfiguration von Bedeutung ist. Wenn dieser Button beim Einschalten gedrückt wird, gelangen wir in den AT Kommando-Modus (die LED blinkt langsam im 2s-Rhythmus), in dem wir mit sogenannten AT-Befehlen (für Attention, Achtung) die Einstellungen vornehmen. Dazu benutzen wir ein modifiziertes Beispiel-Programm, bei dem die übliche serielle Schnittstelle mit dem Serial Monitor der Arduino IDE und der HC-05 über SoftwareSerial verbunden wird.

/*
Software serial multiple serial test
Receives from the hardware serial, sends to software serial.
Receives from software serial, sends to hardware serial.
The circuit:
* RX is digital pin 10 (connect to TX of other device)
* TX is digital pin 11 (connect to RX of other device)                           // voltage divider!
created back in the mists of time
modified 25 May 2012
by Tom Igoe
based on Mikal Hart's example
This example code is in the public domain.
*/
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(10, 11); // RX, TX                                              // mySerial changed to BTSerial
char c=' ';                                                                                                      // Declaration of variable for transmission
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);                                                                                   // Baud rate changed to 9600
Serial.println("Serial started!");
// set the data rate for the SoftwareSerial port
BTSerial.begin(38400);                                                                            // Baud rate for BT 38400
Serial.println("BTSerial started!");
}
void loop() { // run over and over
if (BTSerial.available()) {
c=BTSerial.read();
Serial.write(c);
}
if (Serial.available()) {
c=Serial.read();
BTSerial.write(c);
Serial.write(c);                                                                                       // re-transmission of input in Serial Monitor
}
}

Die wesentlichen AT-Befehle werden im folgenden Bild verwendet. Die Gegenstelle, der HC-05, sendet ggf. eine Antwort und quittiert mit OK.

Uns interessieren vor allem der Name und die HEX-Adresse, um das Modul später auf dem Smartphone eindeutig zu identifizieren. Die AT-Befehle werden dabei in den seriellen Monitor des Mikrocontrollers eingegeben. Im nachfolgenden Bild sehr Ihr den seriellen Monitor der Arduino IDE.

Wer möchte, kann das Standard-Passwort 1234 ändern mit "AT+PSWD=xxxx", wobei x für eine Ziffer von 0 bis 9 steht. Danach mit "AT+PSWD?" prüfen, ob die Eingabe erfolgreich war.

AT-Befehle - HC-05
Nach Beendigung der Eingaben wird das Modul kurz vom Strom getrennt. Nach dem Wiedereinschalten ohne Knopfdruck befindet sich das HC-05-Modul im Standard-Modus. Die LED blinkt schnell (ca. 5-mal/s).

Modifikationen des RC-Cars: anderes Motorshield

Nun zum Robot Car. Nachdem wir beim letzten Mal den Motor Controller V2 verwendet haben, der für die Steuersignale nur die zwei I2C-Anschlüsse SDA=A4 und SCL=A5 benötigt, möchte ich dieses Mal den älteren Motor Controller V1 vorstellen, der zwar viele digitale Pins blockiert, aber häufig zum Schnäppchenpreis zu kaufen ist.

L293D Modul

Auch dieses Motorshield habe ich ein wenig modifiziert, um Zugang für Sensoren und Funkempfänger zu erhalten. Auf der Seite der digitalen Pins gibt es nur einen Pin, der mit Hilfe eines gewinkelten Steckers zugänglich wird: Pin 2. Das ist gut für diejenigen, die hier den IR-Empfänger anschließen möchten. Mehr Möglichkeiten für Erweiterungen gibt es auf der anderen Seite, wo man mit Hilfe von Federleisten (auch Buchsenleisten genannt) Zugang zu sämtlichen analogen Eingängen sowie zur Spannungsversorgung erhält.

Da sämtliche analogen Eingänge auch als digitale Ein- oder Ausgänge genutzt werden können, haben wir hier die Möglichkeit, unsere Funkempfänger anzuschließen. Das klappt wunderbar mit dem 433 MHz Transceiver HC-12 (siehe nächste Folge), aber für den BT-Empfänger HC-05 nur mit Einschränkungen. Erstens können wir den RXD-Pin nicht direkt anschließen, wir benötigen den Spannungsteiler, und zweitens liefern die Pins nicht genügend Strom für die Energieversorgung des Moduls an diesen Pins.

Auf dem folgenden Bild ist ein kleiner, selbst gefertigter Adapter zu sehen, der den HC-05 mit 5V und Ground aus den entsprechenden Anschlüssen versorgt, TXD direkt mit RX der SoftwareSerial-Schnittstelle A1 =D15 und RXD über den Spannungsteiler mit A2 = D16 verbindet.
HC-05 Adapter

Der Schaltplan: HC-05 Modul mit L293D Motorshield am Arduino Mikrocontroller
HC-05 mit L293D Schaltplan

Die Schaltung kann selbstverständlich auch auf einem Mini Breadboard mit Jumperkabeln realisiert werden.

Wie beim letzten Mal wird der Code für die Fahrtanweisungen auf Tastendruck erhöht oder vermindert; diesmal nur nicht mit IR-Fernbedienung, sondern mit der Touch-Funktion in der Smartphone-APP und der Bluetooth-Abfrage über SoftwareSerial.

Koppeln des HC-05 Bluetooth Moduls mit einer Android Applikation (APP)

Bevor sich die APP mit dem Robot Car verbinden kann, müssen wir in den Einstellungen das Pairing mit dem das Bluetooth-Modul durchführen. Das sollte ganz einfach sein, denn wir haben zuvor mit den AT-Befehlen den Namen und die HEX-Adresse des HC-05 abgefragt.

Wenn das Pairing geklappt hat und eine geeignete BT-App installiert wurde, kann diese gestartet und eingerichtet werden. Mit dem Tippen auf die Lupe im linken Bild werden geeignete Geräte angezeigt. Wir tippen auf das HC-05 und erhalten die Meldung „connected“. Die von mir verwendete App bietet mehrere Oberflächen für die Bedienung an (mittleres Bild). Ich habe mich für den Spiele-Controller entschieden. Auf dem mittleren Bild oben rechts sind zwei Pfeile, die eine kleinen Kreis bilden. Hier bitte antippen, wenn die Verbindung verloren gegangen ist.

Auf dem rechten Bild sind die Tasten eines Spiel-Controllers abgebildet. Vor der ersten Benutzung müssen den Schaltflächen die Zahlenwerte zugeordnet werden, die beim Tippen übertragen werden sollen.

Für die Cursortasten habe ich im Uhrzeigersinn die Zahlenwerte 1 bis 4 vorgegeben. Den weiteren Schaltflächen habe ich den Zahlenwert 5 zugeordnet. Diese Werte werden im Sketch an die Variable blueToothVal übergeben und führen in den if-Verzeigungen der Funktion loop() zur Bestimmung des Codes für die Fahrtstufe.

HC-05 Bluetooth App

Die Änderungen von Infrarot auf Bluetooth und Motor Controller V2 auf V1 verursachen einige Modifikationen im Hauptteil des Sketches. Hingegen ändert sich bei der Funktion motor() fast nichts. Nur bei der Schreibweise wird aufgrund der unterschiedlichen Programm-Bibliotheken (libraries) aus den Funktionen motor1->setSpeed() nun motor1.setSpeed().

Der Programmcode: RC Car für Arduino bauen

* Sample Code for Robot Car with Motor Shield V1 and BT receiver HC-05, as of 20220515
* based on Adafruit Motor shield V2 library, copyright Adafruit Industries LLC
* this code is public domain, enjoy!
* modified for Funduino
* Pins
* BT VCC to Arduino 5V out.
* BT GND to GND
* Arduino A1=15 (SS RX) - BT TX no need voltage divider
* Arduino A2=16 (SS TX) - BT RX through a voltage divider (5v to 3.3v)
*/
#include <AFMotor.h>
AF_DCMotor motor1(2);
AF_DCMotor motor2(3);
#include <SoftwareSerial.h>
// initialize HC-05
SoftwareSerial BTSerial(15, 16); // RX, TX über Kreuz an TX, RX(voltage divider)
char blueToothVal;
int x = 0;
int y = 0;
int left = 0;
int right = 0;
int code = 5555;
int speedL = 0;
float factor = 1.8; // Correction for speedLevel 255/100 * 6V/VBatt
void setup() {
Serial.begin(9600); // set up Serial Monitor at 9600 bps
Serial.println("Motor test!");
BTSerial.begin(9600); // set up transmission speed for HC-12
Serial.println("SoftwareSerial initialized!");
}   // end setup
void loop() {
if(BTSerial.available()) //wenn Daten empfangen werden... 
Serial.print("available");     
{
blueToothVal=BTSerial.read();//..sollen diese ausgelesen werden
Serial.println(blueToothVal);
}
if (blueToothVal=='1') //wenn das Bluetooth Modul eine „1“ empfängt..
{
if (code<9000)   code = code + 1000;
Serial.print("Code = ");
Serial.println(code);
}
else if (blueToothVal=='2') //wenn das Bluetooth Modul eine „2“ empfängt..
{
if ((code-1000*int(code/1000))<900)  code = code + 100;
Serial.print("Code = ");
Serial.println(code);
}
else if (blueToothVal=='3') //wenn das Bluetooth Modul eine „3“ empfängt..
{
if (code>2000)   code = code - 1000;
Serial.print("Code = ");
Serial.println(code);
}
else if (blueToothVal=='4') //wenn das Bluetooth Modul eine „4“ empfängt..
{
if (code-1000*int(code/1000) > 200)   code = code - 100;
Serial.print("Code = ");
Serial.println(code);
}
else if (blueToothVal=='5') //wenn das Bluetooth Modul „5“ empfängt...
{
code = 5555;
Serial.print("Code = ");
Serial.println(code);
}
delay(200);   //little delay for better serial communication and to avoid bouncing
motor();
}   // end loop
void motor(){
int speedLevel[9]={-100,-80,-60,-40,0,40,60,80,100};
y = int(code / 1000);
x = int((code - 1000*y) / 100);
speedL = speedLevel[y-1];
Serial.print("code = ");
Serial.print(code);
Serial.print(" y = ");
Serial.print(y);
Serial.print(" x = ");
Serial.print(x);
Serial.print(" speedL = ");
Serial.println(speedL);
//Korrektur der Fahrtstufen für Kurvenfahrt
if (x==1){
right = speedL+20;
left = speedL-20;
}
else if (x==2){
right = speedL+15;
left = speedL-15;
}
else if (x==3) {
right = speedL+10;
left = speedL-10;
}
else if (x==4) {
right = speedL+5;
left = speedL-5;
}
else if (x==6) {
right = speedL -5;
left = speedL+5;
}
else if (x==7) {
right = speedL-10;
left = speedL+10;
}
else if (x==8) {
right = speedL-15;
left = speedL+15;
}
else if (x==9) {
right = speedL-20;
left = speedL+20;
}
else {
right = speedL;
left = speedL;
}
//Eingabe der Fahrtstufen für "left" und "right"
Serial.print("left = ");
Serial.print(left);
Serial.print(" right = ");
Serial.println(right);
if (left < 40 & left > -40) {
motor1.run(RELEASE);
}
if (right < 40 & right > -40) {
motor2.run(RELEASE);
}
if (left>=40) {
if (left>100) left=100;
motor1.run(FORWARD);
motor1.setSpeed(left * factor);
}
if (right>=40) {
if (right>100) right=100;
motor2.run(FORWARD);
motor2.setSpeed(right * factor);
}
if (left<= -40) {
if (left<-100) left=-100;
motor1.run(BACKWARD);
left = -left;
motor1.setSpeed(left * factor);
}
if (right<= -40) {
if (right<-100) right=-100;
motor2.run(BACKWARD);
right = -right;
motor2.setSpeed(right * factor);
}
}   // end motor

Soweit die zweitgünstigste Lösung für ein Robot Car mit Fernsteuerung (vorausgesetzt, man hat ein Android Smartphone). Beim nächsten Mal möchte ich zeigen, wie einfach die Einbindung eines 433 MHz-Transceivers HC-12 funktioniert. Damit können sogar mehrere hundert Meter Reichweite erzielt werden. Allerdings steigen die Kosten, da nun zwei Transceiver und ein weiterer Mikro Controller benötigt werden. Bis dann.

Bitte gebe die Zeichenfolge in das nachfolgende Textfeld ein.

Die mit einem * markierten Felder sind Pflichtfelder.

Passende Artikel
Bluetooth Modul - Typ "HC-05" Bluetooth Modul - Typ "HC-05"
Inhalt 1 Stück
7,86 € *
Artikel-Nr.: F23107169
Hinzufügen
Bluetooth Modul - Typ "HC-06" Bluetooth Modul - Typ "HC-06"
Inhalt 1 Stück
7,75 € *
Artikel-Nr.: F23106816
Hinzufügen
L293D Motorshield für Arduino UNO und MEGA L293D Motorshield für Arduino UNO und MEGA
Inhalt 1 Stück
3,78 € *
Artikel-Nr.: F23107155
Hinzufügen
Breadboard (Steckbrett) mit 830 Kontakten Breadboard (Steckbrett) mit 830 Kontakten
Inhalt 1 Stück
2,22 € *
Artikel-Nr.: FUN-1010553
Hinzufügen