Il titolo è riferito alla possibilità di far comunicare due schede arduino attraverso moduli xbee da cui: xbee arduino-arduino. Al primo arduino è affidato il compito di trasmettere il segnale proveniente da 6 pulsanti all’altro a cui colleghi tre led. Uno dei due arduino sarà quindi il trasmettitore, indicato come Tx, ed è quello a cui sono collegati i pulsanti. Il secondo arduino è quello che riceve il segnale, indicato come Rx, a cui sono collegati i led. Come sai ogni modulo xbee può sia trasmettere sia ricevere per cui usarli in questo modo è riduttivo, in un prossimo progetto potresti provare a rendere entrambi gli arduino sia Tx che Rx.
Materiale per il tutoria xbee arduino-arduino
E’ quasi tutto doppio:
- n.2 arduino ( uno o similari )
- n.2 adattatori xbee-arduino
- n.2 moduli xbee
- n.2 breadboard
- n.2 batterie per alimentare arduino ( 7-12v )
- n.3 led
- n.6 pulsanti
- n.6 resistenze da 330ohm
- cavetti per breadboard
Se non sai come configurare i moduli xbee puoi leggere questo articolo. Se vuoi comprendere il funzionamento della comunicazione seriale utilizzata dai moduli arduino con un progetto più semplice puoi leggere questo.
Montaggio del progetto
Dividi il montaggio in due parti: quella dell’arduino Tx e quella dell’Rx
Montaggio del Tx
La parte Tx del progetto la puoi assemblare utilizzando
- un arduino
- un adattatore xbee-arduino
- un modulo xbee
- una breadboard
- 6 pulsanti
- 6 resistenze.
Lo schema è quello descritto in questo articolo con l’aggiunta di una sesta resistenza e del 6° pulsante in fondo: per ogni pulsante ho aggiunto all’immagine una lettera il cui significato ti sarà chiaro quando leggerai lo sketch. Tutti i pulsanti collegati a matrice sono connessi al pin A0 di arduino che leggerai per individuare il pulsante premuto.
Montaggio dell’Rx
L’arduino Rx è cotstituito da:
- un arduino
- un adattatore xbee-arduino
- un modulo xbee
- una breadboard
- tre led da 5mm.
Non ho usato una resistenza per i led, anche se sarebbe corretto farlo, in quanto il mio progetto è solo un esperimento e non accendendo i led a lungo non rischi di brciarli, se vuoi prolungare l’accensione dei led nel tuo progetto ti consiglio di utilizzare una resistenza da almeno 200ohm o superiore. I tre led hanno il catodo ( Gnd ) collegato al polo negativo del circuito ed il polo positivo di ciascun led è collegato rispettivamente ad uno dei pin 9,10,11 di arduino. La figura seguente chiarisce i collegamenti da eseguire:
Sketch del Tx
Gli sketch sono due, uno per ciascun arduino, quello relativo alla parte di trasmissione xbee-arduino-arduino è:
/* * * Sketch di Trasmissione xBee * * @autor Mauro Alfieri * @url: https://www.mauroalfieri.it * twitter: @mauroalfieri * */ int A[] = {0,20}; int B[] = {505,525}; int C[] = {680,700}; int D[] = {765,785}; int E[] = {810,830}; int F[] = {850,870}; int pinINPUT = A0; void setup() { Serial.begin(57600); Serial.println( "Serial Start" ); pinMode( pinINPUT,INPUT ); } void loop() { int button = analogRead( pinINPUT ); if ( A[0] <= button && button <= A[1] ) { Serial.print("A"); } if ( B[0] <= button && button <= B[1] ) { Serial.print("B"); } if ( C[0] <= button && button <= C[1] ) { Serial.print("C"); } if ( D[0] <= button && button <= D[1] ) { Serial.print("D"); } if ( E[0] <= button && button <= E[1] ) { Serial.print("E"); } if ( F[0] <= button && button <= F[1] ) { Serial.print("F"); } delay( 100 ); }
leggendolo linea per linea: linee 11-16: definisci 6 array chiamati con le lettere dalla A alla F di 2 elemnti ciascuno, il primo elemnto indica il valore minimo rilevato alla pressione del corrispondente tasto, il secondo indica il valore massimo. In pratica alla pressione del pulsante contrassegnato con la lettera A potresti leggere un valore sul pin A0 che varia tra 0 e 20 per cui eseguendo un ragionamento contrario se leggi un valore compreso tra 0 e 20 vuol dire che hai premuto il pulsante A; linea 18: definisci una variabile chiamata pinINPUT il cui valore corrisponde al pin a cui hai collegato i pulsanti; linee 21-22: imposta la comunicazione seriale su 57600 baud e scrivi “Serial Start”; linea 24: imposta la modalità di uso del pinINPUT a INPUT; linea 28: ad ogni ciclo di loop() imposta la variabile button come il valore analogico letto su pinINPUT; linee 30-35: controlla che il valore button sia incluso in uno degli intervalli definiti dagli array A-F, quando il valore del pulsante è nel range di un array invia al canale seriale la corrispondente lettera; In questo sketch ti limiti solo a riconoscere quale pulsante è stato premuto e a trasferirne il valore sul un ipotetico monitor seriale. Se togli il modulo xbee ed il suo adattatore e colleghi arduino al computer vedrai sul monitor seriale le letter A,B,C..F in funzione del pulsante che premi. Quando il modulo xbee è collegato questi valori vengono dirottati al modulo che li comunica al suo modulo ricevente.
Sketch dell’Rx
lo sketch relativo all’arduino predisposto a ricevere è:
/* * * Sketch di Ricezione xBee * * @autor Mauro Alfieri * @url: https://www.mauroalfieri.it * twitter: @mauroalfieri * */ // Accensione Led char ledAa = 'A'; char ledBa = 'B'; char ledCa = 'C'; // Spegnimento Led char ledAs = 'D'; char ledBs = 'E'; char ledCs = 'F'; int pinLedA = 9; int pinLedB = 10; int pinLedC = 11; byte rcvd; void setup() { Serial.begin(57600); Serial.println( "Serial Start" ); pinMode( pinLedA,OUTPUT ); pinMode( pinLedB,OUTPUT ); pinMode( pinLedC,OUTPUT ); digitalWrite( pinLedA,LOW ); digitalWrite( pinLedB,LOW ); digitalWrite( pinLedC,LOW ); } void loop() { if (Serial.available()) { rcvd = Serial.read(); if (rcvd == ledAa) digitalWrite( pinLedA,HIGH ); if (rcvd == ledBa) digitalWrite( pinLedB,HIGH ); if (rcvd == ledCa) digitalWrite( pinLedC,HIGH ); if (rcvd == ledAs) digitalWrite( pinLedA,LOW ); if (rcvd == ledBs) digitalWrite( pinLedB,LOW ); if (rcvd == ledCs) digitalWrite( pinLedC,LOW ); } }
leggendo anche in questo caso linea per linea: linee 12-14: definisci 3 variabili di tipo char a ciascuna delle quali assegni un valore da A a C, ti serviranno per riconoscere il valore inviato del modulo xbee; linee 17-19: definisci altre tre variabili simili a quelle delle linee 12-14 a cui assegni i valori da D ad F; linee 21-23: definisci tre variabili a cui assegni il valore del pin corrispondente ad uno dei led; linea 25: definisci una variabile di tipo byte in cui memorizzerai il valore proveniente dalla seriale; linee 28-29: imposta un canale di comunicazione seriale a 57600 baud; linee 31-37: per ciascun pin a cui è connesso un led definisci la modalità di funzionamento come OUTPUT e imposta a LOW il suo valore iniziale; linea 42: all’interno della funzione loop() controlla che il canale seriale sia attivo con il metodo available() dell’oggetto Serial; linea 43: leggi il valore inviato sul canale seriale mediante il metodo read() ed imposta tale valore nella variabile rcvd; linea 45: confronta il valore memorizzato nella variabile rcvd con il valore della variabile ledAa se i due valori sono identici, quindi dal canale seriale hai ricevuto “A” ( senza virgolette ) allora porta al valore ∫ il pinLedA; linee 46-50: esegui i confronti anche per gli altri valori memorizzati nelle variabili ledXy, dove X è B,C…F e y può essere a o s.
Il video dell’xbee arduino-arduino
ecco come funziona il tuo progetto una volta ultimato:
Buona sperimentazione a distanza !!!
39 commenti
Vai al modulo dei commenti
Buongiorno Mauro poiche’ di inquinamento elettromagnetico negli appartamenti ve ne gia’ tanto volevo chiederti se questi moduli trasmettono una portante anche quando non stanno inviando dati o nel caso se e’ possibile predisporli per questo . Ancora complimenti per la chiara esposizione degli argomenti !
Autore
Ciao Nicola,
puoi verificare questa informazione sul sito del produttore dei moduli in quanto la specifica XBee prevede una modalità sleep tuttavia questa deve essere implementata dal costruttore dell’hw.
Mauro
Mi documenterò sulla funzione sleep , spero comunque il modulo si possa settarlo x farlo funzionare solo in modalità ricevitore . Grazie e buon week end !
Autore
Ciao Nicola,
quando avrai ottenuto le info se ti va puoi condividerle sul blog.
Mauro
Ciao Mauro, mi sono imbattuto in un problema, vorrei inviare 5 segnali analogici da un arduino all’altro, ma ho notato che con XBee è possibile trasmettere un valore che viene associato ad una singola variabile. Sostanzialmente ho collegato 5 potenziometri alla parte Tx, come posso fare in modo che la parte Rx faccia ruotare 5 servo, ciascuno associato ad un potenziometro?
Grazie
Autore
Ciao Gabriele,
puoi seguire il mio tutorial sul beginner robot con xbee.
In quell’articolo ho descritto come inviare 2 segnali PWM uno per ciascun asse del joystick, se hai 5 potenziometri puoi usare la stessa tecnica per incrementare il numero di segnali da inviare.
Ciao Mauro,
ho provato a seguire i due tutorial sul Beginner Robot, ma una volta provato tutto, leggendo dal monitor seriale, i valori passano da una variabile ad un’altra… In sostanza, ho un guanto di trasmissione con un sensore di flessione solo sul mignolo (giusto per fare i test), e l’Arduino ricevente mi dà sul monitor seriale il valore letto ma ad ogni lettura questo è associato ad un dito diverso (ad esempio, tenendo piegato il sensore, ad una lettura mi viene fuori il mignolo a 120 e le altre dita a 0, poi a quella successiva il pollice a 120 e le altre dita a 0, e a volte addirittuta tutte le dita a 0).
Spero di non esser stato troppo poco chiaro, eventualmente potrei inviare dei pezzi degli sketch?
Grazie, come sempre!
Autore
Ciao Gabriele,
da come lo descrivi è un evidente problema di trasmissione dei dati seriali.
Io ti consiglio di aggiungere in trasmissione un carattere di inizio o di fine trasmissione e di verificarlo sul ricevitore per sapere quando inizia il flusso di dati seriali da leggere.
Nelle prossime settimane pubblicherò il progetto presentato in occasione dell’arduino day e che si basa sulla comunicazione seriale di alcuni valori per controllare un robot.
Non ho il tempo, anche volendo, di controllare e correggere sketch non scritti da me.
Grazie mille! Proverò a seguire il tuo consiglio
Purtroppo non riesco a venirne fuori… Avendo un solo sensore, e gli altri 4 ingressi analogici collegati a massa, comunque l’Arduino ricevente non riesce probabilmente a distinguere i 5 segnali inviati.
Ho visto nei commenti che hai detto che sul blog hai spiegato la differenza tra il “Serial.print” e il “Serial.write”, ma non riesco a trovare l’articolo. Ora per l’Arduino che trasmette ho usato solamente “Serial.write”, forse è questa funzione che mi dà problemi?
Anche perchè non riesco a capire bene come vengano inviati i segnali e poi ricevuti da Arduino, se ogni volta che metto Serial.read() mi legge tutto assieme o meno…
Grazie,
Gabriele
Autore
Ciao Gabriele, ho descritto la differenza tra Serial.print e Serial.write nell’articolo sull’uso di Xbee e dello scambio di segnali analogici via serale.
É giusto Seral.write se vuoi inviare in formato byte.
Se leggi nel reference guide di arduino (sul sito ufficiale) riporta che SerialRead legge un byte alla volta per cui se vuoi leggere 5 byte devi concatenarli.
Ti consiglio la lettura dei miei articoli su Xbee é tutto descritto li quello che ti sto scrivendo.
Mauro ma i moduli Xbee non bisogna configurarli??? E lo shield???
Autore
Certo Andrea, ho scritto un tutorial su come configurarli. Lo shield non devi configurarli ti basta acquistarlo da un rivenditore di materiale per Arduino.
Ciao Mauro,
posso avere qualche consiglio su come fare una comunicazione tra più arduino usando sempre i moduli xbee?
Devo configurarli in modo particolare? Che tipo di xbee devo utilizzare? Io devo fare una comunicazione tra un arduino master e 5 slave che devono attuare dei relay a seconda del comando ricevuto e vorrei anche che rispondessero con un feedback per confermare l’attivazione. Resto in attesa di un tuo gentile riscontro.
Complimenti per il blog. Grazie.
Francesco
Autore
Ciao Francesco ti ho risposto questa mattina alle 08.01
Ciao Mauro devi perdonarmi ma non trovo da nessuna parte la tua risposta..puoi reinoltrarmela gentilmente?
Grazie in anticipo.
Francesco
Autore
Ciao Francesco é tra i commenti all’articolo dopo la tua prima richiesta di aiuto.
Salve,
le scrivo per esporle un problema riguardante la temporizzazione del Serial.write(). Avendo un pulsante sul pin 7, devo andare a scrivere sulla Serial.write un flusso di dati per attivare un led a distanza. Esiste una funzione o alcuni accorgimenti da prendere per andare ad temporizzare un flusso stabile di dati per tot secondi, come se io tenessi premuto costantemente il bottone?
In fede la ringrazio
Samuele
Autore
Ciao Samuele,
non sono certo di aver compreso ciò che vuoi ottenere.
Quello che ho compreso io è che vorresti poter premere un pulsante, connesso al pin 7, ed inviare una stringa seriale ripetutamente per un dato tempo, ad esempio un secondo.
Se quanto scritto è corretto, si può fare. Devi usare la funzione millis() in un ciclo while, su come fare ti consiglio la lettura di articoli che parlano di entrambi i comandi e di consultare la guida ufficiale sull’uso di questi comandi sul sito ufficiale arcuino.
Ciao Mauro, perdona la curiosità ma non sono riuscito a togliermela in altro modo, come hai fatto a collegare il cavo nero GND ed il cavo rosso 5v direttamente alla shield?? Hai saldato due pin femmina sulla scheda??
Grazie per l’attenzione e complimentoni!!
Fulvio
Autore
Bravo Fulvio, hai scoperto il mio trucco 🙂 La cosa migliore che sono riuscito a fare è saldare i due pin femmina in corrispondenza del +5v e Gnd.
Ciao,
l’articolo è davvero interessante. Però ti volevo chiedere una cosa,
Io sto progettando un servo che viene guidato da un joystick ovviamente tutto senza fili attraverso xbee. Ma ho per forza bisogno di due arduino oppure ne basta anche uno solo? Aspetto tue rispose grazie
Autore
Ciao Alessio,
esiste anche la possibilità di usare direttamente il modulo XBee con i comandi AT per controllare due uscite PWM, tuttavia è una tecnica che io non ho mai approfondito.
Mauro,
oltre a complimentarmi, affacciandomi a questo, per me, nuovo mondo, avrei bisogno di porti una domanda.
E’ possibile con un solo modulo tx in rf a 433 comandare diversi rx in modo indipendente o è necessario montare tanti tx quanti sono gli rx.
Ti ringrazio per l’attenzione.
Autore
Ciao Leo,
con XBee è possibile in quanto è possibile eleggere un coordinator e diversi end-point
Con moduli Rf se esiste questa modalità puoi eseguire la medesima operazione.
Ciao Mauro, complimenti per l’attenzione che dedichi alle pagine.
Ho seguito un tuo corso di Arduino starter l’anno scorso ed in un anno ho realizzato parecchi progetti legati alla fotografia. Ora vorrei imparare ad utilizzare xbee, ma sebbene i tuoi tutorial siano sempre molto preciso ed accurati, vedo che nascono parecchi dubbi e domande, vorrei così partire con il giusto approccio e seguire un tuo corso in cui vengono presi in esame tali moduli.
Potresti indicarmene uno? Io abito in Piemonte vicino Novara.
Grazie mille. Ciao Alberto
Autore
Ciao Alberto,
mi fa piacere leggere quello che scrivi dopo aver frequentato un mio corso.
Sono contento di leggere che ti sia servito e che oggi tu abbia realizzato dei progetti tuoi.
Ad oggi non ho organizzato un corso specifico sugli XBee ma sto organizzando dei corsi a tema e terrò in considerazione la tua idea di un corso su tali componenti.
Se ti iscrivi alla newsletter sarai informato dei prossimi corsi oppure consulta il sito su cui pubblico i banner dei corsi in programma.
ciao mauro,
mi consigli un link dove acquistare xbee + shield? Grazie!
Autore
Ciao Luca,
io acquisto sempre da robotics-3d.com ed in 1/2 giorni ho il materiale a casa se disponibile ( pallino verde )
Ciao,
complimenti per la chiarezza dei tuoi articoli e per l’impegno che ci metti.
Volevo chiederti se (e come) si puo’ mettere su una semplice rete di xbee.
Per esempio:
Un xbee con tre led (come quello presente in questo articolo) che riceve segnali da due xbee.
Uno dei due xbee trasmettitori che ha tre pulsanti che servono per ACCENDERE i tre led presenti nel ricevitore ed un xbee che ha sempre tre pulsanti ma che servono per SPEGNERE i tre led.
HO LETTO CHE C’E’ DA METTERE A PUNTO LA CONFIGURAZIONE DI UN COORDINATORE E DIVERSI ROUTER. MA NON CAPISCO COME IL COORDINATORE PUO’ ACCETTARE SEGNALI DA PIU’ END POINT SE NELL’ELENCO DEI RICEVENTI (in fase di configurazione), C’E’ SPAZIO SOLO PER UN RICEVITORE.
(NON SO SE SONO STATO CHIARO)
a presto e grazie
Alessandro
Autore
Ciao Alessandro,
ti consiglio la lettura di tutti i miei articoli dedicati a questa tecnologia.
Definisco in modo dettagliato il funzionamento degli XBee come reti MESH e come configurare un coordinator con un indirizzo di riferimento.
Non saprei definire meglio in un commento quello a cui ho dedicato una serie di articoli.
P.S. evita il MAIUSCOLO nei commenti è indice di URLO secondo la netiquette internet e non è certamente quello che vuoi fare.
Ciao Mauro,
ho un problema con i moduli xbee:
il tramettitore è un lilypad ed il ricevente è romeo controller v2(con la porta seriale si comporta come arduino leonardo, così mi sembra…). I due moduli xbee non si “vedono”. Se utilizzo romeo controllerv1, tutto funziona!
Mi è stato detto che romeo v2 per quaanto riguarda xbee utilizza serial1, ma come devo scrivere il programma per il trx esattamente? metti che il ricevente è costituito da un potenziometro a slitta ed il ricevente (romeov2) un led che si illumina progressivamente….
Grazie per l’attenzione
Luigi
Autore
Ciao Luigi,
mi sembra di aver già risposto ad un commento simile, purtroppo non concosco/possiedo la romeo controller sia in ver 1 sia in ver 2
Ciao Mauro,
un problema riguardo al caricamento di entrambi i programmi sull’Arduino…continua a dirmi “errore di caricamento”, senza specificare di che tipo di errore si tratti.
Ho già verificato che la porta fosse quella giusta…cosa devo fare ??
Autore
Ciao Gianluca,
potrebbe dipendere da come hai impostato la comunicazione sulla scheda ? Se Tx/Rx sono commutati verso XBee l’IDE non può essere caricato su arduino.
In altri tutorial dedicati all’XBee trovi come configurare la comunicazione per questi adattatori.
Ciao Mauro,
ho comprato 2 xbee s2c con due shield per Arduino.
Come tipo di comunicazione ho scelto la 802.15.4…fino a quado invio e ricevo dati tramite XCTU va tutto bene ma una volta che collego gli xbee ad arduino ed uso il tuo programma questo non mando e non invia più dati.
Cosa può essere?
Grazie mille in anticipo
Davide
Autore
Ciao Davide,
hai certezza dei collegamenti dei pin Tx ed Rx ? Verifica che tu riesca a comunicare con i moduli e che essi rispondano correttamente ai comandi seriali che invii.
Trovi dei miei articoli in merito al test della sola comunicazione Arduino-XBee.
Buongiorno
Sto cercando di modificare il programma della parte TX , vorrei che i led si spegnessero quando si rilascia il pulsante corrispettivo .
Ma non sono per ora riuscito a trovare una soluzione , mi potrebbe dare un aiuto , sempre sia possibile.
Cordiali saluti
Chris
Autore
Ciao Christian,
la modifica che divi apportare è relativa alla lettera da inviare, alla pressione del pulsante invierai, ad esempio “A” ed al suo rilascio invierai “D” per il led 1.
Usa le lettere a seguire per gli altri led.