Communication moyenne distance avec le protocole Xbee

Présentation xbee

Le module xbee produit par la société Digi est une carte de communication sans fils qui utilise le protocole normalisé ZigBee (802.15.4) sur une fréquence de 2.4 GHz.

Configuration xbee avec xctu

Ressources :

Travail à faire :

  • En utilisant les modules d’adaptation ci-dessous et la notice d’utilisation de XCTU, configurer, en binôme, deux modules XBEE de façon à ce qu’ils puissent communiquer à 9600 bauds, pour éviter des perturbations entre les postes choisissez des configurations personnalisées (par exemple en modifiant le PANID). Ne modifier que le PANID
  • Vérifier en mode moniteur sur XCTU sur deux pc différents, que la communication est bien établie en mode duplex

Présentation du shield XBEE

Le module Xbee Shield de Seeedstudio permet de raccorder un module Xbee ou compatible sur une carte Nucléo ou Arduino. Deux jumpers permettent de sélectionner le port série utilisé (XB_RX et XB_TX),il faut que le code développé soit cohérent avec la configuration adoptée.

La documentation complète est consultable sur ce site :

http://wiki.seeed.cc/XBee_Shield_V2.0/

Exemple:

 

C:\Users\Patrice\AppData\Local\Microsoft\Windows\INetCache\Content.Word\xbee.jpg

Cette configuration correspond à la déclaration ci-dessous :

Serial xbee(PA_9,PA_10);

PA_9 est relié à la broche Tx de la nucléo board et Rx du module Xbee, c’est sur cette broche que circulent les données envoyées par le XBEE.

PA_10 est relié à la broche Rx de la nucléo board et Tx du module Xbee, c’est sur cette broche que circulent les données reçues par le XBEE.

  • Expliquer pourquoi PA9 et PA10 sont utilisés (voir le pinout de la carte nucleo)

Premier test

Test en émission

  • Télécharger le code ci-dessous dans une carte Nucléo
#include "mbed.h"//G com 9
Serial xbee(PA_9,PA_10); //Initalise xbee_lib
Serial pc(USBTX, USBRX); //Initalise PC serial comms

int main()
{
    pc.printf("Un simple emeteur");
    while(1) {
        for (int i=0; i<=100; i++) {
            xbee.printf ("Coucou N %d\r\n",i);
            pc.printf ("Envoie de : Coucou N %d\r\n",i);
            wait(1);
        }
    }
}

Le projet peut se trouver à https://os.mbed.com/users/rtk/code/XBEE_Simple_Emeteur/

Le premier module XBEE est inséré dans le shield pour Nucléo Board (correctement configuré) et le second reste dans le module d’adaptation.

  • Configurer PuTTY sur le PC où la carte Nucléo est connectée.

Sur un second PC insérer un module d’adaptation et lancer XCTU en mode moniteur.

Les messages doivent s’afficher à la fois sur le moniteur PuTTY et sur le moniteur de XCTU.

Test en réception

Maintenant enlever le xbee du PC et le mettre sur l’autre carte nucleo :

  • Télécharger le code ci-dessous dans une carte Nucléo
#include "mbed.h"//F com 4
Serial xbee(PA_9,PA_10); //Initalise xbee_lib
Serial pc(USBTX, USBRX); //Initalise PC serial comms

int main()
{
    char unCaractere;
    pc.printf("Un simple recepteur");
    while(1) {
        unCaractere=xbee.getc();
        pc.printf ("%c",unCaractere);

    }
}

 

Le projet peut se trouver à https://os.mbed.com/users/rtk/code/XBEE_Simple_Recepteur/

Vous devez obtenir un résultat semblable avec putty :

Pilotage à distance de led

La ligne de code ci-dessous, permet de tester si le caractère reçu par le module XBEE est un ‘R’

if (xbee.getc()==’R’)

  • En utilisant le code précédent et la ligne ci-dessus, développer un code réalisant la fonction suivante :

L’appui sur le bouton bleu de la carte nucleo N°1 (donc sous le shield xbee) inverse l’état de la led de la carte N°2. Mettre une pause après l’émission d’une seconde afin de voir l’état de la led changé.

 

Télémesure

Présentation de la norme NMEA :

La norme NMEA 0183 est une spécification pour la communication entre équipements marins, dont les équipements GPS. Elle est définie et contrôlée par la National Marine Electronics Association (NMEA), association américaine de fabricants d’appareils électroniques maritimes, basée à Severna Park au Maryland (États-Unis d’Amérique).

La norme 0183 utilise une simple communication série pour transmettre une « phrase » à un ou plusieurs écoutants. Une trame NMEA utilise tous les caractères ASCII.

Ex: $GPAAM,A,A,0.10,N,WPTNME*32

Les six premiers caractères ($GPAAM) permettent de déterminer le type de trame, les caractères suivants concernent les informations transmises.

Le caractère * indique la fin de transmission des informations et 32 indique le « cheksum » (permet de vérifier la validité de la trame), nous y reviendrons ultérieurement.

De nombreux systèmes de transmission d’informations (en dehors de la communication maritime) se sont inspirés de cette norme.

Travail à faire : envoi de mesures de capteurs

Dans cette partie vous allez envoyer les résultats de mesures de capteurs de température, pression et vitesse de rotation (valeurs simulées) à l’aide d’une communication sans fils.

Vous allez développer un code permettant de lancer la transmission d’une série de trois résultats de mesure.

Le message transmis sera le suivant :

$MOTEUR,temperature,pression,vitesse_rotation

Les variables temperature, pression et vitesse_rotation seront initialisées avec les valeurs  82, 1234 et 5678

  • Sur une carte : mettre le programme de réception de données de la partie « Test en reception »
  • Sur l’autre Nucleo, développer le code envoyant les valeurs capteurs du moteur
  • Verifier l’échange

 

La réception doit ressembler à cela :

Partie réception du texte brut

  • Ecrire le code de réception qui affiche uniquement les données :

Aide :

Voici une partie du code :

//attente de la chaine $MOTEUR
while (xbee.getc()!='$');
while (xbee.getc()!='M');
…

for (…) recu[i]=xbee.getc();
….
pc.printf("Le texte recu est %s\n\r",recu);

 

Réception et conversion en entier

Les résultats de mesure sont codés en ASCII pour la transmission, en utilisant la fonction atoi(), modifier le code précédent pour retrouver les résultats de mesure sous la forme d’entiers

  • Réceptionner la trame et convertir les données capteurs dans des variables entières.
  • Un exemple d’affichage de la réception

.

Aide : déclaration de variables

int temperature ,pression ,vitesse_rotation;
char recu[20],data1[3],data2[5],data3[5];