Accueil > ARDUINO > Android > Transmettre en bluetooth une trame ASCII (avec plusieurs informations) d’une (...)

Transmettre en bluetooth une trame ASCII (avec plusieurs informations) d’une carte Arduino vers Android

dimanche 4 décembre 2016, par thebault

Un module bluetooth HC05 ajouté à la carte Arduino permet d’obtenir 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

Le programme Arduino

Avec une carte Leonardo, le port Serie noté Rx, Tx sur les broches 0 et 1 est appelé Serial1.

Dans cet exemple, on transmet la chaine de caractères "10,20,45" sur la liaison série Serial1 (sur laquelle est connecté le module bluetooth HC05) toutes les secondes (=1000 ms).

Dans les cas pratiques, on transmettra plutôt une trame qui vienne de différents capteurs avec des valeurs qui varient mais j’ai simplifié l’exemple avec une trame fixe.

Remarque : si l’on ne veut transmettre qu’une seule valeur, il suffit d’adapter le programme suivant

  1. int a = 10;
  2. int b = 20;
  3. int c = 45;
  4.  
  5. void setup() {
  6. // put your setup code here, to run once:
  7. Serial1.begin(9600);
  8. }
  9.  
  10. void loop() {
  11. Serial1.print(a);
  12. Serial1.print(",");
  13. Serial1.print(b);
  14. Serial1.print(",");
  15. Serial1.print(c);
  16. delay(1000);
  17. }

Télécharger

L’application Android

Ces applications sont développées avec APP INVENTOR 2

1ère application : récupérer la trame

On va récupérer toutes les secondes les données transmises par bluetooth depuis la carte Arduino vers l’appareil Android. Pour cela, on utilise un timer nommé ’clock1’ qui permettra de récupérer les données toutes les 1000 ms, soit 1 s.

Le choix de la durée : dans l’exemple, on a 8 caractères à transmettre à une vitesse de 9600 bauds. Chaque caractère est codé sur 8 bit en ASCII.
Or, pour transmettre un 1 octet de donnée, il faut aussi prendre en compte les bit de start et stop de la liaison série. Donc pour 1 caractère transmis, on émet 8+1+1=10 bit
Par conséquent, la durée de la trame sera de 10x8/9600 s =8,3 ms. Même si il y a une augmentation du fait de la transmission sans fil et donc du codage par bluetooth, avec 1s on est largement au dessus de la durée de la trame.

JPEG - 308 ko
JPEG - 174.3 ko

L’élément important à comprendre est le suivant :

JPEG - 24.5 ko

Cela signifie que :

  • on appelle le client bluetooth et on lui demande de récupérer la trame de ’texte’ (=chaîne de caractères) reçue de longueur ’le nombre d’octets reçus’ (sachant qu’avec le code ASCII utilisé 1 caractère = 1 octet),
  • on affecte cette chaîne de caractères à la variable globale ’trame’

Amélioration du programme  : on voit qu’il y a un message d’erreur concernant le Bluetooth tant que l’on n’est pas connecté au module HC05.

On va modifier le programme pour récupérer la trame SI
"on est connecté" ET "il y a des données reçues"

Cela donne :

JPEG - 56.8 ko

2ème application : séparer les données reçues

JPEG - 288.6 ko
JPEG - 267.9 ko

Pour bien comprendre le processus d’analyse ("parsing") des données :

  • on récupère dans la variable ’trame’ ce qui arrive sur la liaison Bluetooth. On a donc dans notre cas du texte (c’est à dire une chaîne de caractères) qui est : trame="10,20,45"
  • on sépare (split) cette chaine aux virgules (caractère ",") et on place les résultats dans une liste, liste=(10 20 45)
  • on affecte l’élément 1 de la liste à la variable globale var1 donc : var1=10
  • on affecte l’élément 2 de la liste à la variable globale var2 donc : var2=20
  • on affecte l’élément 3 de la liste à la variable globale var3 donc : var3=45
SPIP | | Plan du site | Suivre la vie du site RSS 2.0
Habillage visuel © digitalnature sous Licence GPL