XBee API pour pilotage à distance Extrait du PoBot http://www.pobot.org XBee API pour pilotage à distance - Robopedia - Programmation - Apprendre - Communications - Réseaux ZigBee - Date de mise en ligne : samedi 14 mars 2009 PoBot Copyright © PoBot Page 1/7 XBee API pour pilotage à distance Sommaire • Principe • Matériel et circuit • TP n°1 : recevoir une informat • TP n°2 : allumer une led version mise à jour en avril 2011 Nous avons déjà utilisé précédemment les XBee très simplement pour faire une liaison série sans fil entre plusieurs modules (voir cet article), mais maintenant on va s'attaquer au mode "API" pour piloter à distance les ports entrée/sortie numérique ou analogique de plusieurs modules XBee sans utiliser de microcontrôleur supplémentaire. Cet article est le résultat de nos ateliers hebdomadaires. Nous avons tout appris de zéro concernant les XBee grâce aux différentes explications qu'on trouve sur Internet. Remercions tous ceux qui ont documenté leurs projets et qui contribuent par des fichiers, des codes sources, des articles. Parmi eux : Tom Igoe pour son livre "Making Things Talk [http://www.makingthingstalk.com]" Daniel Menesplier pour sa doc en français sur son site web [http://daniel.menesplier.free.fr/documents.htm] le wiki de l'ITP (NYU) pour son article [http://itp.nyu.edu/varwiki/BigScreens/XBee] similaire à celui-ci et qui m'a bien aidé à terminer l'expérimentation. Principe On va tester les deux sens d'accès aux données connectées sur un XBee : recevoir une information distante (patte en sortie du XBee) contrôler une led à distance (patte en entrée du XBee) Matériel et circuit Voici le matériel nécessaire pour cette manip' : Produit Quantité Fournisseur Prix modem RF XBee serie 2 Matlog [http://www.matlog.com/wireless/modules-zigbee-et-802154/] 2 x 18 1 Euros adaptateur USB / 1 Matlog [http://www.matlog.com/wireless/modules-zigbee-et-802154/cartes-interfaces-pour-modules-xbee.html] 30 Euros 1 NKC Electronics [http://www.nkcelectronics.com/breadboard-power-supply-18v—5v-185.html] $ 9.90 XBee alimentation 3,3 volts Copyright © PoBot Page 2/7 XBee API pour pilotage à distance breadboard 1 Gotronic [http://gotronic.fr/catalog/circuits/circuitframe.htm] led, résistance, bouton 1 Gotronic 8,80 Euros pression La majorité de ces produits ont été offerts au club pour ses expériences pédagogiques, merci ! On a donc : un XBee connecté par USB à un ordinateur un XBee connecté à une led (sortie) et un capteur (entrée). Voici le XBee installé sur une carte USB : Adaptateur USB "sparkfun" un des plus courants Interface XBee/USB Une autre version, cette fois de Droids.it, vendue en France par Matlog. Voici le XBee distant avec une led, un bouton et une résistance variable : Copyright © PoBot Page 3/7 XBee API pour pilotage à distance Circuit XBee On utilise une résistance variable pour tester le XBee en réception d'une valeur analogique. Notez qu'il faut une alimentation 3,3 volts. Il existe désormais de petites cartes qui permettent d'obtenir les tensions fréquemment utilisées depuis une simple alimentation secteur universelle. Alimentation 3,3 volts Très important : tension de référence Si vous souhaitez utiliser le convertisseur analogique/numérique d'un XBee, il faut absolument que vous fournissiez une tension de référence sur la patte 14 : un simple fil entre la tension d'alimentation (3,3 volts) et la patte 14 suffit. TP n°1 : recevoir une information Régler les paramètres radio Nous avions déjà vu dans un précédent article comment modifier les paramètres des modules XBee. On va donc le réutiliser pour spécifier les adresses d'émetteur, de récepteur et de réseau personnel, mais également pour régler les paramètres des pattes d'entrée/sortie du XBee. Côté PC, le XBee va tout d'abord recevoir des informations (détecteur de présence sur le XBee distant, ou interrupteur). Il n'y a donc pas d'adresse de destinataire (DL 0) donc la configuration est très simple : Commande Explication Copyright © PoBot +++ passage en mode configuration AT (sans retour chariot) ATID5555 identifiant de réseau, commun à tous les modules ATMY1234 adresse de cette carte, unique pour un même réseau ATDL0 pas de destinataire dans ce TP, XBee juste receveur ATDH0 pas de partie haute, adresse 16 bits Page 4/7 XBee API pour pilotage à distance ATWR enregistrer Côté platine d'essai, on va voir apparaitre des codes nouveaux : D0, IR, IU et IT. Il s'agit en fait de configurer le XBee pour qu'il utilise les pattes d'entrées/sorties et les envoie sur l'UART (IU à 1) puis qu'il prenne une valeur en entrée numérique sur une de ses pattes de données : D0, la patte de donnée (D) numéro zéro (0) toutes les IR microsecondes (en hexa) et qu'il envoie la valeur au XBee dont il a l'adresse en destinataire (DL et DH si besoin) au bout de IT échantillons. IR temps d'échantillonnage en millisecondes, toujours rédigé en hexadécimal IT nombre d'échantillons à envoyer (et à faire avant d'envoyer, ce qui multiplie d'autant IT par IR pour le délai entre deux envois Dx la patte utilisée et surtout le mode : 2 pour une entrée analogique, 3 pour une entrée numérique Ce qui donne dans notre cas : Commande Explication +++ passage en mode configuration AT (sans retour chariot) ATID5555 identifiant de réseau, commun à tous les modules ATMY5678 adresse de cette carte, unique pour un même réseau ATDL1234 on enverra au XBee d'adresse MY 1 (celui du dessus bien sûr) ATDH0 pas de partie haute, adresse 16 bits ATD03 patte 0 en entrée numérique ATIR64 échantillon toutes les 100 millisecondes ATIT1 un seul échantillon envoyé ATIU1 activer les envois sur l'UART des pattes I/O ATWR enregistrer Premier test Avec un simple logiciel d'écoute de la liaison série (ici, Docklight comme souvent), on peut voir que le module distant est bien en train d'envoyer une trame (qu'on appelle bizarrement API, d'où le titre de cet article) à notre module "base", et sans que le XBee base ne demande rien, ce qui peut être déroutant car on aurait pu penser que la mention "API" signifiait justement qu'il y avait des commandes d'accès aux valeurs par question/réponse (polling). Et bien non, c'est toute mon erreur et j'espère que vous n'aurez pas fait la même grâce (à votre grande intelligence ou) à cet article. Copyright © PoBot Page 5/7 XBee API pour pilotage à distance Récupération depuis un logiciel Comme le XBee "base" est connecté au port USB par une liaison série, on peut récupérer la trame et commencer à la traiter (i.e. découper et récupérer la valeur qui nous intéresse) dans un logiciel dans le langage de votre choix. J'ai choisi Java et plus particulièrement l'environnement Processing. Voici le résultat : on peut voir que j'ai déjà fait un test sur "7E" pour détecter un début de trame. Analyse d'une trame API On va analyser cette ligne : 007E 0000 000A 0083 0056 0078 0029 0000 0001 0002 0000 0003 00FF 0080 Bien sûr les 00 ne sont pas significatifs, ils sont ajoutés par la fonction Java qui transforme les caractères reçus en valeurs hexadécimales. Valeur Signification 7E octet de début de trame 00 0A la longueur (ici, 10 car on ne compte pas la valeur 51 finale, le "checksum") 83 identifiant du mode API utilisé : ici, réception en mode d'adressage 16 bits 00 02 l'adresse d'origine, c'est bien le module d'adresse MY 2 qui nous parle Copyright © PoBot Page 6/7 XBee API pour pilotage à distance 24 la force du signal ou RSSI (24 en hexa = -36 dBm donc ça augmente en s'éloignant) 00 les options (pas utilisé ici) 01 il y a un échantillon 02 00 pas encore déterminé, aidez-nous ! 03 FF la valeur reçue : 3FF = 1024 = tension de référence 51 le "checksum" pour vérifier si tout a bien été envoyé correctement Pour info, vous trouverez la documentation officielle dans ce document [http://ftp1.digi.com/support/documentation/90000982_B.pdf]. Si on fait varier la valeur de la résistance variable, on voit bien ces 2 octets varier : Utilisation d'une bibliothèque On peut également utiliser la bibliothèque décrite dans cet article car elle est dédiée à Processing même si on peut aussi utiliser une librairie Java plus commune, comme celle-ci : Java XBee API [http://code.google.com/p/xbee-api/] import processing.serial.*; import xbee.XBeeDataFrame; import xbee.XBeeReader; Serial port; XBeeReader xbee; void setup() { println(Serial.list()); port = new Serial(this,Serial.list()[2],9600); xbee = new XBeeReader(this,port); xbee.startXBee(); } void xBeeEvent(XBeeReader xbee) { XBeeDataFrame data = xbee.getXBeeReading(); if (data.getApiID() == xbee.SERIES1_IOPACKET) { int analogVal = data.frameData[8] * 256 + data.frameData[9]; println("A: "+analogVal); } else { println("Non supporté"); } } void draw() { } Je dois à la vérité dire que cette bibliothèque n'a pas très bien marché pour la lecture des valeurs analogiques, j'ai donc simplement récupéré les 2 octets 8 et 9 du tableau de 10 (rappelez-vous, 0A), et je les ai ajouté avec une multiplication par 256 pour l'octet le plus haut (2^8 = 256). TP n°2 : allumer une led Copyright © PoBot Page 7/7