Accueil > ARDUINO > Android > Transmettre en bluetooth (sous la forme d’une trame ASCII) les angles (...)
samedi 26 novembre 2016, par
Un module bluetooth HC05 ajouté à la carte Arduino permet d’ajouter des commandes wireless assez facilement pour les cartes ARDUINO. Le module HC05 utilise le profil spp de type HC05 (ou HC06).
Pour dialoguer avec ces modules depuis arduino, on utilise la liaison série.
Le code d’appairage par défaut de ces modules est "1234".
Dans cet exemple, lors de la communication Bluetooth, l’appareil Android aura le rôle "Master" et le module HC05 aura le rôle "Slave"
une carte arduino UNO ou LEONARDO,
un module bluetooth HC05 (soudé sur support),
une plaque d’essai, 2 résistances (1K et 2,2k) et des câbles,
un appareil avec ANDROID et accéléromètre
Le module HC05 fonctionne en 3,3V (cf datasheet). On trouve pas mal de montage sur internet où il n’y a pas d’adaptation de niveau entre les signaux venant de la carte Arduino et le module HC05. Cependant, je préfère adapter les niveaux pour ne pas "stresser" le module :
avec un pont diviseur de tension (1K, 2,2K) pour la transmission Tx -> Rx de l’Arduino vers le module HC05,
inutile de "remonter" les niveaux de 3,3V à 5V pour la transmission Tx -> Rx du module HC05 car ces derniers fournissent une tension suffisante (une entrée du côté arduino est vue comme un niveau 1 si le signal est > à 0,6xVcc ; c’est à dire 3V)
Cette application est développée avec APP INVENTOR 2
Les différents programme ont été réalisés avec une carte Arduino Leonardo.
Recevoir et afficher les caractères reçus
On lit les données reçues sur le port série "Serial1" et on transmet ces infos sur le port "Serie". Les données reçues sont de type char.
char data; void setup() { //Initialize serial and wait for port to open: Serial1.begin(9600); Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } } void loop() { while (Serial1.available()) { data = Serial1.read(); Serial.print(data); } }
Lorsque l’on ouvre le moniteur série (loupe en haut à droite), on voit bien que la trame finit bien par "f" :
Afficher la trame complète.
Dans le programme suivant, on utilise la fonction Serial.readStringUntil(’f’) qui va permettre de recevoir dans la chaine de caractère trame (voir string) l’ensemble des caractères (type char) jusqu’au caractère ’f’ exclus.
String trame = ""; // la trame est initialisée void setup() { //Initialize serial and wait for port to open: Serial1.begin(9600); Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } } void loop() { while (Serial1.available()) { trame = Serial1.readStringUntil('f'); Serial.println(trame); } }
On voit que l’on affiche bien la trame à chaque fois :
Afficher chaque angle séparément
Pour lire la trame et séparer chaque élément, on utiliser à nouveau la fonction readStringUntil(). on sait que la trame est de la forme suivante :
angleX,angleY,angleZf.
On obtient le programme suivant :
String trame = ""; void setup() { //Initialize serial and wait for port to open: Serial1.begin(9600); Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } } void loop() { while (Serial1.available()) { Serial.println("------TRAME----"); trame = Serial1.readStringUntil(','); Serial.print("angle X : "); Serial.println(trame); trame = Serial1.readStringUntil(','); Serial.print("angle Y : "); Serial.println(trame); trame = Serial1.readStringUntil('f'); Serial.print("angle Z : "); Serial.println(trame); } }
Afficher les angles sous la forme d’entiers (type int)
Jusqu’à présent, nous avons affiché du texte (type string). Si l’on veut faire des calculs, des tests, on va convertir le texte en entiers (type int).
Pour cela, on utilise la fonction String.toInt().
Remarque : Cela ne change rien à l’affichage au niveau de la console série, mais c’est indispensable si on veut utiliser ces valeurs par la suite
String trame = ""; int angleX = 0; //déclaration des variables d'angle de type entier (int) int angleY = 0; int angleZ = 0; void setup() { //Initialize serial and wait for port to open: Serial1.begin(9600); Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } } void loop() { while (Serial1.available()) { trame = Serial1.readStringUntil(','); angleX = trame.toInt(); trame = Serial1.readStringUntil(','); angleY = trame.toInt(); trame = Serial1.readStringUntil('f'); angleZ = trame.toInt(); Serial.println("------ANGLES----"); Serial.print("angle Z : "); Serial.println(angleX); Serial.print("angle X : "); Serial.println(angleY); Serial.print("angle Y : "); Serial.println(angleZ); } }