Ceci est une ancienne révision du document !
Table des matières
Bluetooth 2.0 Module V3 For Arduino
Le Bluetooth 2.0 Module V3 For Arduino est un module bluetooth de chez DFRobot de classe 2 (portée ~10m). J'en ai acheté deux pour établir une communication entre un robot et sa télécommande.
Initialisation
Le wiki de DFRobot indique une partie de la procédure à suivre pour initialiser le module. Il faudra fouiller la datasheet du CSR B C417143, embarqué dans le TEL0026, pour trouver et comprendre les subtilités.
Prérequis pour initialiser un module
- Un USB to TTL Converter (CP210) - J'utilise un clone de celui de DFRobot.
- Un terminal série ( le logiciel arduino, minicom, … )
Procédure
Il faut mettre le module Bluetooth en “AT Mode” (voir cette photo). On peut utiliser le programme Arduino pour communiquer avec le module. Voici les paramètres qu'il faut utiliser :
Commandes AT
Listes des commandes AT
Toutes les commandes se trouvent dans la datasheet du TEL0026, voici un aperçu :
at OK at+init //initialiser le SPP OK at+name? //demander le nom du module +NAME:H-C-2010-06-01 //après une remise aux paramètres par défaut, sinon "+NAME:BluetoothV3" OK at+name=cequonveut //Donner un nom au module OK at+role? //demander le rôle du module +role:0 // 0 = slave , 1 = master OK at+role=0 //donner le rôle "slave" au module OK AT+PSWD? //Demander le mot de passe de "pairing" +PSWD:1234 OK AT+ORGL //Réinitialiser les paramètres par défaut OK AT+UART? //Demander les paramètres de l'UART +UART:38400,0,0 AT+UART=38400,0,0 //Choisir les paramètres de l'UART OK //Param1: baud rate (bits/s) 4800/ 9600/ 19200/ 38400/ 57600/ 115200/ 230400/ 460800/ 912600/ 1382400 //Param2: stop bit , 0- 1 bit/ 1- 2 bits //Param3: parity bit, 0- None/ 1- Odd/ 2- Even AT+RESET //reset du module (équivalent à l'éteindre/rallumer) Return: OK AT+ADDR? //demander l'adresse du module +ADDR:12d5:42:307864 OK AT+INQM=1,9,48 //Inquire mode: RSSI, max number 9, timeout 48) * OK AT+IAC? // +IAC:9e8b33 OK Input: AT+SENM? // +SENM:0,0 OK
Erreurs possibles
La page 16/23 du datasheet du TEL0026 donne la liste des erreurs possibles.
Error_code (hex) | Explanation ------------------------------------------------------------------------ 0 | AT command error 1 | The result is default value 2 | PSKEY write error 3 | Device name is too long (more than 32 bytes) 4 | Device name is 0 byte 5 | Bluetooth address: NAP is too long 6 | Bluetooth address: UAP is too long 7 | Bluetooth address: LAP is too long 8 | PIO port mask length is 0 9 | Invalid PIO port A | Device class is 0 byte B | Device class is too long C | Inquire Access Code length is 0 D | Inquire Access Code is too long E | Invalid Inquire Access Code F | Pairing password is 0 10 | Pairing password is too long (more than 16 bytes) 11 | Role of module is invalid 12 | Baud rate is invalid 13 | Stop bit is invalid 14 | Parity bit is invalid 15 | No device in the pairing list 16 | SPP is not initialized 17 | SPP is repeatedly initialized 18 | Invalid inquiry mode 19 | Inquiry timeout 1A | Address is 0 1B | Invalid security mode 1C | Invalid encryption mode
Configuration de deux modules
Pour faire la configuration de ces deux modules en même temps, j'ai utilisé :
- deux ordinateurs avec le logiciel arduino (mais n'importe quel programme de terminal série peut convenir)
- deux modules bluetooth (deux TEL0026 de DFRobot dans mon cas)
Cosmo (slave)
at OK at+init OK at+state? +STATE:INITIALIZED at+name=cosmo OK at+name? +NAME:cosmo at+role=0 OK at+role? +ROLE:0 at+addr? +ADDR:98d3:32:302390 at+uart=38400,0,0 OK at+uart? +UART:38400,0,0 at+iac? +IAC:9e8b33 at+cmode? +CMOD:0 at+inq OK at+bind? +BIND:0:0:0 //pas d'adresse configurée at+bind=98d3,32,20222e //"bind" avec l'adresse du module master OK at+state? +STATE:PAIRABLE
Commande (master)
at OK at+init OK at+state? +STATE:INITIALIZED at+name=commande OK at+name? +NAME:commande at+role=1 OK at+role? +ROLE:1 at+addr? +ADDR:98d3:32:20222e at+uart=38400,0,0 OK at+uart? +UART:38400,0,0 at+iac? +IAC:9e8b33 at+cmode? +CMOD:0 at+inq +INQ:98D3:32:302390,0,7FFF //le module bluetooth slave!! (adresse, classe, RSSI) at+rname?98d3,32,302390 //demander le nom du module slave +RNAME:cosmo //nom du module bluetooth slave at+bind? +BIND:98d3:31:300e42 //adresse inconnue at+bind=98d3,32,302390 //"bind" avec l'adresse du module slave OK at+bind? +BIND:98d3:31:300e42 //adresse du module slave at+pair=98d3,32,302390,30 //se connecter au module slave (avec timeout de 30s) OK at+state? +STATE:PAIRED //yes! at+mrad? //voir le dernier module connecté +MRAD:98d3:32:302390 //c'est bien le slave at+fsad=98d3,32,302390 //voir si le module slave est dans la liste des modules authentifiés OK //OK = oui at+link=98d3,32,302390 //faire le lien avec le module slave OK (réception de ce que le module slave envoit!)
Programmes Arduino
Maintenant que nous avons configurés deux modules pour qu'ils se connectent ensemble, nous pouvons les utiliser chacun sur une Arduino et faire communiquer les deux Arduino ensemble.
Mise en place
- Arduino “master” :
- Une Dreamer Nano V4.1 avec un ATmega32u4.
- Avec un shield.
TODO: Ajouter photos!
Programme "master"
/* Minimal code for testing bluetooth module TEL0026 with a button This program must be used with "bluetooth-TEL0026-robot-avec-led.ino". The circuit is based on Dreamer Nano V4.1, compatible Arduino Leonardo ( https://www.dfrobot.com/product-786.html ). TEL0026 and button are plugged on Nano I/O Shield ( https://www.dfrobot.com/product-68.html ) Created 2017 by Simon Lefort. */ int buttonPin = 8; //button is on pin 8 void setup() { Serial.begin(38400); // Serial to talk with computer via USB Serial1.begin(38400); // Serial to talk to bluetooth module TEL0026 } void loop() { int val = digitalRead(buttonPin); delay(50); if (val == HIGH) { Serial1.print("b"); //Serial.println("push"); } else { //Serial.println("no push"); } }
Programme "slave"
/* Minimal code for testing bluetooth module TEL0026 with a led. If we received "b1" by the bluetooth module, we light on the led. This program must be used with "bluetooth-TEL0026-commande-avec-bouton.ino". The circuit is based on Dreamer Nano V4.1, compatible Arduino Leonardo ( https://www.dfrobot.com/product-786.html ). TEL0026 and button are plugged on Nano I/O Shield ( https://www.dfrobot.com/product-68.html ) Created 2017 by Simon Lefort. */ int ledPin = 14; int incomingByte = 0; void setup() { Serial.begin(38400); //communicate via USB Serial1.begin(38400); //communicate via Bluetooth digitalWrite(ledPin, LOW); } void loop() { if (Serial1.available() > 0){ incomingByte = Serial1.read(); Serial.print("I received: "); Serial.println(incomingByte); if (incomingByte = 'b'){ digitalWrite(ledPin, HIGH); delay(500); } } else{ Serial.println("nothing..."); digitalWrite(ledPin, LOW); delay(500); } }
Remarques
Ça marche mais j'ai des soucis si je laisse le bouton appuyé. Ça envoie une série de caractères et le “slave” met un certain temps à la traiter. Il faut que je regarde comment améliorer ça très prochainement.
Sources
- RSSI (wikipedia.org) (mesure de la qualité du signal)