Tutorial xBee Arduino

Gli esperimenti con l’xBee arduino continuano ed in questo articolo trovi come accendere e spegnere un led dal pc usando gli xBee. xbee arduino montato 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. xbee arduino moduli 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: xbee arduino 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à.

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 !!!

Prima di inserire un commento, per favore, leggi il regolamento

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

38 comments

Skip to comment form

    • Giordano Settimo on 18 Dic 2013 at 18:34
    • Reply

    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

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

        • Giordano Settimo on 18 Dic 2013 at 19:56
        • Reply

        Dove trovo queste informazioni ? :S

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

          • Giordano Settimo on 19 Dic 2013 at 15:57
          • Reply

          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

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

            • Giordano Settimo on 19 Dic 2013 at 17:37

            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??

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

            • Giordano Settimo on 19 Dic 2013 at 19:46

            mmm no intendevo gli ingressi analogici

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

    • Carlo on 5 Mag 2014 at 20:22
    • Reply

    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

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

    • Carlo on 6 Mag 2014 at 12:43
    • Reply

    Perdona la mia ignoranza Mauro ma cosa intendi per “provare dal sistema operativo”?

    1. Ciao Carlo,
      se non ricordo male sulla Galileo è installato un proprio sistema operativo, mi sembra un linux o simile.

        • Carlo on 6 Mag 2014 at 17:04
        • Reply

        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.

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

    • samuele on 8 Mag 2014 at 18:03
    • Reply

    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.

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

        • Carlo on 10 Mag 2014 at 18:11
        • Reply

        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.

        1. Ottima informazione Carlo,
          mi piacerebbe pubblicare queste scoperte in un articolo sulla Galileo.

            • samuele on 13 Mag 2014 at 15:43

            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.

          1. Ciao Samuele,
            bene è lo stesso che ho usato io all’inizio con Windows, oggi uso altri programmi per Mac.

    • Marco on 12 Mag 2014 at 13:26
    • Reply

    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

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

        • Marco on 13 Mag 2014 at 10:08
        • Reply

        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

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

            • Marco on 13 Mag 2014 at 10:47

            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

          1. Ciao Marco,
            ti invito a rileggere la mia risposta.
            Il ritardo è incalcolabile e variabile da lettura a lettura per cui inattendibile.

          • Fabrizio on 21 Mar 2015 at 20:53
          • Reply

          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 😉

          1. Ciao Fabrizio,
            la tua soluzione è interessante in generale, tuttavia non riesco a comprendere a quale problematica vada applicata.

    • Marco on 13 Mag 2014 at 11:09
    • Reply

    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

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

    • francesco on 15 Giu 2014 at 19:44
    • Reply

    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

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

        • francesco on 17 Giu 2014 at 10:46
        • Reply

        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

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

    • elvis on 19 Ott 2015 at 12:49
    • Reply

    Buon giorno Mauro.
    ho comprato due xbee ma non so come collegare i due dispositivi per accendere un led…mi potresti aiutare ?

    1. Ciao Elvis,
      hai già letto i miei articoli ?
      E’ tutto descritto passo-passo.

Lascia un commento

Your email address will not be published.

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