Difficulté de transmission avec shield Bluetooth (hc-05)

Bonjour à tous,

Je suis confronté à un problème insoluble à mon petit niveau, et ce malgré tous les conseils que j’ai pu trouver ici ou sur le net. Les difficultés rencontrées avec des hc-05 sont visiblement nombreuses, mais ne correspondent pas à mon cas (peut-être parce que je suis le seul à avoir opter pour un shield).

Ma config : Smartphone Android 6.0 ; Arduino Uno R3 ; Shield Bluetooth V2.2 d’iteadstudios.
Le but (dans ce premier temps de prise en main du matériel) est de parvenir à échanger des datas mais aussi des commandes AT (pour configurer le module BT si besoin) entre un terminal bluetooth sur le smartphone et le hc-05, tout en espionnant ça avec le moniteur série de l’IDE Arduino. J’ai donc “branché” (par cavaliers sur le shield) le RXD sur D4, et le TXD sur D5, afin de toujours disposer de D0/D1 pour le moniteur série. Je précise que mon Uno est alimenté (et scruté) par USB.

Après quelques difficultés de débutant, je suis parvenu à émettre du texte depuis le smartphone vers l’Arduino, qui retranscrit bien tout sur le moniteur IDE (en mode DATA du hc-05). En revanche, pas moyen de faire le chemin inverse… Que ce soit par du code en dur dans l’Arduino (envoi “coucou” toutes les 5s), ou via le moniteur IDE, je ne reçois rien sur le smartphone. Je n’ai pas non plus de réponse en mode commande (le module ne renvoie pas “OK” lorsque mon smartphone lui dit “AT” par exemple).

Un des codes que j’ai tenté :

#include <SoftwareSerial.h>

SoftwareSerial BTserial(5,4);

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

void loop() {
  if (BTserial.available() > 0) {
    Serial.write(BTserial.read());
  }
  if (Serial.available() > 0) {
    BTserial.write(Serial.read());
  }

//Tentative en dur :
//BTserial.write("coucou");
//delay(5000);

}

Le fait que rien ne soit émis, ni par BTserial.write, ni par réponse à commande AT me fait plutôt penser à un problème matériel, ou de sécurité Bluetooth, ou de config du module hc-05, mais je ne vois pas comment le résoudre :confused:
Il n’est cependant pas impossible que le problème vienne de moi (j’espère en fait !).

La datasheet du shield se trouve ici (voir la 2ème partie, la 1ère concerne le hc-05 lui-même) :
http://www.selectronic.fr/media/pdf/3006-856-fiche-technique.pdf

Merci d’avance, et désolé pour ce long post !

C'est ce shield?

?

Quels sont les paramètres de configuration que vous avez appliqué?

Si vous êtes en mode data le module refuse les commandes AT, faut passer en mode commande pour cela et donc piloter ce que vous faites avec les cavaliers en utilisant des pins de votre arduino (passer la pin KEY du module BT à high de mémoire pour passer en mode commande)

Bonjour,

Oui il s'agit de ce shield.

Je commute bien de DAT à CMD selon si je teste le mode données ou commandes. Ni l'un ni l'autre mode ne me renvoie quoi que ce soit (respectivement des données ou une réponse à commande AT).
Sur le shield, je n'ai pas besoin d'utiliser une pin de l'arduino pour le KEY, je dispose du petit switch que l'on voit en bas à gauche de la photo.
En mode CMD, j'utilise mon smartphone pour lancer des AT, mais je ne reçois rien en retour. Comment lancer ces commandes depuis le moniteur IDE ? (donc sans passer par une émission BT)

Qu'entendez-vous par "paramètres de configuration" ? Du module hc-05 ? Les paramètres sont d'usine, puisque je ne parviens pas à lancer de commande AT.
Le seul "paramétrage" disponible dont j'ai connaissance est donc le switch du mode CMD/DAT et les cavaliers pour choisir les pin arduino recevant le TXD et le RXD du hc-05 (j'ai opté respectivement pour D4 et D5).

Merci pour votre réponse rapide !

Votre switch est physique donc vous êtes dans un mode ou dans l'autre (si vous pilotez ça depuis une pin alors votre arduino décidera dans quel mode se mettre)

En mode commande vous pouvez lui parler depuis l'Arduino. Le code que vous avez fonctionne pour cela: vous lisez sur le port série de la console et envoyez au module. Essayez te taper AT et retour vous devriez recevoir OK

