Problème de communication Bluetooth entre Android et Arduino

Bonjour,

Je suis complètement débutante sur Arduino, j'ai commencé il y a seulement quelques jours alors je vous prie de m'excuser si tout n'est pas très clair dans mon explication.

J'ai à disposition une Arduino Mega 2560 et un Bluetooth shield V2.2 (itead). Pour commencer, je souhaite tester des échanges de messages très simples entre mon PC connecté en USB à la Arduino et mon téléphone Android connecté en Bluetooth. Après de nombreuses recherches sur divers sites et forums, j'ai trouvé plusieurs fois ce code qui devrait fonctionner:

#include <SoftwareSerial.h>

#define rxPin 4
#define txPin 5

SoftwareSerial mySerial(rxPin, txPin); // RX, TX
char myChar ; 

void setup() {
  Serial.begin(38400);   
  Serial.println("Hello world!"); // ok
  mySerial.begin(38400);
  mySerial.println("Hello, world?"); // ok
}

void loop(){
  while(mySerial.available()){
    myChar = mySerial.read();
    Serial.print(myChar); // no
  }

  while(Serial.available()){
   myChar = Serial.read();
   mySerial.print(myChar); // ok
  }
}

J'ai déjà réussi à configurer comme je le souhaite le module HC-05 grâce aux commandes AT (j'ai finalement remis les paramètres par défaut) et j'ai ensuite bien pensé à mettre le switch sur DAT et changé les jumpers de place sur le multiplexer UART (j'ai choisi D4-TX et D5-RX).
En testant le code ci-dessous, j'arrive bien à envoyer des messages du moniteur série de mon ordinateur à mon téléphone via USB->Arduino->Bluetooth mais lorsque j'essaye d'envoyer des messages de mon téléphone via Bluetooth->Arduino->USB->Moniteur série du PC, je ne reçois rien du tout...

Je crois que j'ai épuisé tout ce que j'ai pu trouver sur les forums, les sites, les blogs... J'ai essayé d'autres pins (5,6,7), j'ai vérifié que je n'avais pas d'autre appareil connecté à l'Arduino, j'ai aussi essayé de m'inspirer d'un code exemple de Tom Igoe sur "SerialEvent" que voici (j'ai ajouté BTSerial):

/*
  Serial Event example

 When new serial data arrives, this sketch adds it to a String.
 When a newline is received, the loop prints the string and
 clears it.

 A good test for this is to try it with a GPS receiver
 that sends out NMEA 0183 sentences.

 Created 9 May 2011
 by Tom Igoe

 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/SerialEvent

 */
#include <SoftwareSerial.h>

String inputString = "";         // a string to hold incoming data
boolean stringComplete = false;  // whether the string is complete
SoftwareSerial BTSerial(4, 5); // RX , TX

void setup() {
  // initialize serial:
  Serial.begin(38400); // original 9600
  BTSerial.begin(38400);
  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
}

void loop() {
  // print the string when a newline arrives:
  if (stringComplete) {
    BTSerial.println("You sent:");
    BTSerial.println(inputString);
    // clear the string:
    inputString = "";
    stringComplete = false;
  }
}

/*
  SerialEvent occurs whenever a new data comes in the
 hardware serial RX.  This routine is run between each
 time loop() runs, so using delay inside loop can delay
 response.  Multiple bytes of data may be available.
 */
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}

