Problemy z modułem Bluetooth (HC 05)
Próbuję zrobić robota 4WD sterowanego przez Bluetooth. postępowałem zgodnie z samouczkiem, który znalazłem w Internecie (https://howtomechatronics.com/tutorials/arduino/arduino-robot-car-wireless-control-using-hc-05-bluetooth-nrf24l01-and-hc-12-transceiver-modules/). Po pomyślnym podłączeniu mojego modułu Bluetooth 2 HC 05 użyłem skryptu z samouczka i nieznacznie go zmodyfikowałem, aby działał w mojej konfiguracji. Kod robota:
//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);
}
Kod dla Kontrolera:
#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);
}
Po załadowaniu kodu próbowałem go przenieść, ale nie działało, więc umieściłem instrukcje drukowania, aby zobaczyć wartość X i Y. Początkowo nie działało, więc zamieniłem moduły Bluetooth, które miałem i ponownie je podłączyłem. również zmieniłem tę linię.
while (Serial.available() >= 2)
Do tego
if (Serial.available() > 0)
Zacząłem otrzymywać wartości od mastera do slave'a, ale zauważyłem, że wartości były takie same dla x i y, więc szukałem innego samouczka w Internecie i znalazłem to (https://create.arduino.cc/projecthub/andriy-baranov/arduino-4wd-rc-car-639953?ref=similar&ref_id=18369&offset=3) czytając jego kod, zastanawiałem się, jak działa niewolnik. Zgodnie z oficjalną dokumentacją Arduino Serial.read () nie przyjmuje żadnych argumentów, ale nadal próbowałem i nie działało. Zdecydowałem się ponowić kod z pierwszego samouczka, który sprawdziłem, tym razem wyglądało na to, że działa, więc spróbowałem przesunąć joystick, a monitor szeregowy wydrukował prawidłowe wartości dla obu na początku, a następnie zamienia ich wartości, a następnie zawiesza się. Jak mogę zapobiec zawieszaniu się i zamianie wartości? Dlaczego też pętla while nie działa w nieskończoność, czy ilość danych w buforze szeregowym nie jest zawsze większa niż 2? Dziękuję Ci.
Odpowiedzi
Twoja konfiguracja jest DUŻO zbyt skomplikowana! Uprość konfigurację do momentu, w którym zajmuje się tylko elementem, który sprawia Ci problemy; w twoim przypadku port szeregowy komunikuje się pomiędzy master i slave. Rozwiąż TYLKO TEN problem, a następnie przejdź dalej