Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Communications > Réseaux ZigBee > XBee API pour pilotage à distance

XBee API pour pilotage à distance

samedi 14 mars 2009, par Julien H.

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"
 Daniel Menesplier pour sa doc en français sur son site web
 le wiki de l’ITP (NYU) pour son article 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 1 2 2 x 18 €
adaptateur USB / XBee 1 30 €
alimentation 3,3 volts 1 NKC Electronics $ 9.90
breadboard 1 Gotronic 8,80 €
led, résistance, bouton pression 1 Gotronic

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 :

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
+++ 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
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.

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
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.

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


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

Portfolio

Vos commentaires

  • Le 31 octobre 2009 à 11:31, par ? En réponse à : XBee API pour pilotage à distance

    Bonjour,

    Un grand merci pour cet article qui m’a donné l’envie de tester ces fabuleux petits XBEE. Quand pensez-vous écrire la suite de cet article ?????

    Merci.

    • Le 1er novembre 2009 à 19:29, par Julien H. En réponse à : XBee API pour pilotage à distance

      Quand il y aura des participants motivés pour écrire l’article :) Tout le monde est le bienvenu pour publier sur notre site les résultats de ses tests.

    • Le 2 janvier 2010 à 17:04, par Julien H. En réponse à : XBee API pour pilotage à distance

      C’est parti, j’ai enfin un peu de temps pour expliquer. Dommage que personne n’ait participé en complétant cet article, même parmi nos lecteurs, à distance c’est possible.

    • Le 9 mai 2017 à 22:07, par dhouha En réponse à : XBee API pour pilotage à distance

      Bonsoir, je voulais stocker les informations collectées par le coordinateur dans un cloud et les recuprer plus tard pour les utiliser.Avez-vous une idée sur ça ?

    • Le 1er juin 2017 à 15:57, par Eric P. En réponse à : XBee API pour pilotage à distance

      La question est un peu vague. Tout dépend de la manière donc vous récupérez ces informations et quelles sont elles.
      Et que veut dire "stocker dans le cloud" ? Si les données sont collectées dans un fichier, "stocker dans le cloud" n’est rien de plus que copier ce fichier sur Dropbox ou semblable par exemple.
      Cordialement

    Répondre à ce message

  • Le 5 novembre 2010 à 14:48, par ? En réponse à : XBee API pour pilotage à distance

    Merci beaucoup pour ces réalisations et explications qui m’ont permis de commencer : la doc livrée avec le Kit XCTU est nulle ! J’apporte ma contribution à la question soulevée :
    "...
    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 ! " . La réponse est disséminée dans la Doc de ref. Product manual v1.xAx... en pages 56 et pages 12 qu’il faut concaténer : en fait ces bits de fin de trames sont :le nombre de samples + 2 bytes indiquant quelle sortie est active (Logique ou Anal.) puis 2 bits de la valeur ércupérée sur cette entrée.
    JL Pillet

    Répondre à ce message

  • Le 15 octobre 2012 à 12:36, par David57 En réponse à : XBee API pour pilotage à distance

    Bonjour,
    je me lance dans l’acquisition de modules XBee pour développer un peu la domotique de ma maison.
    Retour d’expérience d’ici peu

    Répondre à ce message

  • Le 12 mai 2009 à 17:22, par ? En réponse à : XBee API pour pilotage à distance

    Bonjour,

    Vous parlez d’utiliser les entrées analogiques du module xbee. J’ai effectué quelques recherches sur ce sujet et je ne trouve pas comment les utilisés.

    Existe t’il une commande qui permet de récupérer la valeur d’une entrée analogique sur un xbee distant ?

    Merci par avance pour votre réponse

    • Le 13 mai 2009 à 09:46, par Julien H. En réponse à : XBee API pour pilotage à distance

      Nous allons détailler plus en détail la manip’, à suivre.

    • Le 13 octobre 2009 à 11:57, par ? En réponse à : XBee API pour pilotage à distance

      salut j’aimerais bien savoir comment allumer une Led à distance avec le module Xbee série 2 Merci

    • Le 13 octobre 2009 à 21:28, par Julien H. En réponse à : XBee API pour pilotage à distance

      il faut connecter la led entre une patte DIO (data input/output) du XBee et la tension d’alimentation avec une résistance, et configurer cette patte en sortie numérique (digital output).

    • Le 22 mai 2012 à 23:36, par yann En réponse à : XBee API pour pilotage à distance

      bonjour. j’ai mis en place une liaison xbeeA (module usb + modem xb 24) et xbeeB (module rs232 + modem xb24.)

      le parametrage indique je l’ai fait et quand je lance une commande atnd avec x-ctu cote xbeeA, il voit bien le xbeeb ; on boit le PANid, Adresse etc.

      mais la diode rssi de xbeeB s’ eteint tout de suite et quand je fait un test range, y a pas de signal (time out).

      pouvez vous m’aider ? / yann

    • Le 23 mai 2012 à 12:53, par Julien H. En réponse à : XBee API pour pilotage à distance

      bonjour,

      la diode RSSI ne s’allume que lorsqu’il y a une réception, donc une fois l’échange établit, c’est normal qu’elle s’éteigne (elle se rallumera au prochain échange).

      le test range nécessite que le XBee distant renvoie ce qui est envoyé (boucle entre DI et DO ou RX et TX) : est-que c’est bien le cas ?

    • Le 24 août 2012 à 14:53, par freja En réponse à : XBee API pour pilotage à distance

      Bonjour,
      Merci pour ce tuto, les infos concernant les xbees sont quasi inexistantes sur le net...
      J’attends avec impatience la suite du tuto, concernant la LED ö
      j’aimerai savoir comment contrôler les digital out /PWM depuis un ordinateur .

      Une petite idée sur le type de message à envoyé au port série ?

      MERCI

    • Le 25 août 2012 à 01:10, par Julien H. En réponse à : XBee API pour pilotage à distance

      Les travaux sur les XBee sont suspendus : les modules coûtent cher et on attend des nouvelles de ceux qui les utilisent...

    Répondre à ce message

  • Le 25 juillet 2012 à 02:41, par Franck En réponse à : XBee API pour pilotage à distance

    Bravo pour votre site. Je découvre que je n’ai pas forcément besoin d’un Arduino pour pouvoir faire de la télémesure. Il me semble qu’il suffit que j’interroge régulièrement le module xBee ? A moins que je n’ai rien compris 🙁 Par contre ce ne sont que des mesures instantanées...

    • Le 25 juillet 2012 à 07:12, par Julien H. En réponse à : XBee API pour pilotage à distance

      Oui et même plus : en fonction du matériel et avec un bon paramétrage, le XBee peut lui-même envoyer le message sans qu’on l’interroge (notamment ce qui permet de mettre en place une économie d’énergie forte). Mais quand même, si l’on n’a que quelques XBee et qu’on n’a pas les besoins de réduction de coût d’une application industrielle (ce qui doit être le cas des visiteurs de notre site amateur et ludique), il est plus sage de conserver une Arduino, par exemple pour stocker ou transformer les valeurs, et éviter le recours à l’API.

    Répondre à ce message

  • Le 30 avril 2012 à 15:08, par benoit En réponse à : XBee API pour pilotage à distance

    bonjour,
    tout d’abort bravo pr votre site il est plein d’info.
    j’ai un petit problème au niveau DIO model XBEE S2 (xb24-zb), je n’arrive pas à avoir l’image de l’entrée que j’active sur mon en device vers le coordinateur.
    pr info les modules communiques très bien entre eux.
    EN MODE AP :
    je parametre mon en device avec D1 = 3 pr input et mets IC =2,
    le coordinateur avec D1 = 4.
    je lance le test, la com est ok,(envoie de caractère ds les 2 sens)
    quand j’active mon entree D1 sur le en device le coordinateur recoi bien l’info car la led RSSI s’allume mais pas de changement sur ma sortie.
    j’ai meme essayé de mettre les PR=0 mais rien ne change.
    EN MODE API :
    meme probleme, je recois bien les trames mais que sur la bande rx tx.
    j’ ai essayé en modifiant le paramétre A0 mais rien ne change.
    j’ai dû au moin lire plus de 600 pages de doc sur le net ou projet réalisé par des personnes mais là je cale !
    je vous remerci d’avance.

    • Le 30 avril 2012 à 19:01, par Julien H. En réponse à : XBee API pour pilotage à distance

      Bonjour, difficile de déboguer le montage à distance... mais tu ne dois pas être loin de la solution vu tes connaissances en XBee.

      Bon courage !

    Répondre à ce message

  • Le 24 avril 2012 à 15:27, par ? En réponse à : XBee API pour pilotage à distance

    Bonjour,
    J’ai utilisé cet article pour paramétrer 2 modules, l’un en réception, l’autre en émission et j’ai configuré la patte 0 en analogique contrairement à l’exemple.
    Au final, grâce à Docklight, je visualise les valeurs reçues et je n’ai que deux possibilités : "0000" et "03FF".
    Etant donné que j’applique une tension variable entre 0 et 3V3 sur le pin 0, est-ce possible de visualiser dans la trame ces valeurs (sachant que Vref est de 3V3) ???
    J’espère être clair, merci d’avance

    • Le 25 avril 2012 à 08:31, par Julien H. En réponse à : XBee API pour pilotage à distance

      Bonjour,

      Je n’ai pas testé ce mode. Il faut revoir les différents paramètres : si l’émission est en analogique, est-ce que la réception l’est aussi ? J’en doute, il doit s’agir d’un PWM.

    Répondre à ce message

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.