Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Communications > Réseaux ZigBee > Un réseau sans-fil avec des XBee

Un réseau sans-fil avec des XBee

configuration des modules et différentes utilisations

samedi 3 janvier 2009, par Julien H.

Les modules XBee sont des circuits de communication sans-fil utilisant les protocoles 802.15.4 et Zigbee, permettant de réaliser différents montages, d’une liaison série RS232 classique à un réseau maillé (mesh) auto-configuré.

Un composant XBee série 1 coûte désormais moins de 20 euros.

Différents protocoles ont été implémentés sans que le packaging - désormais reconnaissable entre tous avec ses coins coupés - ne change. Il faut donc faire attention sur la série que vous utiliserez : le 802.15.4 des débuts jusqu’aux nouvelles Séries 2, ZNet 2.5 et ZB Zigbee. Les modules de séries différentes ne peuvent pas communiquer entre eux.

Selon les modèles et les pays, ils utilisent la bande des 2,4 gigahertz (comme le Wifi ou le Bluetooth) ou les 900 MHz. Selon leur puissance, ils émettent à une distance comprise entre 30 mètres et 1,5 kilomètre.

Ils sont développés à l’origine par la société Maxstream, devenue Digi. Vous pouvez toujours trouver en vente les premières séries du module marquée Maxstream.

Le débit peut atteindre 250 kbps, mais si on les utilise pour réaliser une liaison série sans fil, les débits standards sont compris entre 9600 bps à 38400 bps. La vitesse et la bande passante ont des effets sur les erreurs de transmission et ne sont pas possibles à obtenir dans tous les environnements.



Matériel pour un premier test

Nous allons utiliser ici des modules de la série 1, qui porte le nom du protocole IEEE : "802.15.4" (moins évolué que Zigbee mais déjà bien pratique). Pour l’usage que nous en ferons dans cet article, le modèle n’a pas d’incidence et vous pouvez réaliser ces mêmes tests avec une version 2 ou supérieure (à condition d’utiliser des XBee de la même série bien sûr).

Modules XBee
vue du dessus et vue du dessous

Documentation technique

Le minimum à savoir est... minimal, car il faut surtout s’occuper de connecter les modules à vos équipements, et pas du tout besoin de savoir comment le protocole sans-fil fonctionne. C’est un peu comme pour un câble série : vous devez savoir quelle est la patte qui émet et la patte qui reçoit sans forcément vous préoccuper de la façon dont le courant électrique va traverser le fil de cuivre, même si certains devront s’en préoccuper pour des utilisations particulières.

Cette simplicité est un des principes qui ont fait le succès de ces modules, et que la société qui les conçoit s’emploie à conserver. Mais bien sûr on va aussi exploiter les possibilités de point-à-point ou de maillage (1 XBee écoutant plusieurs XBee).

Pour le détail, une datasheet est disponible sur le site de Digi ou des différents distributeurs.

Interfaces

