XBee en étoile

(English version)

  • Auteur : Jérôme Abel (Reso-nance)
  • Date : 09/2014
  • Licence : GNU/FDL3
  • Fichiers : codes.zip
  • Remerciements : Martin Peach, Hans-Christop Steiner, Vincent Pillet

Les modules XBee sont une solution pour transmettre des données sans-fils, par ondes radio. Si cela ne vous dit rien et que vous êtes plus déterminé que jamais, veuillez suivre l'initiation Xbee & Arduino. Nous avons vu comment transmettre des données d'un module à un autre en remplacement d'un câble, c'est une topologie de réseau “point-à-point”. Ici, nous explorerons une autre topologie très utile qui est en “étoile”. Cela permet deux types de configuration : un émetteur (Coordinator) envoie des données à plusieurs receveurs (End Device) ou bien l'inverse, plusieurs émetteurs envoient des données à un seul receveur. L'article décrit comment faire ça avec les modules XBee Series 1, Pure Data et Arduino. Certaines de mes pièces artistiques (Patatas de goma et Chimères Orchestra) utiliseront cette technique.

Pré-requis

Matériel

Matériel utilisé ici pour les tests :

  • 3 XBee series 1 + 3 supports
  • 3 Arduinos
  • 2 Serial converter ou XBee board
  • 3 platines à essais
  • 4 leds
  • 2 coupleurs pour piles 1,5V AAA + 4 piles
  • fils de prototypage

Logiciels

Logiciels à installer :

Ressources

Précautions

Quelques précautions et erreurs communes :

  • Les modules XBee sont alimentés autour de 3V, le 3,3V de l'Arduino est parfait ou bien deux piles 1,5V. Faites bien attention à ne pas l'alimenter avec le 5V de l'Arduino
  • RX/TX : attention à l'orientation RX va vers TX et TX va vers RX.
  • RX/TX : enlever les cables RX/TX branchés à l'Arduino quand vous téléversez le code vers l'Arduino
  • Attention au baudrate du port série et au numéro de port. Si vous changez de carte, le port n'est sans doute plus le même. De même si vous changez le baudrate du XBee, vous devez impacter ce changement dans le programme “xbeeSerialTerminal”, dans les codes Arduino (Serial.begin(…)), dans Pure Data ([comport .. ….]) et dans le moniteur série d'Arduino. En effet, parfois on croit ne plus pouvoir se connecter au module, mais c'est que son baudrate est différent de celui que l'on utilise pour s'y connecter.
  • Leonardo : utiliser Serial1 à la place de Serial : Serial1.begin(9600); xbee.setSerial(Serial1);

Astuce

En ouvrant deux fois le logiciel Arduino, on peut téléverser des codes dans deux Arduinos différentes. Cela évite de devoir changer la carte de destination à chaque fois.

1/ To XBee (direct)

Le premier exemple consiste à contrôler directement les sorties numériques et PWM des XBees à partir de Pure Data sans passer par Arduino. Pour les tests, nous branchons une LED sur la sortie D0 (digital) et une autre sur la sortie PWM1 (PWM).

Schéma : Pd/AT/SERIAL/XBEE1 —> XBEE2/LEDS, XBEE3/LEDS, …
Code : to-xbee-star.pd

Configuration

Ouvrir le XBee Terminal avec Processing et entrer pour chaque XBee sa configuration :

  • XBEE#1 Coordinator: ATRE, ATID1111, ATAP2, ATCE1, ATWR
  • XBEE#2 End Device : ATRE, ATID1111, ATMY2, ATWR
  • XBEE#3 End Device : ATRE, ATID1111, ATMY3, ATWR

La grande différence par rapport aux précédentes configurations est le fait que nous ne spécifions pas d'adresse de destinataire en “dur”, nous la spécifions directement dans la commande envoyée au coordinateur grâce au mode API (ATAP2). Voir les annexes en bas pour en savoir plus.

Explications

AT Command Description
ATRE Revenir à la configuration de base
ATID1111 Adresse du réseau
ATAP2 Coordinateur en mode API
ATCE1 Rôle de coordinateur
ATMY2 Adresse du XBee
ATWR Enregistrement de la configuration

Remarques :

