Problèmes de module Bluetooth (HC 05)
J'essaye de créer un robot 4WD contrôlé par Bluetooth. je suivais un tutoriel que j'ai trouvé en ligne (https://howtomechatronics.com/tutorials/arduino/arduino-robot-car-wireless-control-using-hc-05-bluetooth-nrf24l01-and-hc-12-transceiver-modules/). Après avoir connecté avec succès mon module Bluetooth 2 HC 05, j'ai utilisé le script du tutoriel et je l'ai légèrement modifié pour qu'il fonctionne pour ma configuration. Le code du robot:
//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);
}
Le code du contrôleur:
#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);
}
Après avoir téléchargé le code, j'ai essayé de le déplacer mais cela ne fonctionnait pas, alors j'ai mis des instructions d'impression pour voir la valeur de X et Y. Au départ, cela ne fonctionnait pas, j'ai donc échangé les modules Bluetooth que j'avais et les reconnecté. J'ai également changé cette ligne.
while (Serial.available() >= 2)
Pour ça
if (Serial.available() > 0)
J'ai commencé à recevoir des valeurs du maître à l'esclave mais j'ai remarqué que les valeurs étaient les mêmes pour x et y alors j'ai cherché un autre tutoriel sur Internet et j'ai trouvé ceci (https://create.arduino.cc/projecthub/andriy-baranov/arduino-4wd-rc-car-639953?ref=similar&ref_id=18369&offset=3) en lisant son code, je me suis demandé comment fonctionnait l'esclave. Selon la documentation officielle Arduino, Serial.read () ne prend aucun argument, mais je l'ai toujours essayé et cela n'a pas fonctionné. J'ai décidé de réessayer le code du premier tutoriel que j'ai vérifié cette fois-ci, il semblait que cela fonctionnait.J'ai donc essayé de déplacer le joystick et le moniteur série a d'abord imprimé les valeurs correctes pour les deux, puis il échange leurs valeurs puis se fige. Comment puis-je l'empêcher de geler et d'échanger les valeurs? Aussi pourquoi la boucle while ne s'exécute-t-elle pas éternellement, la quantité de données dans le tampon série n'est-elle pas toujours supérieure à 2? Je vous remercie.
Réponses
Votre configuration est bien trop complexe! Simplifiez votre configuration au point où elle ne traite que de la pièce qui vous pose des problèmes; dans votre cas, les communications du port série entre le maître et l'esclave. Résolvez JUSTE CE problème, puis passez à autre chose