Nous avons besoin d’interfacer le XBee avec des microcontrôleurs (pour que les robots communiquent entre eux) et aussi avec un simple PC (pour avoir une possibilité de télécommande ou de télémétrie.

Pour se connecter avec un microcontrôleur, on va simplement relier les pattes RX,TX de notre µC aux pattes Din et Dout et alimenter le module en 3,3 volts. Quelques autres pattes sont intéressantes, nous les détaillerons ultérieurement.

Voici le schéma réalisé par Yannick pour son propre circuit. Vous pouvez vous en inspirer pour votre propre microcontrôleur mais notez que c’est vraiment simple du côté XBee, il n’y a aucun composant supplémentaire.

Connexion d’un XBee à un PIC16F628
(et profitez-en bien, ce n’est pas tous les jours que vous verrez un PIC dans nos pages)

Alimentation

L’intérêt du protocole 802.15.4 est d’être fait pour une puissance faible, avec une consommation réduite permettant de conserver un équipement autonome pendant une année, contrairement aux équipements Bluetooth par exemple.

Donc l’alimentation est un point essentiel. Au début, c’est vrai que ce 3,3 volts est un peu embêtant, car nous sommes habitués à utiliser des composants TTL en 5V (comme nos cartes à base de microcontrôleurs Atmel). Mais on s’y fait très bien et de plus en plus d’équipements sont en 3,3 volts.

En attendant, il existe des adaptateurs entre 5v et 3,3v. Et Yannick nous propose un circuit permettant d’alimenter en 3,3 volts un module XBee à partir d’une pile grâce à un convertisseur DC-DC "step-up" (le Max856 de chez Maxim) :

Alimentation 3,3 volts
utilisation d’un convertisseur pour monter la tension d’une pile.

Shield XBee pour Arduino

Comme nous utilisons parfois des cartes Arduino, nous pouvons également utiliser une carte d’extension dédiée aux modules XBee qui ajoute des leds, un convertisseur 3,3 volts et des cavaliers de configuration permettant de conserver la liaison USB-série : le "Arduino Xbee shield".

XBee shield pour Arduino
carte d’extension qui se branche directement sur la carte Arduino.

Son utilisation est très simple : il faut mettre les cavaliers vers l’intérieur (i.e. selon inscription "XBee/USB", se mettre en position "Xbee") et désormais les pattes RX/TX de votre Arduino sont connectées au Shield XBee. Cela implique que vous devez changer de position (USB) quand vous voulez reprogrammer la carte.

Interface avec un ordinateur

Pour se connecter à un ordinateur (PC ou Mac), on réalise très facilement un circuit adaptateur en connectant un chip USB/série au module XBee. On trouve pour quelques euros des circuits à base de FTDI qui en plus offrent des leds indiquant la mise sous tension, la transmission / réception et l’appariement avec un autre module, toutes ces choses pratiques qu’on oublie souvent.

Adaptateur USB Xbee
disponible chez Sparkfun, NKC electronics et tous les autres distributeurs Arduino habituels.

Mais si vraiment vous voulez le faire vous-même, suivez l’exemple très bien présenté de Totof :

Jouons avec les modules XBee

Il est temps de laisser de côté tous ces fils, ces câbles, ces composants et de passer aux travaux pratiques, avec un peu de logiciel.

Premier test

Par défaut, les circuits XBee sont faits pour se trouver tous seuls, s’apparier et fonctionner en liaison série. Les paramètres sont les suivants : 9600 bauds, pas de parité, pas de contrôle de flux, 8 bits et 1 bit de stop. On va le constater avec une Arduino.

Côté Arduino, rien d’autre que ce code :

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  Serial.print('H');
  delay(1000);
  Serial.print('L');
  delay(1000);
}

Et côté PC, le bon vieil hyperterminal :

Configuration de la communication série
Il faut choisir le bon port COM : celui du module USB et pas celui de l’Arduino.

Le résultat est bluffant, puisqu’on dispose pour 30 euros d’une communication série sur plus de 100 mètres. Ce qui permet déjà de ressortir tous ses projets de mesure de température, alarme de boite aux lettres, etc..

Et pour un robot, on peut envisager de le contrôler ou de recevoir des tonnes de télémesures sans s’emmeler dans des fils qui s’enroulent autour :)

Second test

Mais que se passe-t-il si on utilise 3 modules ? Pour ce test, on va écrire un code avec un identifiant unique pour chacun, et un compteur.

int xbee_id = 0x01;   // ou 0x02

int count1 = 0; 
int count2 = 0;
int count3 = 0;

Chacune des cartes mobiles émet son adresse toutes les secondes.

  // toutes les secondes, envoie mon code
  Serial.write(xbee_id);
  delay(1000);

Lorsqu’il reçoit un code, tout module doit incrémenter le compteur correspondant :

      case 0x01:
        count1++;
        break;
      case 0x02:
        count2++;
        break;
      case 0x03:
        count3++;
        break;

Le module relié au PC permettra d’interroger chacun des modules embarqués sur une Arduino pour connaitre la valeur de leurs compteurs, en envoyant ’ ?’ sur la liaison série.

    int reception = Serial.read();
    switch(reception) {
      case '?':
        Serial.print("(");
        Serial.print(count1);
        Serial.print(",");
        Serial.print(count2);
        Serial.print(",");
        Serial.print(count3);
        Serial.println(")");
        break;
        ...
    }

Ainsi, on va pouvoir observer ce qui se passe en allumant et éteignant successivement un ou plusieurs modules.

Une fois chargé les programmes dans chacune des Arduino (en pensant à passer en mode USB pour le transfert et à changer l’ID dans le code avant compilation), on peut ouvrir un terminal série (ici, Docklight pour visualiser les valeurs décimales, hexadécimales ou ASCII) et observer ce qui se passe.