ATAP2 Par défaut : le mode API est optionnel pour les End Devices
ATMY0 Par défaut : l'adresse du coordinateur est à 0 par défaut
ATAP0 Par défaut : mode AT pour les End Devices
ATCE0 Par défaut : comportement End Devices
ATDH0 Par défaut : adresse en 16 bits
ATDL0 Par défaut : Adresse du destinataire
ATIU0 ? : pour ne pas utiliser les entrées/sorties RX/TX dans ce cas-là (direct)
ATMY1 ? : si l'adresse du coordinateur est 1, cela pourrait éviter d'envoyer des infos inutiles au coordinateur

Pure Data

Envois des commandes avec Pure Data

Explications

AT Command Description
RAT 0x0 0x2 2 D0 4 digital switch off
RAT 0x0 0x2 2 D0 5 digital switch on
RAT 0x0 0x3 2 P1 2 PWM mode (2) for PWM1 pin
RAT 0x0 0x3 2 M1 $1 Control PWM (0-255) with M1 (use P0 and M0 for PWM0 pin)

Décryptage du message “Remote AT commands (RAT)“

64-bit_destination 0x0 (any, not needed here)
16-bit_destination: XBee end devices addresses
options 2 (apply changes immediately)
command D0 (pin 20 of the XBees)
parameters 4 (switch off), 5 (switch on)

2/ Analyse de la trame

Pour comprendre ce qu'envoie les modules XBee, on peut afficher le contenu de la trame pour savoir où sont les données utiles envoyées. Le schéma est très simple, on utilise le moniteur série du logiciel Arduino pour visualiser ces données.

Schéma : Pd/SERIAL/XBEE1 —> XBEE2/RX/ARDUINO
Fichiers : to-xbee-serial.pd, from_serial.ino, from_xbee_serial.ino (get packet), from_xbee_serial_2.ino (get one data)

Remarque : en passant par le convertisseur série, sans Arduino, je n'arrive pas à voir les trames… Je ne comprend pas.

Configuration

  • XBEE#1 Coordinator: ATRE, ATID1111, ATDL2, ATWR
  • XBEE#2 End Device : ATRE, ATID1111, ATMY2, ATWR

Résultats

Données Résultats
Chiffres quelconques OK. Limités à 0-255 (byte)
print A 65
print hello 104 101 108 108 111
RAT 0x0 0x2 2 D0 5 126 0 16 23 23 0 0 0 0 0 0 0 0 0 2 2 68 48 5 84
TX 0x0 0x2 0 0 120 126 0 15 16 24 0 0 0 0 0 0 0 0 0 2 0 0 120 93
TX 0x0 0x2 0 0 10 11 12 13 14 15 126 0 125 51 16 30 0 0 0 0 0 0 0 0 0 2 0 0 10 11 12 13 14 15 145

Récupérer une donnée (parser)

3/ XBee API - Arduino

On fait communiquer uniquement des Arduinos entre elles pour comprendre comment envoyer et recevoir des trames XBee avec Arduino. On branche une LED sur la pin 9 pour voir le résultat.

Schéma : ARDUINO/TX/XBEE1 —> XBEE2/RX/ARDUINO/LED et XBEE3/RX/ARDUINO/LED
Codes : to_xbee_api.ino, from_xbee_api.ino

Configuration

  • XBEE#1 Coordinator: ATRE, ATID1111, ATAP2, ATCE1, ATWR
  • XBEE#2 End Device : ATRE, ATID1111, ATAP2, ATMY2, ATWR
  • XBEE#3 End Device : ATRE, ATID1111, ATAP2, ATMY3, ATWR

Résultat

4/ XBee API - Arduino et Pure Data

N'étant pas arrivé à envoyer des données en passant par le convertisseur série, j'ai dû utilisé une Arduino pour formater correctement ces données pour les autres modules récepteurs. On utilise la bibliothèque SerialCommand dans Arduino pour récupérer six données envoyées de Pure Data (une liste de six données). Celles-ci sont ensuite formatées par Arduino et la bibliothèque XBee. Les récepteurs récupèrent uniquement le tableau de données de la trame. La LED branchée sur la pin 9 permet toujours de visualiser ce qu'il se passe.

Schéma : Pd/CMD/ARDUINO/XBEE1 —> XBEE2/RX/ARDUINO/LED et XBEE3/RX/ARDUINO/LED
Codes : to-xbee-cmd.pd, to_xbee_api_cmd.ino, from_xbee_cmd.ino

