Problèmes de module Bluetooth (HC 05)

Oct 19 2020

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

user3765883 Oct 20 2020 at 22:02

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