Tout d’abord, le GRAND avantage des XBee, c’est que les programmes ne plantent pas quand la connexion série est rompue, par exemple quand on éteint un des modules : la liaison série sur le microcontrôleur n’est pas ouverte avec un module précis mais avec le module XBee directement connecté, qui lui reste alimenté puisque branché sur la même alimentation. C’est vraiment pratique car le plus embêtant dans une liaison série classique, c’est de débrancher la carte et de faire planter tout le programme par une bête exception (ok, ça peut se gérer mais bon...)

Voici le résultat en images de ce second test. On a paramétré Docklight pour qu’il envoie le caractère ’ ?’ sur la liaison série du module USB toutes les 5 secondes.

Tout d’abord, on va allumer l’Arduino 01 : au bout de 2 secondes, on commence à recevoir ses "bips" (c’est notre Spoutnik moderne) puisqu’on observe 5 "01" (1 par seconde) dans la console en mode hexadécimal.

On éteint l’Arduino 01 et on allume l’Arduino 02 :

Pareil, 5 ’02’ sans avoir rebooté le module connecté à l’USB ! après un temps de démarrage de quelques secondes (promis, la prochaine fois je sors l’analyseur logique).

Premier test "critique" : on rallume l’Arduino 01, les deux sont donc allumées en même temps, soit 3 modules XBee en fonction. C’est éloquent : on reçoit à la fois les 01 et les 02 sur notre module branché au PC.

Second test "critique" : qui de la réception ? On va émettre depuis le PC l’identifiant ’03’ (Docklight nous permet de le faire juste en cliquant sur un bouton paramétré) :

Et bien ça marche : on s’aperçoit que les deux cartes Arduino ont incrémenté leur compteur n°3, preuve que le caractère a été reçu par les 2 modules.



Conclusion

On a donc SANS AUCUNE CONFIGURATION fait communiquer ensemble 3 cartes distantes de plusieurs mètres, de manière bidirectionnelle et multi-réception : ce qu’un module envoit, tout le monde peut le recevoir.

Il est donc désormais facile d’imaginer de contrôler des robots mobiles en envoyant à la fois des consignes communes de synchronisation puisque chacun des XBee va recevoir le message, ou bien en envoyant l’identifiant du module ciblé, d’en contrôler un en particulier, tout en laissant les autres robots libres de connaître les consignes envoyées.

C’est un grand progrès qui est accessible à tout le monde. On verra prochainement comment protéger tout ça en limitant la réception à des modules appariés, ou à un groupe de modules qui partage le même identifiant de groupe.

Portfolio

