Arduino et bluetooth (HC-06 ou HC-05)

Pour beaucoup d’applications, il est utile de déconnecter l’arduino de l’ordinateur pour lui donner de la mobilité. Je veux donc pouvoir utiliser des applications android permettant de commander un montage arduino. Dans cette première partie d’une série () sur le bluetooth et arduino, j’explique comment régler les modules HC-O6 ou HC-05 (commandes AT). 

Les modules bluetooth HC-05 et HC-06

Il existe deux sortes de module bluetooth, tous deux compatibles arduino et utilisables sur un breadboard (plaque d’essai en français). On les distingue par le nombre de pattes d’entrées / sorties :

  • HC-05 : 6 sorties. Ce module peut être « maître » (il peut proposer à un autre élément bluetooth de s’appairer avec lui) ou « esclave » (il ne peut que recevoir des demandes d’appairage). Ce module fait l’objet d’un autre article car il y a quelques différences pour le régler.
  • HC-06 : 4 sorties. Ce module ne peut être qu’esclave. C’est ce module que nous utilisons dans cet article.

Les deux modules peuvent être utilisés en mode COMMANDE, pour les programmer avec des « commandes AT »,ou en mode DATA, pour échanger des données.

Le montage pour HC-06

Noter que TXD et RXD du module BlueTooth HC-06 doivent être « inversés » : TXD arrive au port RX de l’arduino (soit le port #3 dans les sketch qui suivent) et RXD au port TX de l’arduino (#2 ici).

Noter aussi le diviseur de tension pour la liaison RXD à TX (#2) : la tension d’entrée des données doit être de l’ordre de 3.3V et non 5V.

Schéma des connexions

Attention, à chaque fois qu’on téléverse un nouveau sketch dans l’arduino, par la connexion USB de l’ordinateur à l’arduino, il faut déconnecter RX. Durant le téléversement l’arduino ne doit avoir qu’une seule connexions série. 

Commandes AT pour module bluetooth HC-06

Par défaut les modules HC-06 sont réglés sur une vitesse de 9600 bauds. C’est donc la vitesse de communication que l’on choisira pour ce programme lorsqu’on l’utilise sur un module qu’on vient d’acheter.

Le sketch est fortement inspiré de l’article « Module bluetooth JY-MCU V1.04 pour Arduino« .

Le sketch complet est disponible ici, sur GitHub. Voici quelques explications sur son fonctionnement.

ATTENTION !!! Pour que ce sketch fonctionne, le module HC-06 ne doit PAS être appairé (sa led doit clignoter). 

#include <SoftwareSerial.h>  demande à l’arduino d’utiliser la librairie SoftwareSerial.h, nécessaire pour que l’arduino puisse utiliser deux connexions séries distinctes, l’une avec le PC, l’autre avec le module BlueTooth. J’en explique le fonctionnement plus bas.

Dans notre cas, la liaison série entre arduino et module bluetooth s’appelle BTSerie , tandis que celle entre l’ordinateur et l’arduino s’appelle Serial .

On utilise l’ordinateur pour taper les commandes. La console doit être réglée (en bas à droite), à la même vitesse que celle indiquée dans Serial.begin(). Et le réglage à côté doit être sur « Pas de fin de ligne« .

Si je tape AT , l’arduino répond « OK ».

Si je tape AT+NAMEname , l’arduino répond « OKSetname » et le module bluetooth prend le nom « name ».

Enfin si je tape AT+BAUD9 , l’arduino répond « OK230400 », ce qui signifie que le module bluetooth a reçu l’instruction de se régler à une vitesse de 230 400 bauds. 9 peut être remplacé par 1 à 8 ou A, B, C. Les vitesses correspondantes sont :

code Vitesse (bauds)
1 1 200
2 2 400
3  4 800
4  9 600
5  19 200
6 38 400
7 57 600
8 115 200

Attention, on peut régler le module bluetooth à des vitesses supérieures à 115 200 bauds mais dans ce cas on ne peut pas utiliser un arduino car il ne peut pas dépasser cette vitesse.

Pour plus de détails sur toutes les commandes disponibles, voir ce pdf en ligne.

La boucle de notre sketch contient les éléments suivants :

void loop()  
{  
  char recvChar;  
  //On lit caractere par caractere sur le BTSerie et on affiche sur le Terminal Serie  
  if (BTSerie.available()) {  
    recvChar = BTSerie.read();  
    Serial.print(recvChar);  
  }  
  // Serial.write(blueToothSerial.read());  
  if (Serial.available()) {  
    recvChar = Serial.read();  
    BTSerie.write(recvChar);  
  }  
}

la première partie lit le contenu de ce qui est transmis par le module bluetooth via BTSerie.read() puis l’imprime sur la console de l’ordinateur.

La seconde partie lit ce qui est écrit dans la console de l’ordinateur par l’utilisateur et l’envoie au module bluetooth.

Nos commandes AT sont ainsi transmises au module Bluetooth et sa réponse est affichée sur la console arduino de l’ordinateur.

Les commandes sont appliquées lorsque le module est éteint puis rallumé.

Montage pour HC-05

On utilise presque le même montage que ci-dessus, à 3 différences près :

  • on n’utilise pas de résistances diviseuses de tension (rien ne prouve que c’était indispensable dans le montage du HC-06)
  • Le HC-05 a 6 pattes au lieu de 4, avec en plus STATE, que l’on n’utilise pas, et EN ou KEY, que l’on connecte à la sortie 3.3V de l’arduino.
  • On doit appuyer sur le petit bouton poussoir au dessus de la patte EN (ou KEY) lorsqu’on met l’arduino sous tension. Sinon, la led du HC-05 clignote rapidement, ce qui signifie qu’elle cherche à s’appairer et pas du tout à recevoir des commandes AT. Si le démarrage est correctement fait la led du HC-05 clignote lentement, toutes les 2 secondes environ.

Commandes AT pour le module HC-05

Le sketch ci-dessus ne fonctionne pas avec un HC-05, même démarré correctement (la led clignote lentement) pour 3 raisons :

  • les commandes AT ne sont pas strictement identiques (noter le ? à la fin de BTSerie.print(« AT+VERSION? »);  et l’existence de la ligne BTSerie.print(« \r\n »);  juste après  ;
  • la vitesse par défaut d’un HC-05 est 38 400 bauds et pas 9 600 comme pour le HC-06 ;
  • La console série de l’ordinateur d’où l’on envoie les commandes AT ne doit pas être réglée pareil : elle doit être réglée de telle sorte que les fins de ligne soient « les deux, NL et CR », ce qui revient à envoyer \r\n à la fin de chaque commande.

Réglage de la console série de l'arduino avec HC-05

Le sketch qui fonctionne est disponible ici (Sketch Bluetooth HC-05 pour commandes AT (.ino)) ou sur github.

Lorsque tout est correct, la console série sur l’ordinateur affiche les éléments suivants :

Bonjour - Pret pour les commandes AT
Le HC-05 doit clignoter lentement (2 secondes)
-1+VERSION:2.0-20100601
OK

Les deux dernières lignes correspondent au retour du module bluetooth provoqué par cette partie du sketch :

BTSerie.print("AT+VERSION?"); //Demande le N° de version
BTSerie.print("\r\n"); // sur HC-05, terminer par \r\n
Serial.print( BTSerie.read() );  // afficher sur console ce qui est lu sur BT

Les commandes AT utilisables avec un HC-05

Des « questions » au module, avec les réponses associées :
  • AT : si tout va bien, le module répond OK
    AT+NAME? : le nom du module + OK
    AT+VERSION? : Sa version + OK
    AT+UART? : sa vitesse, et OK (par exemple +UART:38400,0,0  )
    AT+ROLE?: Son rôle (1=master /0=slave)
    AT+PSWD?: le mot de passe (en général +PSWD:1234  ) lorsque le mot de passe par défaut (1234) a été conservé.
Des ordres au module

Pour plus d’informations, voir ce pdf ici.

  • AT+NAME=NoRobo-HC-05 –> OK mais bizarrement AT+NAME? ne dit pas quel est le nom du module
  • AT+UART=57600,0,0 règle la vitesse à 57600 bauds et AT+UART? renvoie bien +UART:57600,0,0

Les commandes sont appliquées lorsque le module est éteint puis rallumé.

HC-05 visible d'un appareil androidLorsque je rallume mon circuit (sans appuyer sur le bouton du HC-05 !), la led du hc-05 clignote rapidement et mon téléphone android voit bien un appareil nommé NoRobo-HC-05 ! Tout est donc parfait.

Conclusion de ce premier article

Maintenant que nous avons réglé le module bluetooth (HC-05 ou HC-06) à une vitesse de 57 600 bauds et lui avons donné un nom, il est temps d’aller voir comment utiliser une application android avec notre montage arduino. Ce sera l’objet du deuxième article de cette série () sur le bluetooth et arduino.

26
Poster un Commentaire

avatar
  S’abonner  
plus récent plus ancien Le plus populaire
Notifier de
charles
Invité
charles

bonjour,
est il possible de brancher une prise femelle usb directement au module bluetooth (HC-06 ou HC-05)?
si oui comment faire sinon je souhaiterais une autre solution
cordialement
charles

Pierre-Louis
Invité
Pierre-Louis

Anne-Laure va commencer à croire que je squatte son site… Mais voila les dernières trouvailles et elles sont surprenantes… 1) Le HC-06, une fois paramétré, garde ses réglages. Donc si je lance le Sketch la toute première fois je vais faire BTSerie.begin(9600); puisque le HC est à cette vitesse (apparemment) en sortie d’usine. Si ensuite je fait un AT+BAUD5, il va passer à 19200 bauds. Si maintenant je relance le Sketch, je ne pourrais plus régler le HC. Pour pouvoir à nouveau le régler, il faudra modifier le Sketch pour mettre BTSerie.begin(19200); donc la vitesse actuelle du HC. 2) Ayant… Lire la suite »

Pierre-Louis
Invité
Pierre-Louis

Bon, en fait ça ne marche pas super bien… Si on veut comprendre ce qui se passe, il suffit de modifier la partie du sketch qui lit le port série et qui envoi au Bluetooth. Au lieu d’envoyer directement le caractère au Bluetooth, on le renvoi d’abord au terminal pour voir ce que l’Arduino a reçu. On va alors constater un truc bizarre: le Bluetooth commence à répondre AVANT d’avoir reçu toute la commande. Ainsi, si je tape « AT+VERSION? » et que je « échoe » ce que j’envoi + ce qu’il répond, je vois s’afficher « AT+OVKERSION? ». En clair, dés que le HC… Lire la suite »

martin
Invité
martin

J’ai pas mal réfléchis cette nuit et je pense avoir un début de réponse si ça peut vous aider. Il semblerais qu’une fois le message envoyé, l’arduino y obéit jusqu’à ce qu’il y ai un nouvel ordre. Je pense donc qu’il faudrait que l’arduino génère à intervalle régulier l’ordre précédemment donné. j’ai tenté ce changement pour arriver à cette conclusion: while (BluetoothData == ‘1’) { digitalWrite(trig, HIGH); //partie du programme qui me delayMicroseconds(10); //permet de calculer une distance digitalWrite(trig, LOW); //… lecture_echo = pulseIn(echo, HIGH); //… cm = lecture_echo / 58; //… if (cm<50){ digitalWrite(motor1Pin1, LOW); digitalWrite(motor1Pin2, LOW); digitalWrite(motor2Pin1, LOW);… Lire la suite »

martin
Invité
martin

Bonjour,
Ce tutoriel est très bien fait merci beaucoup.
Il y à peu j’ai fais un véhicule commandé par bluetooth, il fonctionne très bien mais j’ais voulus avec un module HC-SR04 faire que mon véhicule s’arrête si un objet se trouve proche de lui (une sorte de sécurité en gros).
Seulement, la télécommande bluetooth n’est pas désactivé par l’arduino et mon véhicule ne s’arrête pas.
Est-ce que vous savez comment faire pour que l’ordre bluetooth ne soit pas obéit.
cordialement

Julie
Invité
Julie

Bonjour,
Comment récupérer des images à travers un HC-06 svp?
Merci d’avance

Marion
Invité
Marion

Bonjour,

J’ai effectué la même démarche pour le HC 05 mais sur le moniteur série j’ai tout jusqu’ à « -1 » uniquement. Aprés rien du tout quel est le problème svp?

Mercii

Anatyber
Invité
Anatyber

Bonjour, merci pour ce tuto très bien expliqué !
J’ai actuellement un hc-06 et un hc-05 que j’aimerais connecter ensemble pour pouvoir faire communiquer deux arduino(s) grâce à une liaison série. Le hc-06 serai esclave et le hc-05 serai maître, mais comment puis-je les associer ?
Que faut-il faire pour gérer le connexion et l’association automatique des que les deux modules sont alimenté?
Pas de soucis pour contrôler une led avec un smartphone, mais je n’ai aucunes idées pour connecter deux modules ensemble.
Bien à vous.

Raphael
Invité
Raphael

Bonjour,

Tout d’abord, merci pour ce tuto, il me sera bien utile 🙂
J’aurais aimé savoir quel est la version du protocole bluetooth géré par les modules HC-05 et HC-06?

elektrax
Invité
elektrax

bonjour,
a propos de l’ ino hc06
schema avec le hc06 pretant a confusion :
dans le sketch disponible sur github, vous déclarez la pin2 en INPUT
donc la pin 2 arduino doit recevoir les data du hc06 ligne tx de celui-ci
les fleches indiquent que rx pin 0 d’arduino devient pin3 avec sofwaresérial,
dans l’en tete de l’ino le plan de cablage indiqué est correct
* cablage btooth -> arduino
* VCC –> +5V
* GND –>GND
* TXD –> Pin 2 (RX)
* RXD –> Pin 3 (TX)
inutile de pinmode dans le setup
//pinMode(RxD, INPUT);
//pinMode(TxD, OUTPUT);
softwareserial le fait automatiquement

cordialement