Probleme mit dem Bluetooth-Modul (HC 05)
Ich versuche einen Bluetooth-gesteuerten 4WD-Roboter herzustellen. Ich folgte einem Tutorial, das ich online gefunden hatte (https://howtomechatronics.com/tutorials/arduino/arduino-robot-car-wireless-control-using-hc-05-bluetooth-nrf24l01-and-hc-12-transceiver-modules/). Nachdem ich mein 2 HC 05 Bluetooth-Modul erfolgreich verbunden hatte, verwendete ich das Skript aus dem Tutorial und änderte es leicht, damit es für mein Setup funktioniert. Der Code für den Roboter:
//Code for Slave
#define enA 9
#define in1 8
#define in2 7
#define enB 10
#define in3 6
#define in4 5
int xAxis, yAxis;
unsigned int x = 0;
unsigned int y = 0;
int motorSpeedA = 0;
int motorSpeedB = 0;
void setup() {
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
Serial.begin(9600); // Default communication rate of the Bluetooth module
}
void loop() {
// Default value - no movement when the Joystick stays in the center
x = 510 / 4;
y = 510 / 4;
// Read the incoming data from the Joystick, or the master Bluetooth device
while (Serial.available() >= 2) {
x = Serial.read();
Serial.print("X: ");
Serial.println(x);
delay(10);
y = Serial.read();
Serial.print("Y: ");
Serial.println(y);
}
delay(10);
// Convert back the 0 - 255 range to 0 - 1023, suitable for motor control code below
xAxis = x*4;
yAxis = y*4;
// Y-axis used for forward and backward control
if (yAxis < 470) {
backMov;
// Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed
motorSpeedA = map(yAxis, 470, 0, 0, 255);
motorSpeedB = map(yAxis, 470, 0, 0, 255);
}
else if (yAxis > 550) {
fowardMov;
// Convert the increasing Y-axis readings for going forward from 550 to 1023 into 0 to 255 value for the PWM signal for increasing the motor speed
motorSpeedA = map(yAxis, 550, 1023, 0, 255);
motorSpeedB = map(yAxis, 550, 1023, 0, 255);
}
// If joystick stays in middle the motors are not moving
else {
motorSpeedA = 0;
motorSpeedB = 0;
}
// X-axis used for left and right control
if (xAxis < 470) {
// Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value
int xMapped = map(xAxis, 470, 0, 0, 255);
// Move to left - decrease left motor speed, increase right motor speed
motorSpeedA = motorSpeedA + xMapped;
motorSpeedB = motorSpeedB - xMapped;
// Confine the range from 0 to 255
if (motorSpeedA > 255) {
motorSpeedA = 255;
}
if (motorSpeedB < 0) {
motorSpeedB = 0;
}
}
if (xAxis > 550) {
// Convert the increasing X-axis readings from 550 to 1023 into 0 to 255 value
int xMapped = map(xAxis, 550, 1023, 0, 255);
// Move right - decrease right motor speed, increase left motor speed
motorSpeedA = motorSpeedA - xMapped;
motorSpeedB = motorSpeedB + xMapped;
// Confine the range from 0 to 255
if (motorSpeedA < 0) {
motorSpeedA = 0;
}
if (motorSpeedB > 255) {
motorSpeedB = 255;
}
}
// Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)
if (motorSpeedA < 70) {
motorSpeedA = 0;
}
if (motorSpeedB < 70) {
motorSpeedB = 0;
}
analogWrite(enA, motorSpeedA); // Send PWM signal to motor A
analogWrite(enB, motorSpeedB); // Send PWM signal to motor B
}
void fowardMov(){
digitalWrite(in2,HIGH);
digitalWrite(in4,HIGH);
digitalWrite(in1, LOW);
digitalWrite(in3, LOW);
}
void backMov(){
digitalWrite(in1,HIGH);
digitalWrite(in3,HIGH);
digitalWrite(in2, LOW);
digitalWrite(in4, LOW);
}
Der Code für den Controller:
#define Xaxis A0
#define Yaxis A1
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.write(analogRead(Xaxis)/4);
Serial.write(analogRead(Yaxis)/4);
delay(20);
}
Nach dem Hochladen des Codes habe ich versucht, ihn zu verschieben, aber es hat nicht funktioniert. Deshalb habe ich print-Anweisungen eingefügt, um den Wert von X und Y zu sehen. Anfangs hat es nicht funktioniert, also habe ich die vorhandenen Bluetooth-Module ausgetauscht und sie wieder verbunden. Ich habe auch diese Zeile geändert.
while (Serial.available() >= 2)
Dazu
if (Serial.available() > 0)
Ich habe angefangen, Werte vom Master an den Slave zu empfangen, aber ich habe festgestellt, dass die Werte für x und y gleich sind. Deshalb habe ich im Internet nach einem anderen Tutorial gesucht und dieses gefunden (https://create.arduino.cc/projecthub/andriy-baranov/arduino-4wd-rc-car-639953?ref=similar&ref_id=18369&offset=3) Als ich seinen Code las, fragte ich mich, wie der Sklave funktionierte. Laut der offiziellen Arduino-Dokumentation nimmt Serial.read () keine Argumente auf, aber ich habe es trotzdem versucht und es hat nicht funktioniert. Ich habe mich entschlossen, den Code aus dem ersten Tutorial erneut zu versuchen, das ich dieses Mal überprüft habe. Es sah so aus, als würde es funktionieren. Deshalb habe ich versucht, den Joystick zu bewegen, und der serielle Monitor hat zuerst die korrekten Werte für beide gedruckt, dann werden die Werte ausgetauscht und dann eingefroren. Wie kann ich verhindern, dass die Werte eingefroren und ausgetauscht werden? Warum läuft die while-Schleife nicht für immer, ist die Datenmenge im seriellen Puffer nicht immer höher als 2? Vielen Dank.
Antworten
Ihr Setup ist viel zu komplex! Vereinfachen Sie Ihr Setup bis zu dem Punkt, an dem nur das Teil behandelt wird, das Ihnen Probleme bereitet. In Ihrem Fall kommuniziert die serielle Schnittstelle zwischen Master und Slave. Lösen Sie genau dieses Problem und fahren Sie dann fort