Vos commentaires

  • Le 28 novembre 2011 à 01:50, par Anne-So En réponse à : Un réseau sans-fil avec des XBee

    Bonsoir,

    J’aimerais savoir s’il est possible de configurer des modules XBee pour que leur adressage se fasse de façon dynamique ? Les modules seront placés sur des palettes et les adresses devront se déterminer en fonction des mouvements des palettes.

    • Le 30 novembre 2011 à 22:28, par Julien H. En réponse à : Un réseau sans-fil avec des XBee

      Bonjour,

      Oui il est possible de changer leur adresse à tout moment en envoyant par la liaison série les commandes nécessaires.

    Répondre à ce message

  • Le 10 juillet 2011 à 15:57, par Rizmo En réponse à : Un réseau sans-fil avec des XBee

    En fait je me demande si c’est pas plutot

    Serial.print(xbee_id) ;

    plutot que
    Serial.write(xbee_id) ;

    dans ton code ?

    Répondre à ce message

  • Le 10 février 2011 à 21:54, par Hugo F. En réponse à : Un réseau sans-fil avec des XBee

    Bonjour, je cherche à remplacer mon câble USB par une liaison san-fil. Je veux savoir si un réseau sans-fil XBee est approprié ?

    Je m’explique : je communique actuellement avec mon montage à l’aide d’un câble USB pour changer certaines variable qui contrôle le mode de clignotement de LED à l’aide d’un petit programme sur mon ordinateur. Le fichier envoyé est de 1200 octets en moyenne et est un fichier .xml.

    J’ai lu plus haut que cela ne marcherait pas pour une webcam mais est-ce possible dans mon cas vu la petite taille du fichier à envoyer ?

    Merci beaucoup pour la doc, très intéressant.

    • Le 13 février 2011 à 10:42, par Julien H. En réponse à : Un réseau sans-fil avec des XBee

      Bonjour,

      Un réseau XBee peut remplacer une liaison série sans-fil, mais pas n’importe quel câble USB.

      Pour le débit : il faudra plusieurs secondes pour transférer les 1200 octets.

      Pour le format : le XML est un flux de caractères donc pas de problème.

      Pour la communication : il faut que ton programme sur ordinateur puisse gérer une liaison série.

      Je pense que ça peut fonctionner.

    • Le 10 juillet 2011 à 15:39, par ? En réponse à : Un réseau sans-fil avec des XBee

      Salut Julien
      Je débute dans l’Arduino et la programmation.
      Ton site est vraiment symapa. Mais pour l’exemple ici j’ai du mal à saisir le programme complet avec les incrémentations.
      Serait il possible de le mettre ?

      Merci d’avance

    Répondre à ce message

  • Le 6 mai 2011 à 11:35, par romain En réponse à : Un réseau sans-fil avec des XBee

    Bonjour,
    J’ai commencé a faire une carte permettant à un pic (16F876) de communiquer avec un Xbee.Un peu comme celle proposée par Yannick.
    L’électronique n’etant pas ma formation, je cherche à savoir si mon pic peut communiquer avec le XBee par liaison RS232 ou s’il faut une liaison UART non RS232.
    J’avoue ne pas avoir bien saisi la différence profonde entre les 2 et la communication RS232 est bien documentée, donc celle-ci me parait plus simple a mettre en oeuvre.

    • Le 7 mai 2011 à 19:30, par Julien H. En réponse à : Un réseau sans-fil avec des XBee

      Bonjour,

      En fait, UART fonctionne en 0 / 5 volts (ou 3,3 dans le cas du XBee) et RS232 fonctionne en -12 / +12, mais parfois les documents confondent les deux : le protocole est le même.

      Donc oui on peut connecter un PIC aux entrées/sorties DI et DO du XBee si les deux sont en tension nominale 3,3 volts.

    Répondre à ce message

  • Le 20 janvier 2010 à 19:10, par Louix En réponse à : Un réseau sans-fil avec des XBee

    Bonjour,

    Je voudrais faire du transfert de données type USB par liaison XBee, est-ce possible ?

    Je m’explique : j’ai un capteur lambda (ici, une webcam) qui sors des infos par câble USB. Je voudrais brancher un module XBee directement en sortie de capteur, par l’intermédiaire d’un chip USB/série, et faire communiquer ce XBee avec un autre, qui lui serais brancher directement au port USB de mon ordi.

    L’idée étant de pouvoir embarqué ma wbecam sur robot. Est-ce que cette communication entre XBee peut se résumer à un "cable" USB wireless, ou un micro-controleur est-il nécessaire pour gérer la communication ? Est-ce que mon ordinateur sera capable de reconnaitre la webcam ? La question du débit n’est pas importante (je sais que l’XBee n’est pas adapté pour la vidéo, je me contenterai de ce qu’il pourra faire).

    Merci d’avance

    Bonne soirée

    Louix

    • Le 21 janvier 2010 à 00:02, par Julien H. En réponse à : Un réseau sans-fil avec des XBee

      Bonjour,

      Oui on peut relier 2 ordinateurs avec des XBee (ou un ordinateur et un robot) mais seulement avec une liaison de type série à une vitesse maximum de 115200 bauds (bits par seconde).

      Il est donc exclu d’atteindre les vitesses de transfert de l’USB nécessaires pour du transfert de webcam.

      Il faut trouver une autre solution (RF 2,4GHz pour modélisme par exemple).

    • Le 19 janvier 2011 à 16:16, par fky En réponse à : Un réseau sans-fil avec des XBee

      Bonjour
      Peut on utiliser un kit XBee sans utiliser un ordinateur central connecter au XBee-pro, aprés l’avoir programmer ?
      Et donc remplacer la commande effectuée par l’ordinateur central par un simple capteur Pyroélectrique (IR).
      Merci

    • Le 19 janvier 2011 à 19:09, par Julien H. En réponse à : Un réseau sans-fil avec des XBee

      Bonjour,

      Oui il est tout à fait possible d’utiliser un module XBee en connectant des capteurs sur ses entrées/sorties (ce qui nécessite d’utiliser un protocole spécial pour transmettre la valeur à un second XBee.

      Mais une seconde solution consiste à utiliser un micro-contrôleur : externe, comme l’Arduino, ou intégré à certaines versions de XBee. On est alors libre de lire tout type de capteur, et de commander différents actionneurs (moteurs, lumières, relais).

    Répondre à ce message

  • Le 2 janvier 2011 à 13:51, par macfly En réponse à : Un réseau sans-fil avec des XBee

    Bonjour
    Je voudrais faire la partie n°2 mais je n’arrive pas à taper le programme j’ai toujours des erreurs.

    Quelqu’un aurait une version qui fonctionne ?

    int xbee_id = 0x01 ; // ou 0x02

    int count1 = 0 ;
    int count2 = 0 ;
    int count3 = 0 ;
    // toutes les secondes, envoie mon code
    Serial.write(xbee_id) ;
    delay(1000) ;

    case 0x01 :
    count1++ ;
    break ;
    case 0x02 :
    count2++ ;
    break ;
    case 0x03 :
    count3++ ;
    break ;

    int reception = Serial.read() ;
    switch(reception)
    case ’ ?’ :
    Serial.print("(") ;
    Serial.print(count1) ;
    Serial.print(",") ;
    Serial.print(count2) ;
    Serial.print(",") ;
    Serial.print(count3) ;
    Serial.println(")") ;
    break ;
    ...

    • Le 2 janvier 2011 à 18:01, par Julien H. En réponse à : Un réseau sans-fil avec des XBee

      Bonjour,

      Avant de dire que ça ne fonctionne pas, si tu nous disais quelles erreurs tu rencontres ?

    • Le 10 janvier 2011 à 14:17, par quentinduv En réponse à : Un réseau sans-fil avec des XBee

      je suis élevé de bts électrotechnique et nous avons pour projet de réaliser le pilotage de l’éclairage public par l’intermédiaire de liaison sans fils.Nous sommes convaincu que le module Xbee sera à la hauteur.

      Mais pouvez vous me dire si le module Xbee possède une tempo interne programmable ou faut il en ajouter une ?

      merci d’avance pour l’intérêt que vous porter à notre projet pour finaliser nos études

    • Le 10 janvier 2011 à 16:05, par Julien H. En réponse à : Un réseau sans-fil avec des XBee

      Il faut en rajouter une, éventuellement avec une horloge RTC pour faire une temporisation sur toute la journée, avec alarme pour réveiller automatiquement le système.

    • Le 10 janvier 2011 à 16:21, par duvigneau En réponse à : Un réseau sans-fil avec des XBee

      merci pour votre rapidité

    Répondre à ce message

  • Le 11 mai 2010 à 11:12, par ReliKenS En réponse à : Un réseau sans-fil avec des XBee

    Bonjour,

    Je voudrais savoir si il est possible d’envoyer un signal de fréquence 50Hz d’un module à l’autre sans fil ?

    J’ai configuré les modules pour que l’un puisse recopier les pattes de l’autre en faisant de l’I/O passing.

    Mais apparemment ils ne peut pas recopier un signal carré de cette fréquence.

    Merci d’avance

    ReliKenS

    • Le 13 mai 2010 à 10:00, par Eric P. En réponse à : Un réseau sans-fil avec des XBee

      Je n’ai jamais fait l’essai, mais 50Hz me semble un peu rapide pour le mode de communication impliqué (ça fait une transmission toutes les 20ms). Le XBee et les modules radio similaires ne sont pas vraiments faits pour cela.

      Si on veut transmettre un signal à ces fréquences-là, il vaut mieux s’orienter vers une transmission analogique par modulation (AM ou FM).

    • Le 17 mai 2010 à 15:13, par ReliKenS En réponse à : Un réseau sans-fil avec des XBee

      C’est bon j’arrive à transmettre un signal de plus de 120Hz avec quelques tout petis problemes

      j’ai mis le baud rate à 115200 pour les 2
      chez l’emetteur g mis IT et IR à 1 pour diminuer le temps d’échantillonnage

      et chez le récepteur IT à 0xFF et IR à 0xFFFF pour recopier le signal avec précision

      enfin.. je crois

      ReliKenS

    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.