Configuration

  • XBEE#1 Coordinator: ATRE, ATID1111, ATAP2, ATCE1, ATBD6, ATWR
  • XBEE#2 End Device : ATRE, ATID1111, ATAP2, ATMY2, ATBD6, ATWR
  • XBEE#3 End Device : ATRE, ATID1111, ATAP2, ATMY3, ATBD6, ATWR

Changement de baudrate : il faut donc les changer partout (Pure Data, Arduino, xbeeTerminal, moniteur série).

Pure Data

4/ Réception des données (direct)

Réception des données directes (capteurs) de plusieurs XBees sans Arduinos par le XBee coordinateur, avec Pure Data ou Processing. Très pratique pour récupérer les données d'un réseau de capteurs.

Schéma : CAPTEUR/XBEE2 et CAPTEUR/XBEE3 (seules) —> SERIAL/XBEE1
Codes : from-xbee-star-1.pd, from-xbee-star-2.pd

Configuration

  • XBEE#1 Coordinator: ATRE, ATID1111, ATAP2, ATMY1, ATWR
  • XBEE#2 End Device : ATRE, ATID1111, ATAP2, ATMY2222, ATDL1, ATWR
  • XBEE#3 End Device : ATRE, ATID1111, ATAP2, ATMY3333, ATDL1, ATWR

Les adresses des destinataires doivent être celles du coordinateur.

Pure Data

Sans [mrpeach/unpackxbee]

Avec [mrpeach/unpackxbee]

Processing

Annexes

API

In AT Command mode (Transparent Mode) , everything got in RX of XBee will be sent out via antenna , the incoming data from antenna will go to TX. But in API Mode , it won't send out anything until it received the correct form of commands from serial interface. (xbee introduction)

Data Structure in API Mode:
7E 00 0A 01 01 50 01 00 48 65 6C 6C 6F B8

7E Start delimiter
00 0A Length bytes
01 API identifier
01 API frame ID
50 01 Destination address low
00 Option byte
48 65 6C 6C 6F Data packet (ASCII: “Hello”)
B8 Checksum

Series 1 radios support both AT and API modes with a single firmware version, allowing you switch between the modes with X-CTU. However, Series 2 requires a specific firmware for API mode. As of now there are two firmware versions for Series 2 API mode: ZNet and ZB Pro. ZNet is recommended as it is the easiest to work with.

What is API (Application Programming Interface) Mode and how does it work? (digi.com)
API (Application Programming Interface) mode is a frame-based method for sending and receiving data to and from a radio's serial UART. The API is an alternative to the default transparent mode. The API allows the programmer the ability to:

  • Change parameters without entering command mode (XBee only)
  • View RSSI and source address on a packet by packet basis
  • Receive packet delivery confirmation on every transmitted packet

XBee product manual :
The API operation option facilitates many operations such as the examples cited below:

  • Transmitting data to multiple destinations without entering Command Mode
  • Receive success/failure status of each transmitted RF packet
  • Identify the source address of each received packet

Broadcast / Unicast

Pour envoyer des commandes à plusieurs destinataires, une autre solution aurait été d'envoyer des messages à tout le monde (Broadcast) et que les destinataires analysent les données (parser) pour ne récupérer que ce qui leur était destiné. Je pars du principe que le mode API fait pour cela est peut-être plus rapide à exécuter ces opérations, sachant que l'envoi de message physiquement (ondes radio) est envoyé à tout le monde. Ce sont les modules entre eux qui font le travail de déterminer qui est le destinataire, quelles sont les bonnes données, etc.

Series 2 (forum.sparkfun.com) :
Transmitting data using broadcast addressing with XBee ZB modules will generally give you much, much less performance than transmitting an individual unicast to each node you want to talk to. This is because broadcasting works very differently on the XBee ZB modules than with the XBee 802.15.4 modules.

Series 1 (forum.sparkfun.com, electronics.stackexchange.com) :
If you don't want to use API, and strictly want to use AT mode, then I suggest you simply put a destination prefix string at the beginning of each of your messages, and then broadcast all messages to all end-nodes. On the receiving end-nodes, write some code to check whether the destination prefix string of a received message matches that particular end-node's address/name (which you can assign randomly yourself in code). I don't think it's a good idea to change ATDL dynamically for each message. Not only might it affect the timing and require re-pairing but also remember that ATDL is written to the Xbee's EEPROM – which only allows a finite number of rewrites.