Concurs : Comunicatie punct-la-punct cu module XBee

Acest articol este publicat in cadrul concursului Robofun 2012.  Perioada de votare pentru acest proiect s-a incheiat. Acest proiect a acumulat un numar de 9 voturi.

Am achizitionat nu demult de la robofun doua module XBee S2.

Documentatia de fabrica e suficient de seaca, astfel incat reuseste sa puna pe ganduri pana si un profesionist. De aceea vin cu niste idei care, poate clarifica unele ciudatenii, sau eventual vor atarna in balanta in momentul deciziei de a utiliza asemenea module.

Modulele de comunicatie XBee au fost concepute pentru comunicatii de viteza mica pe distante scurte (100m), medii (3km) sau mari (40km) in retele de senzori. Utilizarea lor, evident, nu se limiteaza doar la senzori.

Functioneaza pe benzile de frecventa ISM, cu licenta libera: 2.4GHz, 868MHz.

Viteza maxima de comunicatie variaza intre 10kbiti/secunda (kbps) si 65Mbps in functie de distanta si banda utilizata.

Modulele comercializate de robofun sunt de doua tipuri:

  1. S2 (2mW): cu antena chip sau cu antena bastonacestea intra in categoria modulelor pentru comunicatii la distante mici (120m), cu viteze de pana la 250kbps.
  2. S2B PRO (50mW): cu bataie de pana la 1.5km si viteze de pana la 250kbps.

Varianta S2B PRO este evident mai scumpa.

Necesarul de putere pentru o buna functionare este de cca.132mW (40mA@3,3V) pentru S2 si cca.386mW (117mA@3,3V) pentru S2B.

Modulele se pot configura sa functioneze in retele de diverse topologii, dar cu doua module in traista un utilizator nu prea se poate aventura, decat la o comunicatie punct-la-punct.

In documentatia fabricantului cel mai tare mi-a placut fraza “No configuration necessary for out-of-box RF communication”, adica “Pentru o comunicatie RF din prima nu este necesara nici o configurare”. Adevarat, daca vorbim de o retea XBee existenta, dar total fals la o prima incercare. Iata de ce.

Reteaua XBee a fost conceputa ca o retea cu mai multe noduri. Nodurile au rol bine determinat si pot fi de trei categorii:

  1. coordonator
  2. router
  3. dispozitiv de capat

Intr-o retea XBee poate exista un singur nod coordonator, mai multe noduri de tip router, restul fiind dispozitive de capat: senzori, afisaje, echipamente de uz casnic, etc. dotate cu asemenea module.

Coordonatorul este raspunzator pentru “construirea” retelei: scaneaza in jurul sau frecventele alocate si se “aseaza” pe un canal liber, isi rezerva o adresa de retea (PAN ID) si aloca adrese celorlalte noduri, care i se vor atasa.

Routerele se pot atasa retelei folosindu-se de adresa retelei, iar dupa aceea se ocupa de rutarea datelor primite, respectiv de atasarea nodurilor tip dispozitiv.

Nodurile tip dispozitiv se pot “agata” de retea prin conectarea la un router.

Modulele comercializate de robofun se livreaza preconfigurate ca routere. In starea de fabrica adresele PAN ID sunt 0, adica nodul odata pornit se poate atasa la orice retea existenta. Aici apare problema incepatorului. Chiar cu doua module pe masa comunicatia nu apare! De ce oare? Pentru ca nu exista inca retea, la care aceste doua noduri sa se agate. Neavand retea, nu vor primi adrese proprii si nu vor functiona. Trebuie sa configuram modulele astfel, incat sa simulam existenta unei retele.

Pentru a configurare vom folosi programul X-CTU. Instalarea dureaza cateva minute bune, pentru ca pe parcursul instalarii se vor descarca si fisierele actualizate ale tuturor modulelor XBee recunoscute de program.

Dupa aceea trebuie sa ne conectam la un XBee de-al nostru. Eu am folosit un breadboard in care am conectat modulul XBee introdus in soclu adaptor, iar soclul l-am conectat la un port USB printr-un modul FTDI de 3,3V

Pentru verificare:

FTDI

XBee

RXI

3 (Tx)

TXO

4 (Rx)

3V3

2 (3V3)

GND

1 (GND)

Pornim programul X-CTU, si daca conexiunile sunt corecte, apare imaginea urmatoare:

Nu vom detalia toate functiile programului, acestea se pot citi la nevoie (!) in documentatie.

Trecem in schimb la ultimul tab: Modem Configuration.

Ecranul e mai mult gol, pentru ca modulul XBee inca nu a fost recunoscut. Apasam butonul Read si rezultatul va fi:

Pentru orientarea in hatisul de informatii vom explica doar cele necesare unei manevre de test, cum ne-am propus:

COD

Detaliere

(0) ID – PAN ID

Adresa retelei la care se doreste conectarea. (Personal Area Network ID). Valoarea 0 inseamna oricare retea accesibila.