Par contre - et c'est peut être votre pb - assurez vous de configurer votre console arduino pour qu'elle envoie aussi CR/LF à chaque fois que vous tapez entrée sur votre ordi (le pop up côté de la vitesse de la console - d'ailleurs pour votre ordi vous devriez utiliser 115200), sinon le module Bluetooth ne voit pas de commande arriver parce qu'une commande AT bien formée se termine par un retour la ligne

YES ! On progresse !
J'étais persuadé de ne pouvoir lancer des commandes que par BT :confused: Merci pour vos lumières !

Le reste était déjà OK, j'avais pensé au CR LF (mais sur le smartphone !), et à la communication plus rapide en mode CMD (38400 bauds comme recommandé dans la datasheet).

Je vais poursuivre sur cette voie pour tenter de configurer mon module (au moins son nom pour matcher avec l'appli déjà codée sous App Inventor !).

Ensuite, il me faudra comprendre pourquoi rien ne part du hc-05 vers mon smartphone... Cela peut-il venir d'une config maître / esclave incohérente par exemple ? (désolé je pars de zéro...).

Encore merci, je reprends confiance :slight_smile:

Il n'y a pas de raison que ça ne parte pas si c'est bien configuré à la bonne vitesse, Nombre de bits, etc, et que vous êtes en mode data, choisi qui est esclave, que votre Android s'est bien appairé avec votre appareil; à vérifier dans la connexion BT

Sinon vous n'êtes pas obligé de parler la même vitesse sur le port BT que sur le port série. Votre ordi sait parler vite, donc mettez Serial à 115200

Software Serial a quelques soucis quand on parle trop vite et le BT est assez lent, donc oui configurez le module à 9600 pour commencer et réglez cette viteesse côté arduino pour software Serial et côté Android pour la vitesse de communication - vous passerez à 38400 quand tout fonctionnera bien

C'est tombé en marche ! Ça me semble un peu magique tout ça.

J'ai juste lancé quelques commandes AT (mon module s'appelle désormais ArduinoBT), et lorsque je suis revenu à mon sketch d'échange, je parvenais enfin à parler dans les deux sens entre le moniteur IDE et le terminal BT du téléphone...

Entre autres choses que je dois éclaircir sur ce miracle, j'ai vu (par commande AT) que mon module hc-05 est en Slave. Or, c'est mon smartphone qui le cherche et demande la connexion. Ce qui semble désigner le hc-05 comme le maître... Est-il possible qu'il change de rôle au besoin ?

Je tente quelques modifs sur les vitesses d'échange comme vous le proposez, mais enfin, ça marche !

Je vais poursuivre mon projet plus en avant, et je reviens vers vous si je re-bloque, ou pour vous dire que c'est tout bon :slight_smile:

Vous avez sauvé mon week-end !!!

Ce qui semble désigner le hc-05 comme le maître... Est-il possible qu'il change de rôle au besoin ?

Non. Votre Android est le maître

Pour mettre le module en maître il faudrait

AT+RMAAD Efface les appareils associés (je suppose qu'il avait déjà mémorisé votre Android)
AT+ROLE=1 Passer en master 
AT+RESET Nécessaire après le changement de rôle 
AT+CMODE=1 autorise la connection à toute adresse (pas sécurisé si votre voisin vous veut du mal :) il vaut mieux mode 0 et utiliser AT+BIND=xxxxxxx pour se connecter  un appareil en particulier)
AT+INQM=0,5,5 stop la recherche d'esclaves après 5 secondes ou 5 appareils
AT+PSWD=1234 définit le code PIN. Bien sûr doit être le même sur l'esclave
AT+INIT démarre le Serial Port Profile (SPP) si votre shield sait supporter plusieurs profils pas nécessaire ici
AT+INQ Démarre la recherche

Oubliez ce que j'avais dit ci dessus pour le rôle du maître - c'était pour simplifier (je l'ai viré) vous pouvez lire cela pour plus d'info

Et voilà ! Premier projet rigolo en bluetooth terminé :slight_smile:
Vous y êtes pour beaucoup ! Encore merci.

Je me garde sous le coude vos remarques sur les maîtres/esclaves, je risque d’en avoir bientôt besoin (et j’aime bien comprendre pourquoi ça marche !).

Le principe de ce premier projet est de piloter mon ruban de LED adressables en inclinant mon smartphone. Seules quelques LED successives sont allumées. Si je penche à droite ou à gauche elles se déplacent sur le ruban (3 vitesses différentes selon l’angle). Pencher vers le haut fait évoluer la teinte. Pencher vers le bas modifie le nombre de LED allumées.

Si ça intéresse quelqu’un voici le sketch (à optimiser). J’ai dû ruser pour exploiter des bits alors que je ne peux envoyer que du texte avec ai2 (rien ne passe avec les autres formats). J’utilise donc des lettres choisies en fonction de leur code ASCII (ruse à la “Seul sur Mars” !). J’ai aussi galéré pour utiliser bitRead() sans modifier le bit lu…

#include <SoftwareSerial.h>
#include "FastLED.h"

SoftwareSerial BTserial(5,4);
CRGB leds[30];

float posit = 14.5;
int largeur = 4;
int couleur = random8();
int vitesse = 0;
int deux;
int trois;
int quatre;
int reception;

void setup() {
  FastLED.addLeds<NEOPIXEL, 8>(leds, 30);
  
  BTserial.begin(9600);
  Serial.begin(9600);
}

void loop() {
  if (BTserial.available() > 0) {
    reception = (int) BTserial.read() - 60;
  }

  if (bitRead(reception,0) != bitRead(reception,1)) {
    if (bitRead(reception,0) == 0) {
      couleur = couleur + 4;
      if (couleur > 255) couleur = 0;
    }
    else {
      largeur++;
      if (largeur == 15) largeur = 1;
    }
  }

  deux = bitRead(reception,2);
  trois = bitRead(reception,3);
  quatre = bitRead(reception,4);
  vitesse = deux + 2*trois + 4*quatre;
  
  switch (vitesse) {
    case 1:
      posit = posit - 1;
      break;
    case 2:
      posit = posit - 0.5;
      break;
    case 3:
      posit = posit - 0.1;
      break;
    case 4:
      break;
    case 5:
      posit = posit + 0.1;
      break;
    case 6:
      posit = posit + 0.5;
      break;
    case 7:
      posit = posit + 1;
      break;
  }
  if (posit > 29) posit = 29;
  if (posit < 0) posit = 0;

  for (int i=0;i<30;i++) {
    if (abs(posit - i)<largeur) {
      leds[i] = CHSV(couleur,255-map(abs(posit - i),0,29,0,255),150);
    }
    else {
      leds[i] = CRGB(0,0,0);
    }
  }

  FastLED.show();

  delay(100);
}

L’appli android est faite sur app inventor, il n’y a rien de sorcier, j’ai suivi les tuto !

Quand je pense qu’il y a quelques mois je ne savais même pas ce qu’était un Arduino… Je vais me reconvertir je crois !

A bientôt !

Bravo!!!