Coupler deux modules Bluetooth

Matériel nécessaire :

Module Bluetooth HC-05

Le module Bluetooth HC-05 présente 6 broches pour permettre d’établir la connexion.

 

  • VCC broche d’alimentation. Typiquement connectée à la broche 5V de l’Arduino.
  • GND masse. Typiquement connectée à la broche GND de l’Arduino
  • RX broche de réception. Typiquement connecté à la broche de transmission (TX) de l’Arduino
  • TX broche de transmission. Typiquement connecté à la broche de réception (RX) de l’Arduino
  • State retourne 1 lorsque le module est connecté
  • Key ou EN doit être alimentée pour entrer dans le mode de configuration et ne doit pas être connecté pour être en mode communication.

Schéma de câblage pour la configuration :

             Avant de téléverser le programme et voir le fonctionnement, on doit configurer chaque module bluetooth soit comme Slave ou Master .

Nous utilisons les broches 2 et 3 pour la communication série avec Arduino UNO et la broche Key/EN doit être alimenter à 3V à l’allumage du module.

 

 

 

 

                       Pour la configuration nous utilisons la librairie SoftwareSerial.h ;elle  permet de créer un port série autre que celui utilsé par le port USB. 

Le code suivant permet de modifier les paramètres du module HC-05 (nom, le code PIN, la vitesse de communication(baudrate), etc.) et de trouver des informations comme le numéro de version du firmware.

Nous utilisons la librairie SoftwareSerial.h qui permet de créer un port série autre que celui utilisé par le port USB.

 

 

 

#include <SoftwareSerial.h>

#define rxPin 2

#define txPin 3

#define baudrate 38400

String msg;

SoftwareSerial hc05(rxPin ,txPin);

void setup()

{            pinMode(rxPin,INPUT);

               pinMode(txPin,OUTPUT);

                Serial.begin(9600);

 Serial.println(« ENTER AT Commands: »);

               hc05.begin(baudrate);

}

void loop()

{             readSerialPort();

                 if(msg!= » ») hc05.println(msg);

                 if (hc05.available()>0)

{

                 Serial.write(hc05.read());

   }

}

void readSerialPort(){

 msg= » »;

while (Serial.available())

       {

  delay(10); 

               if (Serial.available() >0)

 {

                char c = Serial.read();  //gets one byte from serial buffer

                 msg += c; //makes the string readString

  }

        }

}

 

 

 

 

Note :Lorsque le module est en mode configuration, la LED s’allume deux secondes toutes les deux secondes.

 

 Certaines commandes AT nécessaires:

 

 

  • Pour tester la communication, tapez AT dans le monitor série de l’IDE Arduino. Si tout va bien, le module doit répondre OK.
  • Pour modifier le nom du module, tapez AT+NAME=<Param> Le module devrait répondre OK. (Ex: Pour changer le nom du module en BTM1 tapez AT+NAME=BTM1)
  • Pour modifier le code PIN du module, tapez AT+PSWD=<Param>. Le module devrait répondre OK. (Ex: si vous voulez changer le PIN en 0000 tapez AT+PSWD=0000)
  • AT+ROLE=<Param>pour modifier le role du module esclave ou maître (Ex: pour passer le module en maître AT+ROLE=1).
  • Pour modifier la vitesse de communication du module (seulement si nécessaire), tapez AT+UART=<Param1>,<Param2>,<Param3>avec Param1, 2 et 3 les paramètres de communication série: le baud rate, le bit d’arrêt et le bit de parité  respectivement. (Par défaut, 9600,0,0. Ex: si vous voulez changer le baudrate en 115200 tapez AT+UART=115200,0,0).

Si vous tapez dans le moniteur série AT+<command> (assurez vous que l’option de fin de ligne affiche « Nouvelle ligne »  et que le baudrate est réglé à 9600.) vous obtenez la valeur enregistré dans le module

 (ex: AT+PSWD pour connaitre le code PIN du module).

  • Si vous entrez la ligne AT+<command>=<Param>, vous définissez la valeur du module (ex: AT+PWSD=0000 pour modifier le code PIN en 0000).

la première étape c’est de changer le nom en tapant AT+NAME=HC05-Slave et choisir les paramètres de communication et le mot de passe que vous voulez.

Il faudra vous assurer qu’ils sont les mêmes que pour le module maître( le mot de passe je veux dire ).

  • AT retourne OK
  • AT+NAME=HC05-Slave
  • AT+UART=9600,0,0
  • AT+ROLE=0
  • Entrez AT+ADDR pour obtenir l’adresse du module esclave (a enregistrer dans un fichier Word ou note)

