Accueil > ARDUINO > Android > Transmettre en bluetooth (sous la forme d’une trame ASCII) les angles (...)

Transmettre en bluetooth (sous la forme d’une trame ASCII) les angles d’inclinaison d’un appareil Android vers une carte Arduino

samedi 26 novembre 2016, par thebault

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"

JPEG - 57.6 ko

Matériel

- 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

Branchements

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)

JPEG - 60.7 ko
JPEG - 529.8 ko
Branchements avec adaptation de tension 5V vers 3.3V sur l’entrée Rx

L’application Android

Cette application est développée avec APP INVENTOR 2

JPEG - 335.7 ko
  • La trame émise lorsque l’on clique sur le bouton est de la forme : "angleX,angleY,angleZf". Le caractère "f" va permettre de détecter le fin de la trame.
  • pour les calculs des angles, voir l’article http://gilles.thebault.free.fr/spip.php?article32 , partie "Déterminer l’angle d’inclinaison autour de l’axe Y à partir de l’accéléromètre."
JPEG - 421.3 ko

Arduino

Les différents programme ont été réalisés avec une carte Arduino Leonardo.

  • La liaison série "Serial1" permet de communiquer avec le module bluetooth HC05
  • la liaison série "Serial" permet de communiquer avec le pc via le port USB afin d’afficher ce qui est reçu

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.

  1. char data;
  2.  
  3. void setup() {
  4. //Initialize serial and wait for port to open:
  5. Serial1.begin(9600);
  6. Serial.begin(9600);
  7. while (!Serial) {
  8. ; // wait for serial port to connect. Needed for Leonardo only
  9. }
  10. }
  11.  
  12. void loop() {
  13. while (Serial1.available()) {
  14. data = Serial1.read();
  15. Serial.print(data);
  16. }
  17. }

Télécharger

Lorsque l’on ouvre le moniteur série (loupe en haut à droite), on voit bien que la trame finit bien par "f" :

JPEG - 85.5 ko

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.

  1. String trame = ""; // la trame est initialisée
  2.  
  3. void setup() {
  4. //Initialize serial and wait for port to open:
  5. Serial1.begin(9600);
  6. Serial.begin(9600);
  7. while (!Serial) {
  8. ; // wait for serial port to connect. Needed for Leonardo only
  9. }
  10. }
  11.  
  12. void loop() {
  13. while (Serial1.available()) {
  14. trame = Serial1.readStringUntil('f');
  15. Serial.println(trame);
  16. }
  17. }

Télécharger

On voit que l’on affiche bien la trame à chaque fois :

JPEG - 76.8 ko

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.

  • Pour récupérer la valeur de l’angle X, on va lire la trame jusqu’au caractère ","
  • pour l’angle Y, on va aller jusqu’à la virgule suivante ","
  • pour l’angle Z, on va aller jusqu’au caractère "f".

On obtient le programme suivant :

  1. String trame = "";
  2.  
  3. void setup() {
  4. //Initialize serial and wait for port to open:
  5. Serial1.begin(9600);
  6. Serial.begin(9600);
  7. while (!Serial) {
  8. ; // wait for serial port to connect. Needed for Leonardo only
  9. }
  10. }
  11.  
  12. void loop() {
  13. while (Serial1.available()) {
  14. Serial.println("------TRAME----");
  15. trame = Serial1.readStringUntil(',');
  16. Serial.print("angle X : ");
  17. Serial.println(trame);
  18. trame = Serial1.readStringUntil(',');
  19. Serial.print("angle Y : ");
  20. Serial.println(trame);
  21. trame = Serial1.readStringUntil('f');
  22. Serial.print("angle Z : ");
  23. Serial.println(trame);
  24. }
  25. }

Télécharger

JPEG - 84.3 ko

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

  1. String trame = "";
  2. int angleX = 0; //déclaration des variables d'angle de type entier (int)
  3. int angleY = 0;
  4. int angleZ = 0;
  5.  
  6. void setup() {
  7. //Initialize serial and wait for port to open:
  8. Serial1.begin(9600);
  9. Serial.begin(9600);
  10. while (!Serial) {
  11. ; // wait for serial port to connect. Needed for Leonardo only
  12. }
  13. }
  14.  
  15. void loop() {
  16. while (Serial1.available()) {
  17. trame = Serial1.readStringUntil(',');
  18. angleX = trame.toInt();
  19. trame = Serial1.readStringUntil(',');
  20. angleY = trame.toInt();
  21. trame = Serial1.readStringUntil('f');
  22. angleZ = trame.toInt();
  23.  
  24. Serial.println("------ANGLES----");
  25. Serial.print("angle Z : ");
  26. Serial.println(angleX);
  27. Serial.print("angle X : ");
  28. Serial.println(angleY);
  29. Serial.print("angle Y : ");
  30. Serial.println(angleZ);
  31. }
  32. }

Télécharger

SPIP | | Plan du site | Suivre la vie du site RSS 2.0
Habillage visuel © digitalnature sous Licence GPL