Arduino Auto mit Bluetooth steuern?
Ich haben ein Code für ein ferngesteuertes Auto geschrieben und das Bluetooth geht nicht könnte mir jemand damit helfen?
Das ist der Code (ich benutze ein Arduino Mega):
#include <Servo.h>
Servo myservo;
char command = 0;
const int motorPin1 = 2;
const int motorPin2 = 3;
int trigger = 5;
int echo = 6;
int buzzer = 7;
long dauer = 0;
long entfernung = 0;
void setup() {
Serial.begin(9600); // Für den seriellen Monitor
Serial1.begin(9600); // Für Bluetooth über Serial1 (Pin 18 = TX1, 19 = RX1)
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
myservo.attach(4);
myservo.write(90);
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
pinMode(buzzer, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}
void loop() {
if (Serial1.available()) {
command = Serial1.read();
Serial.print("Command: ");
Serial.println(command);
switch (command) {
case 'F':
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
break;
case 'B':
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
break;
case 'S':
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
myservo.write(90);
break;
case 'L':
myservo.write(45);
break;
case 'R':
myservo.write(135);
break;
case 'Y':
tone(buzzer, 250);
delay(2000);
break;
case 'U':
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
break;
case 'u':
digitalWrite(8, LOW);
digitalWrite(9, LOW);
break;
}
}
// Ultraschallmessung und Abstandssensor
digitalWrite(trigger, LOW);
delay(5);
digitalWrite(trigger, HIGH);
delay(10);
digitalWrite(trigger, LOW);
dauer = pulseIn(echo, HIGH);
entfernung = (dauer / 2) * 0.03432;
Serial.print(entfernung);
Serial.println(" cm");
if (entfernung <= 3) {
tone(buzzer, 1000, 100);
delay(100);
}
else if (entfernung <= 6) {
tone(buzzer, 1000, 100);
delay(250);
}
else if (entfernung <= 10) {
tone(buzzer, 1000, 100);
delay(500);
}
else {
noTone(buzzer);
delay(500);
}
}
2 Antworten
SoftwareSerial BT(10, 11); // RX, TX
Beim Mega sind das, aber nicht die RX und TX Pins. Diese sind:
RX0: 0, TX0: 1
RX1: 19 , TX1: 18
RX2: 17, TX2: 16
RX3: 15 , TX3: 14
Es ist an mein PC angeschlossen und das einzige das ich im Serial Motor bekomme ist die Entfernung von mein Ultraschallsensor von Bluetooth bekomme ich nicht. Ich mache das Auto als ein Schulprojekt und mein Lehrer konnte mir auch nicht weiterhelfen er wusste auch nicht an was es liegen kann. Ich habe auch oftmals den Bluetooth Controller gewechselt und es kam immer der gleiche Fehler.
ja habe ich es hat mal auch kurz funktioniert aber dann haben wir noch paar Sachen zum Code hinzugefügt und dann hat es nicht mehr geklappt aber wo es funktioniert hat hatte es auch einen delay also man musste so zwischen 5 und 7 Sekunden warten bis das Auto gefahren ist
Es funktioniert immer noch nicht
so sieht der aktuelle code aus
#include <SoftwareSerial.h>
#include <Servo.h>
SoftwareSerial BT(19, 18); // RX, TX
Servo myservo;
char command = 0;
const int motorPin1 = 2;
const int motorPin2 = 3;
int trigger = 5;
int echo = 6;
int buzzer = 7;
long dauer = 0;
long entfernung = 0;
void setup() {
Serial.begin(9600); // Für den seriellen Monitor
Serial1.begin(9600); // Für Bluetooth über Serial1 (Pin 18 = TX1, 19 = RX1)
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
myservo.attach(4);
myservo.write(90);
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
pinMode(buzzer, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}
void loop() {
if (Serial1.available()) {
command = BT.read();
command = Serial1.read();
Serial.print("Command: ");
Serial.println(command);
switch (command) {
case 'F':
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
break;
case 'B':
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
break;
case 'S':
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
myservo.write(90);
break;
case 'L':
myservo.write(45);
break;
case 'R':
myservo.write(135);
break;
case 'Y':
tone(buzzer, 250);
delay(2000);
break;
case 'U':
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
break;
case 'u':
digitalWrite(8, LOW);
digitalWrite(9, LOW);
break;
}
}
// Ultraschallmessung und Abstandssensor
digitalWrite(trigger, LOW);
delay(5);
digitalWrite(trigger, HIGH);
delay(10);
digitalWrite(trigger, LOW);
dauer = pulseIn(echo, HIGH);
entfernung = (dauer / 2) * 0.03432;
Serial.print(entfernung);
Serial.println(" cm");
if (entfernung <= 3) {
tone(buzzer, 1000, 100);
delay(100);
}
else if (entfernung <= 6) {
tone(buzzer, 1000, 100);
delay(250);
}
else if (entfernung <= 10) {
tone(buzzer, 1000, 100);
delay(500);
}
else {
noTone(buzzer);
delay(500);
}
}
Die Letzten Ideen die ich noch hätte sind:
- Vllt. gibt es Komplikationen zwischen SoftwareSerial und Serial1. Nutze nur eins von beidem da beide denselben RX und TX port nutzen.
- Überprüfe um RX am Arduino an TX beim BT Modul und umgekehrert angeschlossen ist
- Versuche mal diesen Simplen Sketch. Der leitet alle Daten vom BT modul zu Serial weiter und mal schauen ob es geht:
void setup()
{
Serial.begin(9600);
while (!Serial);
Serial1.begin(9600);
while (!Serial1);
Serial.println("HC-05 relay gestartet...");
}
void loop()
{
if (Serial1.available())
{
char data = Serial1.read();
Serial.write(data);
}
}
Wirklich viel mehr kann man dir via Chat nicht helfen, da Ferndebugging immer so ne Sache ist.
Woher bekommt die Variable command einen Wert? Ich bin gerade nicht am PC, kann also selber compilieren, aber spontan sehe ich nichts, wo command einen Wert zugewiesen bekommt, außer bei der Deklarierung.
switch (command)
Hey, falls ich richtig verstanden habe, was du meinst bekommt command doch hier den Wert von dem was der Bluetooth empfänger bekommt:
command = Serial.read();
Habe ich gerade geändert es funktioniert aber immer noch nicht