(0) OP – Operating PAN ID

Adresa retelei la care s-a conectat. Valoarea 0 insemna nici o retea.

(FFFF) OI – Operating 16-bit PAN ID

Adresa de 16 biti a retelei la care s-a conectat. Valoarea FFFF insemna oricare retea.

(0) CH – Operating Channel

Canalul radio pe care s-a conectat. Valoarea 0 insemna nici un canal

(13A200) SH – Serial Number High

Numarul de serie al modulului (partea superioara a adresei). Valoare unica inscrisa de fabricant.

(407E7145) SL – Serial Number Low

Numarul de serie al modulului (partea inferioara a adresei). Valoare unica inscrisa de fabricant.

(FFFE) MY – 16-bit Network Address

Adresa de 16 biti a modulului in cadrul retelei. Valoarea FFFE inseamna neconectat la retea.

(0) DH – Destination Address High

Adresa de destinatie a datelor, partea superioara. Valoarea 0 = fara destinatie

(0) DL – Destination Address Low

Adresa de destinatie a datelor, partea inferioara. Valoarea 0 = fara destinatie

Observam ca, unele randuri in ecranul cu aceste date sunt marcate cu verde, altele cu negru. Cele verzi se pot modifica la nevoie 🙂 , iar cele negre sunt doar informative, dar utile.

TOATE DATELE NUMERICE SUNT IN FORMAT HEXADECIMAL.

 

Avand doar doua module XBee la indemana vom proceda la construirea unei retele cu doua noduri. Ca orice retea XBee, va avea nevoie de adresa de retea, iar modulele odata conectate vor avea nevoie de niste adrese de destinatie pentru datele transmise, mai precis destinatia unui modul va fi adresa celuilalt modul si vice-versa. Sa vedem cum stam:

Numarul de serie al fiecarui modul se comporta in cadrul protocolului de comunicatie ZigBee ca o adresa. Daca “invatam” modulele cu adresa celuilalt, avem toate datele necesare ridicarii retelei cu doua noduri.

Cel mai simplu mod de a porni este sa configuram un nod ca un coordonator, acesta urmand sa se ocupe de restul treburilor.

Iata cum arata unul din modulele mele configurat ca si coordonator:

Se poate observa ca, adresa retelei am fortat-o la valoarea hexa 0x123456789ABCDEF, partile High (0x0013A200), respectiv Low (0x407E745) ale adresei de destinatie le-am luat de la modulul celalalt.

Coordonatorul s-a ocupat de construirea adresei de 16 biti (0x3808), de ocuparea canalului radio (0x0F) si de alocarea unei adrese proprii (0x0000). Coordonatorul totdeauna isi rezerva adresa 0x0000 intr-o retea.

Fiecarui nod i se poate atasa si un nume (NI – Node Identifier), care se poate folosi la o adresare mai usoara in cadrul unei retele mari. In exemplu am denumit coordonatorul ca “NODE A”.

Manevra de mai sus am repetat-o si pentru modulul B, cu mici diferente. Nu am modificat valoarea adresei de retea (PAN ID = 0x00), in schimb partile High (0x0013A200), respectiv Low (0x407E751) ale adresei de destinatie le-am luat de la modulul A, adica modulul coordonator.

Se observa ca adresa retelei proaspat construite se repeta si la acest modul, fara sa ne fi atins de aceasta. Mai mult, corespunde si adresa de 16 biti (0x3808), dar difera adresa nodului (0x9C38) in cadrul retelei.

Folosind intr-un nod un XBee cu adaptor + un modul FTDI/USB conectat la calculator, iar in celalalt nod un panou de test echipat cu un procesor mbed si cu al doilea modul XBee am testat comunicatia radio.

Procesorul mbed foloseste un port serial UART prin care preia datele de la XBee si le interpreteaza: daca soseste o cifra intre 1 si 4, atunci isi va comuta starile celor patru LEDuri proprii.

// Test comunicatii XBee cu mbed

#include "mbed.h"

 

Serial XBee(p9,p10); // configurare port serial

 

DigitalOut L1(LED1); // configurare iesiri pentru cele 4 LEDuri
DigitalOut L2(LED2);
DigitalOut L3(LED3);
DigitalOut L4(LED4);

 

unsigned char c; // buffer pentru simbolul citi de la UART

 

int main() {
 while(1) { // pana la infinit ...
 if (XBee.readable()) { // daca avem ceva pe portul serial
 c=XBee.getc(); // preluam un caracter
 XBee.putc(c); // il trimitem inapoi drept confirmare
 switch (c) { // si daca ...
 case '1': L1 = !L1; break; // e 1 -> comuta LED 1
 case '2': L2 = !L2; break; // e 2 -> comuta LED 2
 case '3': L3 = !L3; break; // s.a.m.d.
 case '4': L4 = !L4; break;
 } // switch
 } // if
 } //while
}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s