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