Le javascript est désactivé sur votre navigateur
 
Prononcer /'po.bot/
Accueil du siteComposants et techniqueCommunicationsRéseaux ZigBee
  publication inférieure à 7 jours
  publié < 7j sous cette rubrique
     
À propos de l'article
    Publié le 17 mai 2011
    par Julien H.

    Mis à jour le 26 juin 2011
Mots-clés de cet article
    Logiciel et programmation :
    programmation , firmware ,
    Communications :
    XBee , Zigbee ,
    Composants :
    micro-contrôleur
Choisir votre langue :

XBee S2B programmables

La gamme Digi de modems Zigbee continue ses évolutions avec la série 2B (après la série 1 et la série 2). Nouveauté principale, certains S2B sont programmables. Le boitier est le même que pour les autres XBee mais il contient en plus du contrôleur radio Ember un micro-contrôleur Freescale, le MC9S08QE32CFT.

Nous l’avons testé, et même déjà utilisé pour un projet de fin d’études réalisé par deux jeunes débutants en micro-informatique. Ils nous ont impressionnés par leur volonté et leurs efforts ont été récompensés puisqu’ils sont parmi les premiers en France à pouvoir utiliser ces modems dans un produit professionnel.

Voici le résumé des opérations menées par ces étudiants de BTS de Cahors pour les mettre en œuvre.

 Matériel utilisé

- deux modems XBee PRO S2B (version XBP24BZ7WITB003)
- une carte Droids de conversion XBee-INT-USB
- un programmateur P&E USB Multilink Interface pour HCS08
- une carte Maxstream de test et de programmation USB XBIB-U

 Logiciels nécessaires

- l’environnement gratuit Freescale Code Warrior
- le logiciel Digi X-CTU

Pour plus de commodité, tous les documents sont réunis ici et les logiciels sont ici.

 Principe

Il y a en fait deux micro-contrôleurs dans le XBee S2B : le premier est appelé "RADIO" ou "HOST" dans les exemples et le programme qu’on écrit dans le second communique avec le premier via UART.

Tout le travail consiste donc à surveiller la ligne RX (sur interruption ou par interrogation continue) au cas où un autre modem XBee envoie quelque chose, et à utiliser la ligne TX pour envoyer des paquets API.

Les communications Zigbee restent gérés entièrement par le premier micro-contrôleur et ne sont donc pas à reproduire.

 Premiers pas

Il y a deux opérations possibles :
- le téléchargement d’un bootloader avec le debugger P&E
- le téléchargement d’une application avec X-CTU en mode XModem

L’exemple fournit par Digi (archive gettingstarted) permet de comprendre le fonctionnement d’un programme, et d’utiliser des fonctions toutes prêtes pour les lectures d’entrées/sorties, etc...

Par exemple, la construction d’une trame API générique contenant ce qu’on veut envoyer à un autre XBee (le contenu est passé en paramètre) :

Autre exemple, la lecture des entrées/sorties "tout ou rien" ou avec conversion analogique. Elle se fait par accès direct aux registres.

Comme pour les micro-contrôleurs AVR plus classiques, chaque port d’entrée/sortie possède trois registres :
- le registre de donnée (celui qu’on lira ou écrira dans notre programme)
- le registre de configuration de sens (entrée ou sortie)
- le registre de configuration de pull-up (pour forcer la valeur haute ou basse)

On trouve également les fonctions utiles comme la gestion de timers (il y en a 3), le dernier étant utilisé pour faire un délai simple :

On note l’opération WDR() : il s’agit du Watch Dog Reset. Dans ce type de circuit à usage professionnel, un compteur chien de garde est utilisé pour détecter un éventuel problème logiciel (une attente infinie sur un évènement qui n’a pas été détecté) et lancer un reset complet pour espérer que le redémarrage remette tout en place selon l’adage bien connu : "dans le doute, reboote". Mettre à zéro le chien de garde est donc nécessaire dès qu’on prévoit une opération lente. Il faut donc glisser des WDR() un peu partout dans son code.

 Gestion des entrées/sorties

Il y a trois variables pour chaque patte : le signal, le registre de direction et le registre de pull-up.

                                                         
/*                                 pin definitions                                 */
/*                                 *           Pin Direction of IO (Input =0)      */
/*                                 *           *             pin pullup Enable     */
/*                                 *           *             *                     */
#define IO_DIO0_ADC0_COMMISSIONING PTAD_PTAD0
#define IO_DIO0_ADC0_COMMISSIONING_D           PTADD_PTADD0
#define IO_DIO0_ADC0_COMMISSIONING_PE                        PTAPE_PTAPE0
#define IO_DIO1_ADC1               PTAD_PTAD3
#define IO_DIO1_ADC1_D                         PTADD_PTADD3
#define IO_DIO1_ADC1_PE                                      PTAPE_PTAPE3
#define IO_DIO2_ADC2               PTBD_PTBD2
#define IO_DIO2_ADC2_D                         PTBDD_PTBDD2
#define IO_DIO2_ADC2_PE                                      PTBPE_PTBPE2
#define IO_DIO3_ADC3               PTBD_PTBD5
#define IO_DIO3_ADC3_D                         PTBDD_PTBDD5
#define IO_DIO3_ADC3_PE                                      PTBPE_PTBPE5
#define IO_DIO9_ADC9_ON_SLEEP      PTAD_PTAD1
#define IO_DIO9_ADC9_ON_SLEEP_D                PTADD_PTADD1
#define IO_DIO9_ADC9_ON_SLEEP_PE                             PTAPE_PTAPE1
#define IO_DIO4_ADC4               PTBD_PTBD3
#define IO_DIO4_ADC4_D                         PTBDD_PTBDD3
#define IO_DIO4_ADC4_PE                                      PTBPE_PTBPE3
#define IO_DIO8_DTR                PTDD_PTDD5
#define IO_DIO8_DTR_D                          PTDDD_PTDDD5
#define IO_DIO8_DTR_PE                                       PTDPE_PTDPE5
#define IO_DIO11_ADC11_PWM1        PTAD_PTAD2
#define IO_DIO11_ADC11_PWM1_D                  PTADD_PTADD2
#define IO_DIO11_ADC11_PWM1_PE                               PTAPE_PTAPE2
#define IO_DIO12_CD                PTBD_PTBD4
#define IO_DIO12_CD_D                          PTBDD_PTBDD4
#define IO_DIO12_CD_PE                                       PTBPE_PTBPE4

 Programme spécifique

Pour écrire son propre programme, il est préférable de repartir de l’exemple "Transparent" fourni par Digi. Il faut alors modifier la fonction "main" pour ajouter ce qu’on souhaite faire.

Les fonctions réutilisées sont :

- TransmitData : pour envoyer un message aux autres XBee
- CheckDIO : on s’en inspire pour lire le capteur et commander la lampe

 
Répondre à cet article
Vous avez aimé cet article ? Merci de nous recommander !