Pour le mode maître, vous devez modifier le role du module et choisir les même paramètres de communication que pour le module esclave

  • AT retourne OK
  • AT+NAME=HC05-Master
  • AT+UART=9600,0,0
  • AT+ROLE=1
  • Vous devez enregistrer l’adresse du module esclave (vous la copiez  depuis le fichier word que vous avez déjà créé )pour que le module maître puisse s’appairer: AT+BIND=98d3,32,21450e (remplacez les deux points « : » par des virgules « , »)

 


Schéma de câblage pour la communication :

                    

 

                Ci-dessous le schéma et le programme ,pour soit transmettre un message d’un côté a un autre (partie 1),ou rajouter un bouton du côté du maître et une LED de l’autre côté (partie2).

 

 

                        Lorsque les modules sont configurés, vous débranchez la pin Key ou EN,

 

 

Quelques fonctions :

 

 

  • SoftwareSerial hc05(Rx,Tx) pour définir le port série et les broches servant à la communication
  • begin() pour définir la vitesse de communication
  • available() pour tester si des données sont disponible dans le buffer du port série
  • read() pour lire les données du port série, un octet à la fois
  • print() pour envoyer une chaine de caractères en ASCII
  • write() pour envoyer des données, un octet à la fois.
  • flush() pour vider les données du buffer.

Chargez les codes suivant dans deux cartes Arduino et rallumer vos modules HC-05 pour entrer en mode communication.

Partie 1: Transmettre un message (Serial monitor)

#include <SoftwareSerial.h>

SoftwareSerial ArduinoMaster(2,3);

String msg;

 

void setup()

{

 Serial.begin(9600);

 ArduinoMaster.begin(9600);   

}

void loop(){

 readSerialPort();

 

 // Send answer to master

 

 if(msg!= » »)

{

   Serial.print(« Master sent :  » );

   Serial.println(msg);

   ArduinoMaster.print(msg);

   msg= » »;

 }

}

void readSerialPort()

{

while (ArduinoMaster.available()) {

  delay(10);

  if (ArduinoMaster.available() >0) {

    char c = ArduinoMaster.read();  //gets one byte from serial buffer

    msg += c; //makes the string readString

  }

}

ArduinoMaster.flush();

}

#include <SoftwareSerial.h>

SoftwareSerial ArduinoSlave(2,3);

String answer;

String msg;

 

void setup()

{

 Serial.begin(9600);

 Serial.println(« ENTER Commands: »);

 ArduinoSlave.begin(9600);

 

}

void loop()

{

 //Read command from monitor

 readSerialPort();

 

 

 //Read answer from slave

  while (ArduinoSlave.available()) {

 

  delay(10); 

  if (ArduinoSlave.available() >0) {

    char c = ArduinoSlave.read();  //gets one byte from serial buffer

    answer += c; //makes the string readString

  }

}

 //Send data to slave

 

 if(msg!= » »){

   Serial.print(« Master sent : « );

   Serial.println(msg);

   ArduinoSlave.print(msg);

   msg= » »;

 }

 

 


Partie 2: Bouton(Master) et LED(Slave)



#include <SoftwareSerial.h>

#define ledPin 8

int dataFromMaster = 0;

SoftwareSerial ArduinoMaster(2,3);

 

void setup()

{

   pinMode(ledPin, OUTPUT);

   digitalWrite(ledPin, LOW);

   Serial.begin(9600);

   ArduinoMaster.begin(9600);

}

void loop()

{  

          if(ArduinoMaster.available() > 0)

                   {

                   dataFromMaster = ArduinoMaster.read();

                   ArduinoMaster.println(dataFromMaster);

                  }

 

          if (dataFromMaster == ‘0’)

                 {

                  digitalWrite(ledPin, HIGH); // LED ON

                

                  }

         else if (dataFromMaster == ‘1’)

                 {

                  digitalWrite(ledPin, LOW); // LED    OFF

                  }

 

}

#include <SoftwareSerial.h>

SoftwareSerial ArduinoSlave(2,3);

#define masterSwitchPin 9

 

void setup()

{

  pinMode(masterSwitchPin, INPUT);

  digitalWrite(masterSwitchPin,LOW);

  Serial.begin(9600);

  ArduinoSlave.begin(9600);

}

 

void loop()

{

 int masterSwitchValue = digitalRead(masterSwitchPin);

 

      if (masterSwitchValue == HIGH)

      {

       ArduinoSlave.write(‘1’);

       }

 

       else

       {

         ArduinoSlave.write(‘0’);

       } 

 

}