Oggi ti propongo un interessante esperimento che ho condotto in questi giorni con l’XBee PWM ossia la possibilità di inviare un segnale PWM da un arduino ad un’altro senza fili.
Come spesso avrai letto dai miei progetti molti sono elementari e il loro scopo, come in questo caso, è di testare una funzionalità prima di estenderla a progetti più complessi.
Questo esperimento ti permette di inviare un segnale PWM da un Arduino a cui hai collegato un potenziometro da 10K ad un’altro arduino a cui è collegato un led e di regolare l’accensione del led in modo proporzionale.
Prima di dedicarmi a questo progetto ti invito a leggere due tutorial introduttivi il cui scopo è chiarirti come configurare i due moduli XBee e come trasmettere un segnale tra i due arduino-arduino.
Il materiale per l’XBee pwm
La lista dei materiali necessari a riprodurre il progetto:
- n. 2 arduino uno ( o simile: mega, mini, leonardo, Yùn )
- n. 2 adattaori arduino xbee
- n. 2 xbee
- n. 1 led da 5mm
- n. 1 resistenza da 330ohm
- n. 1 potenziometro 10Kohm
- n. 2 pacchi batterie 5-12v
I collegamenti del progetto
Il potenziometro devi collegarlo al +5v e Gnd con i terminali esterni ed il polo centrale, ossia quello variabile, puoi collegarlo ad uno dei pin analogici da A0 ad A5, io l’ho collegato ad A0:
All’altro arduino devi collegare il led al pin Gnd ed al pin 9 ponendo la resistenza tra il pin 9 ed il pin positivo del led, ho scelto il pin 9 perché un pin di tipo PWM ed in grado di regolare da 0 a 255 il valore della tensione emessa:
I collegamenti sono semplici per permetterti di concentrarti sul principio di funzionamento.
Gli sketch del XBee PWM
Gli sketch sono due:
il primo si occupa del Tx il cui compito è leggere il valore del potenziometro ( 0-1023 ) convertirlo in un valore accettato dal pwm ( 0-255 ) e trasmetterlo via seriale al XBee pwm;
il secondo si occupa dell’Rx ossia di ricevere il dato dall’XBee pwm e inviarlo al pin 9 perché controlli l’accensione del led in modo proporzionale.
Important!
Prima di trasferire gli sketch sui due arduino ricordati di staccare l’adattatore xbee arduino altrimenti il collegamento seriale dell’Xbee pwm si sostituisce alla comunicazione seriale tra la USB ed Arduino e l’IDE non è in grado di rilenare l’arduino.
Sketch TX
/* * * Sketch di Trasmissione xBee potenziometro * * @autor Mauro Alfieri * @url: https://www.mauroalfieri.it * twitter: @mauroalfieri * */ int pinINPUT = A0; int pot = 0; void setup() { Serial.begin(57600); pinMode( pinINPUT,INPUT ); } void loop() { pot = map(analogRead( pinINPUT ),0,1023,0,255); Serial.write(pot); delay(100); }
ecco come funziona la trasmissione:
linea 11: definisci il pin a cui è collegato il ptenziometro, nel mio progetto A0;
linea 12: definisci il valore iniziale della variabile pot;
linea 15: imposta un canale di comunicazione seriale a 57000 baud;
linea 16: imposta la modalità del pin A0 a INPUT;
linea 20: il comando analogRead() legge dal pinINPUT il valore di posizione del potenziometro ed il comando map ne rimappa il valore da 0-1023 al range 0-255;
linea 21: il metodo write() della Serial invia il valore letto e convertito alla linea 20 attraverso il canale seriale, che al momento in cui avrai collegato l’XBee pwm sarà spedito attraverso il modulo XBee al ricevitore.
Sketch RX
/* * * Sketch di Ricezione xBee potenziometro * * @autor Mauro Alfieri * @url: https://www.mauroalfieri.it * twitter: @mauroalfieri * */ int val; int pinLed = 9; void setup() { Serial.begin(57600); Serial.println( "Serial Start" ); pinMode( pinLed,OUTPUT ); digitalWrite( pinLed,LOW ); } void loop() { if (Serial.available() > 0) { val = Serial.read(); Serial.print( " Val: " ); Serial.println( val ); analogWrite(pinLed,val); } }
ecco come funziona la parte di ricezione:
linea 11: definisci una variabile di tipo integer ed impostala a 0, in questa variabile memorizzerai il valore ricevuto attraverso la comunicazione seriale;
linea 12: imposta la variabile a cui è collegato il led, il pin 9;
linea 15: apri un canale di comunicazione seriale a 57000 baud, considera che per consentire la comunicazione tra i moduli è necessario che antrambi comunichino alla medesima velocità;
linee 18-19: definisci la modalità OUTPUT per il pin 9 e imposta LOW il suo valore iniziale;
linea 24: la condizione riportata in questa linea verifica che ci sia una comunicazione seriale e fa in modo che le linee successive siano eseguite solo in presenza di un input seriale valido;
linea 26: leggi il valore presente nel registro Serial ed assegnalo alla variabile val;
linee 27-28: scrivi sul monitor seriale, utile per il debug, il valore ricevuto;
linea 30: imposta il valore del pin 9 a val ossia il valore ricevuto.
Il video
Il video dell’XBee pwm ti mostra come ho eseguito i collegamenti e la prima accensione del progetto oltre al suo funzionamento.
avrai notato che dopo l’accensione è necessario attendere qualche secondo perché i moduli si riconoscano, in quella fase nessuna comunicazione Xbee pwm può essere trasferita per cui se muovessi il potenziometro in quella fase non otterresti alcun risultato sul led.
18 commenti
1 ping
Vai al modulo dei commenti
Ciao Mauro
Sto impazzendo con xbee , volevo in effetti fare un applicazione simile alla tua poi aggiungendo il controllo di un led rgb , ma uno dei due moduli xbee non si lasci aprogrammare , xb24-zb , hai un consiglio uso xctu , inoltre vorrei sapere se configuradone uno come coordinator e uno come end point sono a posto o server altro
grzie mille
Autore
Ciao Frank,
puoi provare a configurarli utilizzando i comandi AT che trovi nel manuale del produttore dei moduli.
Se hai soli due XBee da configurare puoi impostarli entrambi come endPoint oppure uno come coordinator e l’altro come endPoint.
Mauro
Finalmente un articolo chiaro e conciso su come funziona il modulo XBee. Ottima base da cui partire per progetti più complessi.
GRAZIE!
Autore
Grazie Giovanni,
sto realizzando un robot radiocomandato con XBee poi affronterò anche il tema “Domotica con XBee”.
Tanti progetti all’orizzonte.
Continua a leggere il blog se sei interessato alle possibilità dell’XBee
Mauro
Buonasera Mauro, mi sto avvicinando al mondo di Arduino e trovo molto utili e chiari i Suoi articoli ed esempi, vorrei realizzare un telecomando per modellismo navale con due moduli Xbee pro; ho eseguito il tutorial Xbee pwm, i due moduli comunicano ma il valore Val non varia in modo continuo da 0 a 255 ma “salta” da 0 a 240 in modo casuale, ho provato a cambiare potenziometro ma il problema rimane.
Autore
Ciao Dario,
il valore “salta” se lo leggi sull’arduino trasmittente o quello ricevente?
Mauro
Buongiorno Mauro, il valore lo leggo sull’arduino ricevente
ho provato a fare la stessa cosa ma tra un Lilypad trasmittente e un Arduino UNO ricevente, e nel monitor seriale mi dà solo valori da 128 a 254… Non riesco proprio a capire cosa ho sbagliato!
Autore
Ciao Gabriele, se ricevi dei dati la comunicazione funziona. Penso che il tuo problema riguardi la parte di acquisizione del dato. Verifica sulla serale della lilypad cosa accade.
Mauro
Problema risolto, dovevo cambiare il baud rate a 9600 perchè ho utilizzato i moduli Xbee preconfigurati a quella velocità di trasmissione… Grazie comunque! 🙂
Autore
Ottimo. Gabriele, non avevo pensato a questa eventualità.
ciao mauro
volevo chiederti utilizzando 2 potenziometri come faccio a trasmettere il segnale in modo che la scheda che lo riceve capisca che potenziometro ha inviato il segnale e comunichi col sevo giusto?
Autore
Ciao Giorgio,
trovi uno o più articoli in cui ho descritto come fare, esistono varie tecniche, io preferisco inviare i comandi in una stringa concatenata e leggerli dal ricevitore.
Ciao Mauro,ho letto svariate tue guide e mi sono piaciute tutte molto.
Sono nuovo del mondo della programmazione e mi chiedevo se potessi chiarirmi il significato di stringa concatenata.
Gazie.
Autore
Ciao Guglielmo,
ho scritto dei tutorial su come si concatenano le Stringhe, come concetto è molto semplice, se hai due stringhe:
“Ciao” e “Guglielmo” e le concateni ottieni “CiaoGuglielmo” e lo concateni frapponendo un ” ” ottieni “Ciao Guglielmo”
Grazie mille!
Buongiorno
E’ possibile trasferire il segnale pwm tra due Arduino usando i moduli a basso costo a 433 MHz?
Grazie
Autore
Ciao Federico,
userei lo stesso metodo che ho utilizzato in questo esempio, cambiando solo il mezzo di trasmissione.
[…] « XBee PWM con arduino […]