XBee PWM con arduino

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.

XBee PWM

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:

XBee PWM Analog zero

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:

XBee PWM collegamneto led

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.

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.

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/xbee-pwm-arduino.html

18 commenti

1 ping

Vai al modulo dei commenti

    • frank il 27 Ottobre 2013 alle 14:51
    • Rispondi

    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

    1. 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

  1. Finalmente un articolo chiaro e conciso su come funziona il modulo XBee. Ottima base da cui partire per progetti più complessi.
    GRAZIE!

    1. 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

    • Dario il 30 Gennaio 2014 alle 20:06
    • Rispondi

    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.

    1. Ciao Dario,
      il valore “salta” se lo leggi sull’arduino trasmittente o quello ricevente?

      Mauro

        • Dario il 31 Gennaio 2014 alle 09:47
        • Rispondi

        Buongiorno Mauro, il valore lo leggo sull’arduino ricevente

    • Gabriele il 15 Marzo 2014 alle 21:05
    • Rispondi

    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!

    1. 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

        • Gabriele il 27 Marzo 2014 alle 15:52
        • Rispondi

        Problema risolto, dovevo cambiare il baud rate a 9600 perchè ho utilizzato i moduli Xbee preconfigurati a quella velocità di trasmissione… Grazie comunque! 🙂

        1. Ottimo. Gabriele, non avevo pensato a questa eventualità.

    • Giorgio il 14 Agosto 2014 alle 22:34
    • Rispondi

    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?

    1. 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.

    • Guglielmo il 9 Marzo 2016 alle 15:58
    • Rispondi

    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.

    1. 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”

    • Guglielmo il 9 Marzo 2016 alle 18:24
    • Rispondi

    Grazie mille!

    • Federico il 30 Ottobre 2016 alle 22:51
    • Rispondi

    Buongiorno
    E’ possibile trasferire il segnale pwm tra due Arduino usando i moduli a basso costo a 433 MHz?
    Grazie

    1. Ciao Federico,
      userei lo stesso metodo che ho utilizzato in questo esempio, cambiando solo il mezzo di trasmissione.

  1. […] « XBee PWM con arduino […]

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.