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: http://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: http://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.

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/xbee-pwm-arduino.html

18 comments

1 ping

Skip to comment form

    • frank on 27 ottobre 2013 at 14:51
    • Reply

    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 on 30 gennaio 2014 at 20:06
    • Reply

    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 on 31 gennaio 2014 at 09:47
        • Reply

        Buongiorno Mauro, il valore lo leggo sull’arduino ricevente

    • Gabriele on 15 marzo 2014 at 21:05
    • Reply

    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 on 27 marzo 2014 at 15:52
        • Reply

        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 on 14 agosto 2014 at 22:34
    • Reply

    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 on 9 marzo 2016 at 15:58
    • Reply

    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 on 9 marzo 2016 at 18:24
    • Reply

    Grazie mille!

    • Federico on 30 ottobre 2016 at 22:51
    • Reply

    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

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.