ZigBee Arduino : Programme de base

base-zigbee-arduino

13 mar ZigBee Arduino : Programme de base

Le programme de base est terminé (où du moins bien avancé ;) ).

L’arduino est capable de recevoir une trame de donnée via le ZigBee. Elle peut également détecter d’éventuelles erreurs dans le contenu de la trame.

L’arduino est également capable de réagir suivant certaines commandes communes envoyées via le ZigBee…


Les codes d’erreur ainsi que les numéros de commandes sont totalement factice. Mais le principe de fonctionnement est là…
 

On commence par déclarer les variables contenant les données de la trame (en global) :

// déclaration des variables globales
int IDH;
int IDL;
int CD;
int DATA[10];
int Erreur;

Ensuite, on initialise la communication ZigBee, les variables contenant les données de la trame ZigBee et on simule un message d’initialisation ZigBee :

void setup() {
 Serial.begin(9600);
 InitTrame();
 delay(1000);
 Serial.write(0x70);  // Simulation d'une commande envoyée à l'initialisation de l'arduino
}

Pourquoi j’attend 1 seconde avant d’envoyer mon premier message ?
Pour être certain que les deux cartes ZigBee ce soient bien connectée. Mais c’est inutile et sera certainement supprimé par la suite.

La fonction principale :

  • On attend de recevoir une trame
  • On récupère les données de la trame ZigBee
  • Si pas d’erreur, on analyse la commande globale
  • Si présence d’une erreur, on envoi un message d’erreur ZigBee
void loop() {
 delay(100);
 if (Serial.available()>0) {
 ReceptionTrame(); // Réception d'une nouvelle trame

 if (Erreur==0){
 GestionCommande();
 InitTrame();
 }
 else {
 EnvoiErreur();
 InitTrame();
 }
 }
}

La réception d’une trame ZigBee par l’arduino !
Comme nous l’avions décidé dans l’article Définition des trames du réseau ZigBee, une trame est constituée

  • d’un octet indiquant la commande commune (IDH)
  • d’un octet indiquant la nature de la commande (IDL)
  • d’un octet indiquant le nombre d’octet de donnée (CD)
  • et enfin des octets de données (DATA)

La fonction permet donc la réception des ces différentes informations et de générer une trame d’erreur en cas de besoin (absence d’octet…)

void ReceptionTrame() {
 IDH = Serial.read();
 if (Serial.available()>0) {
 IDL = Serial.read();
 if (Serial.available()>0) {
 CD = Serial.read();
 for (int i=0;i<CD;i++) { // réception des data de la trame
 if (Serial.available()>0) {
 DATA[i]=Serial.read();
 }
 else {
 Erreur = 0x22; // absence d'une data
 i=CD+2;
 }
 }
 }
 else Erreur = 0x21; // Absence de CD
 }
 else Erreur = 0x20; // Absence de IDL
}

Fonction permettant d’envoyer une trame d’erreur
Elle permet d’envoyer l’octet de la commande commune, l’octet de la commande ayant générée l’erreur, le nombre de data ainsi que la commande ayant provoquée l’erreur et la nature de l’erreur.

// Fonction permettant d'envoyer une trame d'erreur
void EnvoiErreur () {
 Serial.write(0xFF); // commande commune d'erreur
 Serial.write(IDH); // commande ayant générée l'erreur
 Serial.write(0x02); // nombre d'octet data
 Serial.write(IDL); // commande ayant provoquée l'erreur
 Serial.write(Erreur); // nature de l'erreur
}

Et enfin la fonction permettant de traiter la commande :

// Fonction permettant de déterminer la commande commune réceptionnée dans la trame
void GestionCommande () {
 switch (IDH) {
 case 0x61 :
 Serial.write(0x61);
 break;

 case 0x62 :
 Serial.write(0x62);
 break;

 // Commande commune non reconnue
 default :
 Serial.write(0x80);
 break;
 }

Code source en entier :

// déclaration des variables globales
int IDH;
int IDL;
int CD;
int DATA[10];
int Erreur;

void setup() {
 Serial.begin(9600);
 InitTrame();
 delay(1000);
 Serial.write(0x70);  // Simulation d'une commande envoyée à l'initialisation de l'arduino
}

void loop() {
 delay(100);
 if (Serial.available()>0) {
 ReceptionTrame(); // Réception d'une nouvelle trame

 if (Erreur==0){
 GestionCommande();
 InitTrame();
 }
 else {
 EnvoiErreur();
 InitTrame();
 }
 }
}

// Fonction permettant la réception d'une trame
void ReceptionTrame() {
 IDH = Serial.read();
 if (Serial.available()>0) {
 IDL = Serial.read();
 if (Serial.available()>0) {
 CD = Serial.read();
 for (int i=0;i<CD;i++) { // réception des data de la trame
 if (Serial.available()>0) {
 DATA[i]=Serial.read();
 }
 else {
 Erreur = 0x22; // absence d'une data
 i=CD+2;
 }
 }
 }
 else Erreur = 0x21; // Absence de CD
 }
 else Erreur = 0x20; // Absence de IDL
}

// Fonction permettant d'initialiser les données de réception de trame
void InitTrame() {
 IDH=0;
 IDL=0;
 CD=0;
 for (int i=0;i<10;i++) {
 DATA[i]=0;
 }
 Erreur=0;
}

// Fonction permettant d'envoyer une trame d'erreur
void EnvoiErreur () {
 Serial.write(0xFF); // commande commune d'erreur
 Serial.write(IDH); // commande ayant générée l'erreur
 Serial.write(0x02); // nombre d'octet data
 Serial.write(IDL); // commande ayant provoquée l'erreur
 Serial.write(Erreur); // nature de l'erreur
}

// Fonction permettant de déterminer la commande commune réceptionnée dans la trame
void GestionCommande () {
 switch (IDH) {
 case 0x61 :
 Serial.write(0x61);
 break;

 case 0x62 :
 Serial.write(0x62);
 break;

 // Commande commune non reconnue
 default :
 Serial.write(0x80);
 break;
 }
}
Be Sociable, Share!
3 Comments
  • Benchi
    Posted at 22:49h, 14 mars Répondre

    Je viens de rajouter la gestion des commandes spécifiques.
    Deux fonctions sont maintenant opérationnelles :
    – Ecriture du nom du module en EEPROM sur 8 caractères
    – Lecture du nom du module
    Tout fonctionne à merveille ;)

  • didij
    Posted at 12:06h, 18 avril Répondre

    Bonjour
    Je vous remercie pour ce partage d’information assez généreux;
    je travaille avec le Zigbee mais pas avec la carte ARDUINO; j’utilise la platine BigPic6 l’outil de développement pour PIC18F8520, mon module XBEE est relié à la carte via une liaison RS232, comme 1er essai je dois faire communiquer ce module avec un autre lié au PC via une liaison USB. Je serai grandement reconnaissante si vous pouvez m’aider à faire ce test en utilisant mikroC.

  • Benchi
    Posted at 22:08h, 18 avril Répondre

    Bonjour didij,

    Je prévois de développer ZigBee via un PIC, mais pas pour le moment.

    Le principe de fonctionnement est identique que l’on soit en arduino ou en PIC.
    Ouvrir le port RS232 et envoyer les trames…

    ;)

Post A Comment