Gli esperimenti con l’xBee arduino continuano ed in questo articolo trovi come accendere e spegnere un led dal pc usando gli xBee. L’esperimento non è complesso per permetterti di approfondire i concetti su cui si basa ed ha permesso anche a me di comprendere alcuni utili trucchi prima di avventurarmi in progetti più complessi.
Come funzione l’XBee Arduino
I moduli XBee, come saprai, possono essere programmati e comunicano attraverso due pin Tx ed Rx mediante un protocollo di tipo seriale. Dopo aver configurato i due moduli in modo che possano comunicare tra loro la maggior parte della comunicazione è definita e non dovrai far molto altro che riutilizzare degli sketch base per la comunicazione seriale. Hai certamente già utilizzato la programmazione arduino e la comunicazione seriale per inviare al Serial Monitor, presente nell’IDE, i messaggi di debug. La comunicazione seriale che puoi utilizzare per l’xbee arduino non è differente, il progetto descritto in questo articolo utilizza il monitor seriale per inviare i comendi ad arduino e far accendere il led incorporato presente in corrispondenza del pin 13.
Il progetto xbee arduino
Come funziona il progetto è descritto nel paragrafo precedente, ecco cosa ti occorre:
- n. 1 arduino ( uno o simili )
- n. 2 moduli XBee configurati per comunicare sulla stessa rete ( network )
- n. 1 adattatore xBee arduino
- n. 1 adattatore xbee usb-seriale
Prima di tutto dovrai collegare l’arduino, senza l’adattattore xBee, al Pc, come fai di solito per caricare uno sketch nuovo, quindi puoi procedere a inviare lo sketch descritto nel paragrafo successivo. Lo sketch permette ad arduino di mettersi in ascolto sulla porta seriale ( usi quindi i pin 0 ed 1 di arduino ) e controllare che vi arrivi un segnale di tipo seriale, quando la comunicazione seriale è attiva legge il valore inviato e lo confronta con le variabili di tipo char definite in cima allo sketch. Scollega l’arduino dal Pc e colloca su di esso l’adattore xbee arduino ed uno dei due moduli configurati. Collega quindi il secondo modulo xbee all’adattatore seriale-usb e collega il tutto al computer, nell’IDE arduino vedrai comparire una nuova porta seriale: è quella relativa al tuo adattatore xbee arduino serial-usb, selezionala e apri il monitor seriale.
Lo sketch xbee arduino e monitor seriale
Ecco lo sketch che puoi caricare sull’arduino che riceverà i comandi seriali:
char acceso = 'A'; char spento = 'S'; byte rcvd; int pinLed = 13; void setup() { Serial.begin(57600); Serial.println( "Serial Start" ); pinMode( pinLed,OUTPUT ); digitalWrite( pinLed,LOW ); } void loop() { if (Serial.available()) { rcvd = Serial.read(); if ( rcvd == acceso ) { digitalWrite(13, HIGH); } if ( rcvd == spento ) { digitalWrite(13, LOW); } } }
non è complesso e si occupa principalmente di impostare la comunicazione seriale sui 57600 baud e mettersi in ascolto sui pin seriale 0 ed 1 predefiniti di Arduino. Alle linee 01-02: definisci due variabili di tipo char il cui valore è uguale a quello atteso per accendere o spegnere il led, in pratica quando sulla seriale riceverai “A”: il led sul pin 13 si accenderà, quando riceverai “S” si spegnerà.
Important!
I valori A ed S inviati dalla seriale devono essere maiuscoli.
linea 03: definisci la variabile di tipo byte in cui memorizzi il valore letto sulla seriale; linea 04: drfinisci il pin a cui è collegato il led da accendere, è ovvio che se vorrai collegare un led ad un altro pin dovrai cambiare questo valore; linee 07-08: imposta l’apertura di un canale seriale a 57600 baud e scrivi sul monitor seriale “Serial Start” questo messaggio lo vedrai solo quando anche l’arduino ricevente è collegato al computer ed il monitor seriale impostato sulla porta dell’arduino; linee 10-11: imposta il pin 13 in modalità OUTPUT e poino a LOW il suo valore iniziale; linea 15: all’interno del loop() verifica che sia attiva la comunicazione seriale usando il metodo available() dell’oggetto Serial; linea 16; in caso di comunicazione seriale attiva leggi il valore proveniente dalla porta seriale e assegnalo alla variabile rcvd; linee 18-20: confronta il valore memorizzato nella variabile rcvd con quello impostato nella variabile acceso e se sono identici, hai ricevuto A, porta a HIGH il valore dl pin 13; linee 22-24: esegue la medesima operazione di confronto della linea 18 ma con la variabile spento;
Il video dell’xbee arduino
Ho realizzato un breve video di come funziona questo esperimento:
Buona comunicazione xbee arduino !!!
38 commenti
Vai al modulo dei commenti
Domanda credo stupida:
ma se metto la shield per lo xbee su arduno, questa prende tutti gli ingressi analogici. Vuol dire che non posso più utilizzarli ? Oppure continuano ad utilizzarli utilizzando i pin della shield?
Grazie
Autore
Ciao Giordano,
quasi tutte le shield coprono gran parte dei pin arduino ma usano solo un limitato numero di pin.
L’adattatore XBee usa principalmente i pin 0 ed 1 di arduino per la comunicazione ed i pin 5v e Gnd per l’alimentazione del modulo.
Mauro
Dove trovo queste informazioni ? :S
Autore
Ciao Giordano,
i produttori di shield solitamente pubblicano sui loro siti tutte queste info ed i rivenditori aggiungono i link alle schede prodotto.
Se la shield usa delle librerie specifiche includono i link anche a quelle ed a qualche esempio di utilizzo.
Io diffido da chi non pubblica queste informazioni ed evito di acquistare le shield se non complete di documentazione.
Mauro
Devo informarmi meglio e studiare a fondo questo link http://arduino.cc/en/Guide/ArduinoWirelessShield ma su due piedi mi chiedo a cosa serva lasciare liberi i pin analogici in ingresso se vengono utilizzati dalla shield… Se inserisco un sensore in 0 o in 1 posso incorrere in errori secondo la tua esperienza?
Io per il funzionamento pensavo utilizzasse solo l’ICSP…
Mauro grazie sempre per le tue cortesi risposte e Buon Natale!
GS
Autore
Ciao Giordano,
ci sono molti motivi per cui le shield riportano anche i pin che usano, ad esempio:
1. per supportare le shield superiori, ad esempio se una shield usasse tutti i pin analogici e non avesse un connettore femmina sopra avresti un punto di ancoraggio in meno per le shield superiori;
2. alcuni pin supportano protocolli ( ad esempio I2C ) che non si limitano ad una sola applicazione;
3. alcuni pin potrebbero servire alle shield superiori per determinare cosa fa la shield sottostante;
ecc…
Più usi e ti documenti e più ti renderai conto di quanto siano utili.
Mauro
Con la schield Xbee ufficiale, se inserisco un sensore o un altro segnale in 0 o in 1 posso incorrere in errori secondo la tua esperienza??
Autore
Ciao Giordano,
intendi sul pin 0 e 1 digitale di arduino? Se si la risposta è complessa in quanto sono i pin Tx ed Rx di Arduino e dovrai fare molta attenzione già solo in fase di invio dello sketch.
Prova a leggere il mio corso on-line per capirne di più.
Mauro
mmm no intendevo gli ingressi analogici
Autore
Ciao Giordano,
nenache io 🙂
Per convenzione con arduino quando scrivi pin 0,1,2,3,4..13 ti riferisci ai pin digitali, mentre quando scrivi A0,A1..A5 ti riferisci a quelli analogici.
Mauro
Salve, mi accodo a questo articolo esistente riguardo gli xbee e ne approfitto per porre un quesito.
Sono in possesso di due Arduino Intel Galileo sul quale ho montato due xbee-shield con annessi moduli xbee S2. Dovrei trasmettere un pacchetto da un galileo all’altro usando la comunicazione xbee.
Ho però il problema di dover utilizzare contemporaneamente comunicazione xbee e serial monitor, il che mi crea molti problemi su galileo non potendo usare la libreria “softwareserial.h”.
C’è una soluzione per usare contemporaneamente sia il monitor che la comunicazione xbee?
Le sarei infinitamente grato se riuscisse a darmi una risposta.
Grazie
Autore
Ciao Carlo,
se ricordo bene la Galileo ha una sola porta seriale fisica e senza la softwareserial.h non conosco altri modi per usare una seconda communicazione seriale.
Potresti provare dal sistema operativo installato se non usa anche lui la Serial di default.
Perdona la mia ignoranza Mauro ma cosa intendi per “provare dal sistema operativo”?
Autore
Ciao Carlo,
se non ricordo male sulla Galileo è installato un proprio sistema operativo, mi sembra un linux o simile.
Scusami, non avevo capito.
Magari dico una cavolata ma, un’altra soluzione non potrebbe essere quella di collegare galileo attraverso la porta usb-host di cui è dotato per leggere/scrivere dati da/su un serial monitor diverso da quello dell’ IDE Arduino?
Grazie per la pazienza.
Autore
Ciao Carlo,
la porta usb-host, così come descritta, serve per collegare un dispositivo usb-client, se ne possiedi uno in grado di simulare questa modalità e di mostrarti in qualche modo le info che transitano su quella porta puoi provare, non saprei come impostare questa funzionalità sulla Galileo.
I computer di solito sono anch’essi usb-host.
Salve. Sto cercando di fare un progetto per l’esame riguardante una macchina telecomandata, comandata tramite pc, sfruttando arduino ed i moduli xbee. Volevo sapere se era possibile effettuare un’invio automatico dei caratteri, per non stare sempre a premere il tasto “invio”, perchè mi rimane scomodo. Cioè vorrei far muovere in avanti la macchina solamente premendo un tasto o tenendolo premuto, ad esempio “w”, senza ogni volta premere “invio”.
Grazie in anticipo, Samuele.
Autore
Ciao Samuele, quesito interessante, dovresti cambiare l’interfaccia lato Pc con un programma che invii i caratteri che desideri senza premere invio.
Il monitor seriale non penso abbia questa possibilità.
Grazie mille per le tue risposte Mauro.
Fortunatamente ho scoperto che Galielo, a differenza di Arduino, non utilizza i piedini 0 e 1 per comunicare con il serial monitor. Per comunicare attraverso questi ultimi bisogna usare Serial1; questo consente di utilizzare contemporaneamente sia la shield xbee che il serial monitor dell’IDE.
Autore
Ottima informazione Carlo,
mi piacerebbe pubblicare queste scoperte in un articolo sulla Galileo.
Ho risolto, grazie. C’è un programma X-CTU della Digi International che ti permette di interfacciare i moduli xbee con il pc, è molto buono come programma e facile da usare.
Autore
Ciao Samuele,
bene è lo stesso che ho usato io all’inizio con Windows, oggi uso altri programmi per Mac.
Salve Mauro,
per prima cosa ti faccio i complimenti per il sito ed un ringraziamento perché grazie ad esso sto riuscendo a capire qualcosa su arduino e sui vari componenti.
Sono intento nella realizzazione di un progetto ma al momento mi sono bloccato. In pratica ho costruito un sistema con fotocellule che al passaggio di oggetto/persona inviano un segnale ad un arduino (al quale sono collegate via cavo) avviando così il cronometro realizzato con lo stesso arduino, fin qui non ci sono problemi e funziona tutto benissimo.
Ora avrei la necessità di modificare questo progetto, ossia dovrei tenere le fotocellule lontane dall’arduino e collegarle ad esso senza cavi, ho pensato quindi di utilizzare per realizzare ciò l’xBee.
La mia domanda perciò parte da questo punto, devo utilizzare 2 arduino e 2 xbee (sull’arduino A collegherò le fotocellule ed 1 xbee, mentre sul B ci sarà il cronometro ed il secondo xbee) oppure sono sufficienti 2 xbee ed 1 solo arduino?
Qualcuno mi stava dicendo che forse conveniva usare un trasmettiore ir collegato alle fotocellule ed un ricevitore all’arduino, secondo te cosa sarebbe meglio utilizzare? gli xbee o trasmettitore-ricevente ir?
Ti ringrazio per l’attenzione e chiedo scusa se la mia domanda non è formula benissimo, ma purtroppo sto facendo da poche settimane i primi in questo ambito e quindi non conosco termini tecnici.
Saluti
Marco
Autore
Ciao Marco,
lo scopo del tuo progetto, da quanto leggo, è misurare i tempi e pertanto ogni strumento che introduca un ritardo nella comunicazione fa variare, e non di poco, la rilevazione.
Se a questo aggiungi che il tempo di risposta potrebbe essere variabile all’interno di due misurazioni comprendi che la trasmissione: sia essa xbee, IR, RF, WiFi, ecc… è certamente causa di errori di rilevazione.
Se tutto quello che ho scritto non è rilevante per te puoi scegliere indifferentemente xbee o IR in base a quello che ritieni più facile da usare.
L’xBee ha bisogno di un arduino per ciascun sensore ed uno come ricevitore, tuttavia anche l’IR potrebbe averne bisogno a meno che tu non sappia realizzare un circuito che invia via IR il segnale della fotocellula.
Ciao Mauro,
ti ringrazio per la celere e completa risposta.
Ignoravo il fatto che l’xbee richiedesse per ogni sensore un arduino e stando così le cose il tutto si complica un po’ visto che dovrei costruire 2 barriere (una per la partenza ed una per l’arrivo) da almeno 5 fotocellule l’una pertanto necessiterei di 10 arduino…alla luce dei fatti penso che in questa circostanza opterò per l’ir.
Avrei un’ultima domanda: il circuito per inviare via ir il segnale della fotocellula lo posso realizzare sempre con arduino, vero? in tal caso potrei farmi aiutare da un amico nella sua realizzazione però rimarrebbe il problema che il trasmettitore ed il ricevente dovrebbero essere in linea tra loro per poter comunicare, vero?
Stando così le cose nascerebbero difficoltà non per la partenza, ma per l’arrivo visto che potrebbe distare dalla partenza diversi metri (anche oltre 50 metri), pertanto il ricevente, che dovrebbe essere a circa 3-4 metri dietro alla barriera di partenza non riuscirebbe a ricevere il segnale del trasmettitore della barra di arrivo….dico giusto oppure sto prendendo un’accantonata?
Ti ringrazio nuovamente per la disponibilità dimostrata.
Saluti.
Marco
Autore
Ciao Marco,
noto con piacere che hai ignorato la parte relativa al ritardo, a mia avviso, principale aspetto di demerito del progetto in quanto non affidabile.
In merito alla scelta dell’IR incorri nei problemi che hai avidenziato.
Per la versione xBee se le fotocellule di partenza puoi collegarle ad un unico arduino come quelle di arrivo risolvi con soli 3 arduino.
Ciao Mauro,
non ho ignorato il ritardo, è un problema sul quale al momento non ho soluzione (sono un semplice appassionato e le mie competenze in materia sono limitate) e comunque la determinazione dei tempi al momento è solo amatoriale (mi serve solo per vedere se c’è una costanza di giro e/o se ci sono miglioramenti, ovviamente la determinazione verrà presa agli inizi anche con cronometro manuale), più in là dovrà essere, se si riescisse a ridurre il gap, utilizzata in gare ufficiali.
Ora mi è sorto un pensiero: ma se in partenza registra con un ritardo X1 ed in arrivo registra con un ritardo X2 alla fine il tempo risulta essere attendibile o no? ovviamente ammettendo che X1 sia uguale a X2, oppure i ritardi X1 e X2 sono tra loro differenti?
Ti ringrazio nuovamente e ti chiedo scuse per le mille domande.
Marco
Autore
Ciao Marco,
ti invito a rileggere la mia risposta.
Il ritardo è incalcolabile e variabile da lettura a lettura per cui inattendibile.
Scusate se sono profano…ma un ritardo per la registrazione dei tempi tra due moduli wifi che hanno un ritardo di segnale , dato che non si parla di muovere qualcosa ma solo di registrare dei tempi…non può essere gestita inserendo una libreria orologio nei moduli xbee trasmettitori ? In questo modo i sensori rivelano i tempi un programma associa quei tempi all’ora esatta in quel momento e spedisce tutto il pacchetto al ricevente che analizza tempi registrati ed ora di rilevamento e fornisce il responso su schermo. In questo modo ci possono essere ritardi anche di ore , i tempi saranno sempre esatti al millesimo……poi non lo so può essere pure che ho detto boiate 😉
Autore
Ciao Fabrizio,
la tua soluzione è interessante in generale, tuttavia non riesco a comprendere a quale problematica vada applicata.
oops! ti chiedo scusa per la domanda stupida.
Vorrà dire che lo utilizzerò a scopo puramente amatoriale.
Grazie ancora per tutte le informazioni che mi hai dato, per una persona ignorante in materia come me sei un’ancora di salvezza.
Ti auguro un buon proseguimenti di giornata.
Alla prossima.
Marco
Autore
Ciao Marco,
hai posto domande corrette ed ogni dubbio è lecito.
Se il tuo sistema resta un esercizio di tecnica puoi usare senza problemi l’xBee e collegare tutte le fotocellule di start ad un unico arduino via filo e trasmettere il loro segnale un’unica volta magari con le differenze rilevate.
Ciao Mauro
complimenti veramente per il blog, vorrei chiederti consiglio su come sviluppare una comunicazione xbee tra più Arduino…di cui uno master e 5 slave con un minimo di controllo dell’arrivo dei messaggi a destinazione. Che tipo di xbee ho bisgno, come va impostato..etc..? Ho provato a vedere se avevi postato già qualche articolo in merito ma ho solo trovato questo articolo sulla comunicazione punto a punto.
Grazie in anticipo.
Francesco
Autore
Ciao Francesco,
articoli sugli Xbee ne ho pubblicati Diversi e in uno almeno ho mostrato com programmarli.
La parte semplice del XBee é proprio la programmazione dei singoli moduli come master e slave perché sono predisposti per farlo.
Parte più complessa, ma non impossibile, é il controllo del flusso in quanto non ne sono predisposti, che io sappia, per cui devi implementarlo via sw arduino.
Se dovessi farlo io userei almeno 3byte per ogni trasmettitore:
1. id del trasmettitore ( così so da chi arriva )
2. id del messaggio o info da inviare
3. messaggio o info da inviare
In questo modo il master può verificare le informazioni e inviare al punto trasmittente un messaggio di ricevuto id …
Ci sono di certo altri metodi e se ne hai in mente uno tuo esponimelo mi fa piacere condividere le informazioni e il idee.
Grazie mille Mauro per la risposta, in prima istanza ho pensato anche io a un tipo di gestione di questo tipo, con anche i messaggio ACK/NACK come minimo controllo di flusso, quello su cui ho ancora qualche dubbio è l’impostazione xbee per far inviare i msg in broadcast, quale tipo di xbee utilizzare per poter coprire distanze interne di circa 20mt e se alla fine conviene utilizzare questo tipo di approccio o è meglio voltare tutto su wifi con una scheda wifi per ogni arduino.
Grazie.
Francesco
Autore
Ciao Francesco, gli XBee che trovi in vendita sui siti specializzati di domotica per makers ( ad esempio: robot-domestici.it ) hanno coperture superiori ai 20m.
Buon giorno Mauro.
ho comprato due xbee ma non so come collegare i due dispositivi per accendere un led…mi potresti aiutare ?
Autore
Ciao Elvis,
hai già letto i miei articoli ?
E’ tutto descritto passo-passo.