Problème communication servo moteur et HC-05

Bonsoir !

Alors voilà, depuis quelques temps, je bricole un mini tank avec un bras robotisé et un écran dessus.
L'écran fonctionne, les moteurs du tank pas encore et le bras fonctionne à moitié !

Explication:

J'ai fait un programme qui fonctionne en Bluetooth (Module HC-05) avec l'application mobile Bluetooth Electronics (je n'aime pas App Inventor).

J'arrive parfaitement à contrôler l'affichage de l'écran mais j'ai un problème de communication d'ordres vers les servo moteurs...
En fait, quand je clique sur un bouton sur l'application (le bouton fait tourner un des servo de 45°), le servo ne tourne pas tous le temps et parfois reste bloqué dans la dernière position ! Je ne sais pas d'où vient ce problème ! C'est assez embêtent car je ne peux pas faire fonctionner le bras à cause de ce problème !

Je précise que le problème ne vient pas de l'information envoyée par l'application vers le HC-05 (exemple: "si bouton bleu pressé", "envoyer "sR au HC-05"".) mais de la communication, en effet quand j'appuis sur un bouton, il arrive que l'Arduino ne reçoive pas le signal (la Led RX (je crois) ne clignote pas).

Voici le code:

#include <Wire.h>  
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
#include <Servo.h>

#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args)  write(args);
#else
#define printByte(args)  print(args,BYTE);
#endif

Servo myServo;
int servoposition;
int servopos;
int bA;


char BT_input;

byte FaceE[8]={
  B00000,
  B00000,
  B11111,
  B11111,
  B11111,
  B11111,
  B00000,
  B00000
};

byte FaceAc[8]={
  B00000,
  B00000,
  B00000,
  B00000,
  B11000,
  B11111,
  B01111,
  B00011
};

byte FaceAd[8]={
  B00000,
  B00000,
  B00000,
  B00000,
  B00011,
  B11111,
  B11110,
  B11000
};

byte FaceBc[8]={
  B00000,
  B00000,
  B00000,
  B00000,
  B00111,
  B01111,
  B11111,
  B11000
};

byte FaceBd[8]={
  B00000,
  B00000,
  B00000,
  B00000,
  B11100,
  B11110,
  B11111,
  B00011
};


byte FaceCc[8]={
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B00000
};


SoftwareSerial Bluetooth(12,11);      // (TXD, RXD) of HC-05
LiquidCrystal_I2C lcd(0x3F,16, 2);  // SET I2C Address

char BluetoothData;

void setup() 
{
  lcd.init();
  lcd.backlight(); // makes Backligh ON. 
  lcd.clear();     // Clears LCD
  lcd.home();      // Sets cursor at Column 0 and Line 0
  lcd.print("   A / B / C ");  
  Bluetooth.begin(9600);
  Serial.begin(9600);
  
  myServo.attach(10);
}


void loop()  
{
  if (Bluetooth.available())
  {
    BT_input=(Bluetooth.read());
    Serial.write(BT_input);
      if(BT_input == 'A')
      {
        lcd.clear(); 
        lcd.home();
        lcd.createChar(0,FaceE);
        lcd.createChar(1,FaceAc);
        lcd.createChar(2,FaceAd);
        lcd.setCursor(7,0);
        lcd.write(0);
        lcd.setCursor(8,0);
        lcd.write(0);
        lcd.setCursor(7,1);
        lcd.write(1);
        lcd.setCursor(8,1);
        lcd.write(2);
      }

      if(BT_input == 'B')
      {
        lcd.clear(); 
        lcd.home();
        lcd.createChar(0,FaceE);
        lcd.createChar(3,FaceBc);
        lcd.createChar(4,FaceBd);
        lcd.setCursor(7,0);
        lcd.write(0);
        lcd.setCursor(8,0);
        lcd.write(0);
        lcd.setCursor(7,1);
        lcd.write(3);
        lcd.setCursor(8,1);
        lcd.write(4);
      }

      if(BT_input == 'C')
      {
        lcd.clear(); 
        lcd.home();
        lcd.createChar(0,FaceE);
        lcd.createChar(5,FaceCc);
        lcd.setCursor(7,0);
        lcd.write(0);
        lcd.setCursor(8,0);
        lcd.write(0);
        lcd.setCursor(7,1);
        lcd.write(5);
        lcd.setCursor(8,1);
        lcd.write(5);
      }

      {
    String value = Bluetooth.readString();
    servoposition = value.toInt();

      if (value.toInt() == "0")
    {
      bA = 0;
    myServo.write(bA);
      }

      if (value.toInt() == "4")
      bA = 45;
    {
    myServo.write(bA);
      }

      if (value.toInt() == "9")
      bA = 90;
    {
    myServo.write(bA);
      }

      if (value.toInt() == "2")
    {
      bA = 180;
    myServo.write(bA);
      }
     Serial.println(value);
  }
 }
}

en effet quand j'appuis sur un bouton, il arrive que l'Arduino ne reçoive pas le signal (la Led RX (je crois) ne clignote pas).

votre bluetooth est connecté sur les pins 11 et 12 pourquoi voudriez vous que la Led RX clignote (si vous parlez de la Pin 0 de l'arduino) ?

Si vous virez tout le code pour juste avoir

#include <SoftwareSerial.h>
SoftwareSerial Bluetooth(12, 11);     // (TXD, RXD) of HC-05

void setup()
{
  Serial.begin(9600);
  Bluetooth.begin(9600);
}

void loop()
{
  if (Bluetooth.available()) {
    int BT_input = Bluetooth.read();
    Serial.write((char) BT_input);
  }
}

est-ce que la réception est "solide" ?

Bonjour !

Quand le signal passe correctement, d'habitude, la LED rx clignote... bref... tempis

Que voulez vous dire par "solide" ?

Si j'envoi votre code dans l'arduino, rien ne se passe sur le moniteur série...

TimiMaker:
Si j'envoi votre code dans l'arduino, rien ne se passe sur le moniteur série...

même si vous appuyez sur vos boutons qui envoient un message BT ? (vous avez bien mis la console à 9600 bauds ?)

J'ai bien mis la console à 9600 baud mais si j'appui sur un bouton, le message (1 ou 4 ou 9 ou 2) s'affiche !

ben c'est le caractère ASCII qu'envoie votre code :slight_smile:

Donc, en résumé, le problème ne vient pas de la communication mais des servo ?

Si le message arrive correctement mais les servo ne réagissent pas tous le temps, alors, d'où vient le problème ?

rajoutez un servo sur la pin D10 maintenant pour voir - avec un code qui reste simple

#include <Servo.h>
#include <SoftwareSerial.h>
SoftwareSerial Bluetooth(12, 11);     // (TXD, RXD) of HC-05

Servo myServo;

void setup()
{
  Serial.begin(9600);
  Bluetooth.begin(9600);
  myServo.attach(10);
  myServo.write(10);
}

void loop()
{
  if (Bluetooth.available()) {
    int BT_input = Bluetooth.read();
    Serial.write((char) BT_input);
    switch (BT_input) {
      case '1':
        myServo.write(10);
        break;
      case '2':
        myServo.write(45);
        break;
      case '4':
        myServo.write(90);
        break;
      case '9':
        myServo.write(170);
        break;
    }
  }
}

comme un Servo utilise les interruptions ça peut mettre le bazar sur SoftwareSerial ou inversement

Merci ! Le servo fonctionne ! Je vous re-contacte si j'ai un problème !

dans votre vieux code des trucs du genre      if (value.toInt() == "4")ça ne va pas marcher... le toInt() vous donne un entier, pourquoi comparez vous avec une chaine de caractère ?

Si vous voulez comprendre comment bien écouter le port série (ou gérer un flux asynchrone genre keypad) vous pouvez jeter un oeil à mon petit tuto sur le sujet