Mais cela ne fonctionne plus du tout avec mes modifications (ni dans un sens ni dans l'autre).

Selon vous, d'où vient le problème ?

Merci d'avance et bonne journée. :slight_smile:

Asteria

bonjour
quelle application "serial" du coté androïd ?

J'ai pris l'application "Itead BT Debugging assistant" qui semble être celle qui va avec le Bluetooth shield... J'ai aussi installé "Virtual Terminal" qui semble plus aboutie, même résultat

Bonjour,

J'ai essayé de commander une LED avec ce code:

#include <SoftwareSerial.h>

SoftwareSerial bth(4,5); // RX | TX

char junk;
String inputString="";

void setup()
{
 bth.begin(38400);
 pinMode(13, OUTPUT);
}

void loop()
{
  if(bth.available()){
  while(bth.available())
    {
      char inChar = (char)bth.read(); //read the input
      inputString += inChar;
    }
    bth.println(inputString);
    while (bth.available() > 0)  
    { junk = bth.read() ; } // clear the serial buffer
    if(inputString == "a"){ //in case of 'a' turn the LED on
      digitalWrite(13, HIGH);  
    }else if(inputString == "b"){ //in case of 'b' turn the LED off
      digitalWrite(13, LOW);
    }
    inputString = "";
  }
}

Quand je teste avec "Serial" entre le moniteur série de mon PC et la Arduino, la LED s'allume et s'éteint exactement comme je le souhaite en tapant 'a', 'b', mais lorsque j'essaye par Bluetooth depuis mon téléphone (ou même depuis mon PC avec par exemple Putty en serial, baudrate 38400 sur le COM correspondant), rien à faire, la LED reste désespérément éteinte...

Je pense pas qu'il s'agisse d'un problème au niveau du multiplexage RX-TX car j'arrive à envoyer des données dans l'autre sens (Arduino -> Android). J'ai bien pris soin de ne pas connecter plusieurs appareils en même temps à la Arduino (je ne sais pas si ça joue, mais dans le doute (?)).

Enfin je suis ouverte à toutes les idées qui pourraient résoudre mon problème...

Merci d'avance pour votre aide.

Asteria

Désolée pour la remontée de ce post, mais toutes mes tentatives n'ont rien donné... Je ne comprends vraiment pas d'où provient le problème. Est-ce que quelqu'un a réussi à communiquer entre la Arduino et son téléphone Android via le Bluetooth shield ? Où ai-je pu faire une erreur pour que je ne parvienne pas à envoyer des messages depuis mon téléphone ? Cela est certainement dû aux codes que j'ai cité dans mes posts précédents mais je ne vois vraiment pas où...
Merci d'avance pour votre aide

Asteria:
Désolée pour la remontée de ce post, mais toutes mes tentatives n'ont rien donné... Je ne comprends vraiment pas d'où provient le problème. Est-ce que quelqu'un a réussi à communiquer entre la Arduino et son téléphone Android via le Bluetooth shield ? Où ai-je pu faire une erreur pour que je ne parvienne pas à envoyer des messages depuis mon téléphone ? Cela est certainement dû aux codes que j'ai cité dans mes posts précédents mais je ne vois vraiment pas où...
Merci d'avance pour votre aide

bonjour
je n'ai aucun probleme pour communiquer avec un HC05 ou 06 et les applis androïd
mais je n'utilise pas ce shield , simplement des modules

Asteria:
Désolée pour la remontée de ce post, mais toutes mes tentatives n'ont rien donné... Je ne comprends vraiment pas d'où provient le problème. Est-ce que quelqu'un a réussi à communiquer entre la Arduino et son téléphone Android via le Bluetooth shield ? Où ai-je pu faire une erreur pour que je ne parvienne pas à envoyer des messages depuis mon téléphone ? Cela est certainement dû aux codes que j'ai cité dans mes posts précédents mais je ne vois vraiment pas où...
Merci d'avance pour votre aide

Bonjour,

Il faut peut-être que tu changes de mode (passer de slave en master ou l'inverse) ?

Artouste:
bonjour
je n'ai aucun probleme pour communiquer avec un HC05 ou 06 et les applis androïd
mais je n'utilise pas ce shield , simplement des modules

Ce shield est apparemment basé sur un HC05. Ce que tu sais faire avec peut peut-être aider ?

Merci pour vos réponses ! C'est peut-être un souci de maître/esclave effectivement. Je regarde ça et je vous tiens au courant :slight_smile:

hello

as tu testé en descendant ta vitesse de com à 9600 bauds.

sinon:

j'ai testé le blue tooth, il y a qq temps.

avec une platine DUE, un HC06 et une tablette android

j'ai fais une application android avec "MIT app inventor"

de la tablette, on peut:
_se connecter ou se déconnecter ( après avoir autorisé les connections blue tooth dans les paramètres de la tablette )
_envoyer un BP "ON" ou un BP "OFF"
_envoyer un chiffre correspondant à un curseur.
_envoyer des ordres en utilisant la reconnaissance vocale de la tablette.

tout cela de la tablette vers la platine DUE et la platine DUE envoie ce qu'elle reçoit vers le moniteur

pendant ce temps, la platine DUE compte de 1 à 3 en boucle et envoie le chiffre en cours .
la tablette affiche le chiffre reçu et change la couleur de fond de la case texte dans laquelle est affiché le nombre reçu.

tout cela ne sert pas à grand chose, c'était pour découvrir et démystifier le blue tooth et les applications android.

si tu les voir et comparer, je peux mettre les 2 programmes à disposition

Bonjour,

J'ai essayé de passer mon Bluetooth shield en mode master, mais dans ce mode là impossible de le détecter depuis mon téléphone (ni depuis mon ordinateur) dans la recherche de périphériques Bluetooth...

Je l'ai donc repassé en mode slave avec en vitesse de com 9600 bauds, mais rien à faire, il ne reçoit toujours rien.

Du coup dfgh je veux bien voir la partie de ton programme qui gère les commandes envoyées depuis la tablette pour voir les différences avec mes programmes.

Merci d'avance et bonne journée :slight_smile:

hello
en zip ci dessous
en détaillé ICI
et LA

ON_OFF_MOT_VIT_v9.zip (6.18 KB)

j'ai oublié le .ino du DUE

    //#include <SoftwareSerial.h>

    
    const char DOUT_LED = 2;
    String messageRecu;
int counter = 2;
unsigned long temps;
    void setup() {
      Serial.begin(115200);
      Serial3.begin(9600);  
      pinMode(DOUT_LED, OUTPUT);
      digitalWrite(DOUT_LED, LOW);
      Serial.println("PRET");
      temps=millis();
    }
     
    void loop()
    {
        while ( Serial3.available())
        {
         delay(3);
          char c = Serial3.read();
          messageRecu += c;
        }
        
        if (messageRecu.length() >0)
        {
          Serial.println(messageRecu);
          if (messageRecu == "1")     
            {Serial.println(messageRecu);}
          if (messageRecu == "2")
            {Serial.println(messageRecu);}
          messageRecu="";
        }
       if (millis()-temps >300)
  {
  //Serial3.print("Test liaison HC-06 bluetooth ");
  //Serial3.print(++counter);
  Serial3.print(++counter);
  if(counter==3){counter=0;}
  Serial3.print(" " );
  Serial3.flush();
  temps=millis();  //Un envoi de données par seconde
  } 
        
    }

Asteria:
Je l'ai donc repassé en mode slave avec en vitesse de com 9600 bauds, mais rien à faire, il ne reçoit toujours rien.

bonjour
si je resume ce que j'ai compris :

  • ton modukle BT en mode slave
    -- tu peux lui faire faire des envois BT bien recupérés par ton Soft Distant (BT ---->SD OK )
    -- tu ne recupere jamais des envois effectués par ton Soft Distant (SD -----> BT NOK )

si oui ça évacue déjà les doutes sur toute les couches de connexion/appairage purement BT

Hors arduino , fais un test en connectant sur le rx de ton module BT un ecouteur pris au travers d'une R de 1 K et ecoute .

ou mieux si tu a de quoi faire , utilise un truc simple comme ça qui rend pas mal de services (HP ou casque)

Bonjour,

Merci dfgh pour ton projet. Juste une petite question parce que je me rends compte que je n'ai peut-être pas compris une chose: pour la com en Bluetooth, faut-il utiliser "SoftwareSerial BTserial(4,5);" ou juste un "Serial" ça fonctionne ? En général j'ai mis que des "SoftwareSerial" dans mes codes, mais ce n'est pas le cas dans ton projet donc ça doit bien fonctionner avec uniquement des "Serial" ? (Enfin dans les deux cas ça ne fonctionne pas chez moi...)

Artouste: c'est exactement ça, mon module BT est bien en mode slave, ça fonctionne dans le sens BT-->SD et non dans le sens SD-->BT. Cela signifie que le problème pourrait venir du RX du module BT lui-même ? Je ne suis malheureusement pas en France pour la période juillet-août, je n'ai pas de matériel avec moi et je n'arrive pas à en trouver (même le plus basique comme des résistances)... Y a-t-il une autre solution ? Merci d'avance.

Bonne journée :slight_smile:

hello
la DUE a plusieurs com série.

la 0 est celle qui communique avec le moniteur,je l'ai initialisée à 115200 bauds
la 3 dans mon cas est celle que j'ai choisie pour le blue-tooth, je l'ai initialisée à 9600 bauds

dans ton cas SoftwareSerial BTserial(4,5); me semble correct.

Asteria:
Artouste: c'est exactement ça, mon module BT est bien en mode slave, ça fonctionne dans le sens BT-->SD et non dans le sens SD-->BT. Cela signifie que le problème pourrait venir du RX du module BT lui-même ? Je ne suis malheureusement pas en France pour la période juillet-août, je n'ai pas de matériel avec moi et je n'arrive pas à en trouver (même le plus basique comme des résistances)... Y a-t-il une autre solution ? Merci d'avance.

Bonne journée :slight_smile:

bonjour
pas simple d'aider si tu n'a rien sous la main
"on" va essayer de ruser :grin:
upload le petit prog dessous
enleve tout les cavaliers de multiplexage sur le shiel BT
et connecte un fil comme indiquée par la fleche verte sur l'image.
Envoie une bonne serie de caracteres avec ton appli BT (au moins 20/30) , si le HC05 crachedu RX tu devrais voir la led13 du uno clignoter rapidement .

int nbc = 0;
int dil = 200; // pour inversion led13 tout les "dil" changements etats
int rd = 0;
void setup() {
  pinMode(2, INPUT);
  pinMode(13, OUTPUT);
  attachInterrupt(0, doEncoderA, CHANGE); // // encoder pin on interrupt 0 (pin 2 sur uno)
}

void loop() {
  rd = nbc / dil;
  digitalWrite(13, LOW) ;
  if (rd % 2 == 1) digitalWrite(13, HIGH) ;


}

// Interrupt on change
void doEncoderA() {
  nbc++;

}

Bonjour,

Désolée pour la réponse un peu tardive !
Merci pour l'astuce, j'ai bien suivi toutes les étapes mais lorsque j'envoie des caractères, la LED 13 ne clignote pas. Envoi ou pas, elle reste toujours allumée. Qu'est-ce que cela signifie ?

Bonne journée :slight_smile:

Artouste:
Envoie une bonne serie de caracteres avec ton appli BT (au moins 20/30) , si le HC05 crache du RX tu devrais voir la led13 du uno clignoter rapidement .

c'est pas plutôt la borne TX du HC05 qu'il faut relié à la pin 2 ???
perso : sur un MEGA il est dommage de ne pas utiliser un des 3 ports UART dispo à la place d'utiliser la lib SoftwareSerial

Bonjour,

Je suis désolée mais je ne comprends pas comment il est possible d'utiliser les ports UART sans la librairie SoftwareSerial... Je pensais que le multiplexage UART correspondait justement aux pins qu'on déclare en SoftwareSerial. Ce n'est pas le cas ?

Merci d'avance

non les ports série (1 a 3) du MEGA n'ont pas besoin de lib, il s'utilisent comme le port 0 par ex l'initialisation du port 1 se fait avec Serial1.begin(9600) puis pour lire Serial1.read() ... voir ici
on utilise la lib "soft" quand on a pas assez de ports "hard" (ex sur le UNO)