Python-Xbee

Python-xbee è  una libreria in python che permette di lavorare in modalità API sui moduli di comunicazione xbee ( vedi articolo: Digimesh ).

Digimesh

La libreria non implementa correttamente le api dei moduli Digimesh, per questo ho deciso di contribuire al progetto implementando i tipi di pacchetti mancanti.

Ho deciso di utilizzarla per sviluppare un progetto in cui dovrò mettere in comunicazione più arduino con un pc che funga da coordinatore.

Anche se alcune questioni sintattiche non mi aggradano troppo, trovo il python un ottimo linguaggio per la velocità con cui riesco a svilupparvi applicazioni funzionali, inoltre la libreria è molto semplice e anch’essa veloce da utilizzare.

Ecco un esempio:

In questo esempio ho voluto testare la funzione “ND” Network Discovery dei moduli Xbee. Al pc è connesso un Xbee Explorer e nell’area circostante sono attivi 2 Arduino Fio con anch’essi muniti di modulo Xbee DigiMesh.

Lo script non fa altro che un discovery dei nodi attivi, dopodiche invia un comando “RS” ciascuno per valutare la qualità del link.

In uscita viene restituita una tabella con identificativo,indirizzo e qualità della trasmissione.

#! /usr/bin/python

#importo Digimesh
from xbee import DigiMesh
import serial, time

#definisco una funzione di callback a cui saranno passati ipacchetti ricevuti
frame=[]
def print_data(data):
frame.append(data)

#inizializzo la seriale e vi associo la classe
ser = serial.Serial('/dev/ttyUSB0', 9600)
xbee = DigiMesh(ser, escaped=True, callback=print_data)

#invio il comando di scansione
print "eseguo la scansione dei nodi"
xbee.send('at', frame_id="S", command="ND")

#attendo 5 secondi che tutti i nodi abbiano risposto
time.sleep(5)
xbee.halt()
d=1
#per ogni pacchetto ricevuto eseguo il ciclo
for f in frame:
i=10
ID=''
while f['parameter'][i]!='x00':
ID+=f['parameter'][i]
i+=1
xbee = DigiMesh(ser, escaped=True)
#invio ad ogni modulo la richiesta della qualità di comunicazione
xbee.send('remote_at', frame_id='B', dest_addr_long=f['parameter'][2:10], command='DB')
indirizzo=' '.join( [ "%02X " % ord( x ) for x in f['parameter'][2:10] ] )
potenza=xbee.wait_read_frame()['parameter']
#stampa i dati ottenuti
print "nodo %d t| ID: %s t| Indirizzo: %s t|Potenza Segnale: -%d Db " % (d,ID,indirizzo,ord(potenza))
d+=1

xbee.halt()
ser.close()

Questo è quello che viene restituito nel mio caso:

 nodo 1 | ID: lulu3 | Indirizzo: 0013A200406914A4 |Potenza Segnale: -59 Db
 nodo 2 | ID: lulu2 | Indirizzo: 0013A20040691491 |Potenza Segnale: -48 Db

Digimesh.py

In allegato la nuova classe Digimesh in attesa che sia inclusa nel repository ufficiale:

digimesh.py

DigiMesh

Xbee e DigiMesh

In questi giorni ho cominciato a sperimentare con Arduino nel settore della comunicazion wireless. In particolare sto utilizzando dei moduli XBee prodotti da Digi nella versione DigiMesh.

Gli XBee sono essenzialmente dei moduli, prodotti dalla DIGI (www.digi.com - ex
Maxstream) che consentono il trasferimento dati via RF (Radio Frequenza) sfruttando
una normale comunicazione seriale. Questo vuol dire che per riuscire a trasferire dei
dati, senza fili, è necessario soltanto saper utilizzare la periferica UART inclusa sul
nostro microcontrollore preferito o la porta seriale del PC: è possibile difatti
immaginare, nella loro configurazione più semplice, una coppia di XBee come un
sostituto di un cavo seriale. Ne esistono di diverse tipologie e serie.
(tratto da "Easy bee di Giovanni Bernardo")

I moduli Digimesh appartengono alla serie 1 e si differenziano da essi esclusivamente dal firmware che permette di implementare a topologia di rete DigiMesh

Purtroppo ll protocollo è proprietario della DIGI, ma la sua versatilità mi ha spinto a considerarlo un interessante prodotto. In particolare consente di creare delle reti Mesh di tipo Peer to Peer (ovvero senza coordinatori):

In questo tipo di topologia ogni nodo può comunicare con tutti gli altri e di conseguenza non c’è bisogno di dispositivi che fungono da coordinatore.

Per maggiori informazioni vi consiglio la guida Easy Bee

API Mode

I moduli Xbee hanno la possibilità di funzionare in due diverse configurazioni:

  • Modalità Trasparente
  • Modalità API
Nella prima i dati inviati al modulo vengono trasmessi “così come sono” al nodo configurato (la configurazione avviene tramite la modalità AT, ma vi rimando alla lettura della guida linkata sopra)
La modalità API (Application Programming Interface) è un’alternativa alla modalità trasparente che consente, oltre che trasmettere e ricevere dati, di interagire ad un livello più basso con i moduli XBee consentendo, tra le altre cose, di:
  • Cambiare i parametri di configurazione (inviare comandi AT) senza entrare in modalità comandi
  • Conoscere l’ RSSI (Received Signal Strength Indicator – Indicatore di forza del segnale ricevuto)
  • Ricevere una conferma di pacchetto dati consegnato correttamente per ogni pacchetto trasmesso o un’indicazione di consegna fallita
  • Trasmettere dati a più destinatari Identificare l’indirizzo di chi ha trasmesso il pacchetto dati
La comunicazione in modalità API avviene inviando sulla linea seriale dei pacchetti di dati appositamente strutturati in frames.
Un frame è costituito da un byte di start (0x7E), due byte che identificano la lunghezza del messaggio, seguono quindi i bytes di dati da inviare e infine 1 byte di checksum: Si capisce quindi perchè la modalità trasparente abbia tale nome: i dati vengono inviati sulla seriale vengono inviati tal quale, in modalità API invece i dati vengono interpretati.