Xbee Servo – controlla un servo remoto

L’Xbee servo è un progetto che puoi riprodurre facilmente se hai letto i miei ultimi esperimenti con gli XBee ed i segnali PWM.

Xbee Servo

Sicuramente accendere uno o più led in dissolvenza da remoto è utile se stai realizzando la tua centralina domotica di controllo luci, tuttavia i miei esperimenti sono anche orientati alla robotica ed un robot fa uso dei servo per attuare i movimenti.

Ecco ora sai in che direzione sono orientati questi test 🙂

Il progetto Xbee servo

Il progetto XBee servo sfrutta la comunicazione di moduli xbee per trasferire un segnale analogico 0-1023 prelevato da un potenziometro, per controllare un servo comando in gradi 0-179.

Il progetto è composto da due parti, come i precedenti, un trasmettitore composto da:

  • n.1 arduino uno o simile
  • n.1 adattatore xbee arduino
  • n.1 modulo xbee
  • n.1 potenziometro da 10k
  • n.1 pacco batterie da 5v o superiore

Xbee Servo trasmettitore

ed un ricevitore composto da:

  • n.1 arduino uno o simile
  • n.1 adattatore xbee arduino
  • n.1 modulo xbee
  • n.1 servomotore
  • n.1 pacco batterie da 5v

Xbee Servo ricevitore

Gli sketch del progetto

Essendo due le schede arduino coinvolte saranno due anche gli sketch, uno per il Tx ( trasmettitore ) ed uno per l’Rx ( ricevitore )

Sketch del trasmettitore xbee servo

/*
 *
 *  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);
}

avrai notato che lo sketch è identico a quello presentato per il controllo del led, in quanto non è necessario eseguire modifiche a questa parte del progetto.

Sketch del ricevitore xbee servo

Lo sketch che si occupa della ricezione del segnale dall’xbee servo e controlla il servocomando è concettualmente identico a quello presentato nell’articolo precedente anche se la sintassi è differente per consentire il controllo del servo:

/*
 *
 *  Sketch di Ricezione xBee potenziometro
 *
 * @autor Mauro Alfieri
 * @url: https://www.mauroalfieri.it
 * twitter: @mauroalfieri
 *
 */
#include <Servo.h>

int val = 0;
int grado = 90;
int pinServo = 9;
 
Servo myservo;

void setup()  {
  Serial.begin(57600);
  Serial.println( "Serial Start" );
 
  myservo.attach( pinServo );
  myservo.write( grado );
}
 
void loop()  {
  if (Serial.available() > 0) {
    
    val = Serial.read();
    Serial.print( "Val: " );
    Serial.print( val );
    grado = map(val, 0, 255, 0, 179);
    Serial.print( " Grado: " );
    Serial.println( grado );
        
    myservo.write(grado);
  }
}

ecco le differenze principali:

linea 10: includi la classe Servo.h inclusa nell’IDE arduino;

linea 13: ho aggiungi una variabile grado di tipo integer in cui memorizzerai il valore angolare da inviare al servo;

linea 16: definisci un’istanza dell’oggetto Servo che chiami myservo;

linee 22-23: utilizza il metodo attach dell’istanza Servo per impostare il pin a cui il servo è collegato e imposta il servo al grado 90°;

linea 29: leggi il valore (0-255) inviato via seriale dall’xbee servo Tx;

linea 32: assegna il grado mappando il valore 0-255 sul valore in gradi 0-179, per farlo utilizza la funzione map() più volte usata e descritta nei miei sketch con i servomotori;

linea 36: usa il metodo write() dell’istanta myservo per impartire al servo il valore in gradi a cui posizionarsi.

Xbee Servomotore

Il video

Ecco un brevissimo video che mostra come funziona il progetto e in cui evidenzio che i due componenti Tx ed Rx non hanno alcuna connessione tra loro:

Buona sperimentazione !!!

  • 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-servo.html

32 commenti

Vai al modulo dei commenti

    • frank il 29 Ottobre 2013 alle 20:37
    • Rispondi

    Ciao prendendo spunto dal tuo esempio , sto provando a pilotare un servo remoro con due arduino e 2 xbee , non riesco a fare comunicare i due xbee , come vanno settati soo 2 xb24-zb , uno lo setto coordinator at , l’altro vorrei settarlo end point at ma appena vado oltre i 9600 bps mi si incasina e non riesco più a programmarlo , se invece lo setto come router funziona ?

    ho modificato la tua idea usando dei pulsanti che leggo come + e – e limitando il campo 0-180

    la trasmissione va fatta con serial.write o print.

    è possibile trasmettere una struttura di dati per esempio 4 valori e in ricezione riscomporli in 4 variabili.

    grazie mille , tutto il materiale sul tuo sito è offimo ( sono io che mi incasino ).

    1. Ciao Frank,
      su come impostare i moduli ho scritto un articolo, lo hai già letto?

      La trasmissione puoi farla sia con Serial.print() sia con Serial.write() dipende da cosa vuoi trasferire, negli articoli sulla comunicazione seriale e gli Xbee descrivo le differenze.

      Si, puoi inviare una serie di valori e ricomporli sul ricevitore.

      Mauro

        • Frank il 30 Ottobre 2013 alle 08:44
        • Rispondi

        Ciao Mauro

        Si ho già letto il tuo tutorial sulla progrramma zione xbee , lo rileggerò m ancora no sono riuscito a cavare un ragno dal buco , configurando gl ixbee per il coordinator lo configuro direttamente a 57600 con xctu , per l’end point invece se provo a configuralo oltre i 9600 con xctu mi da vari errori e non si programma , una volta configurato anche a 9600 , la velocitù settara da sketch Serial.begin(57600); ha la priorità ?

        grazie mille

        1. Ciao Frank,
          mi sembra strano che non riesci a modificare il baud rate di comunicazione, potrebbe trattarsi di un limite del modulo in tuo possesso, se i moduli sono identici potrebbe essere dovuto ad un difetto del componente.
          Puoi far funzionare tutto a 9600 baud invece dei 57600, devi sostituire negli sketch il valore di comunicazione che hai impostato sui moduli e tutti i moduli devono essere impostati sul medesimo baud rate.

          Mauro

            • frank il 31 Ottobre 2013 alle 18:32

            Ciao Mauro

            Sono finalmente riuscito (sembra) a fare parlare i due xbee se però provo nel ricevente a testare i packetti nel range test di XCTU , ho solo paccheti BAD e dei timeout di ricezione , non so a cosa è dovuto , sono poi riuscito a capire ilproblema del baur rate , nei moduli S2 se provo a configurare un end point device AT oltre i 9600 si incavola , ora ho configurato un coordinatre AT e un router AT .
            Inoltre ho notato che nel trasmettirore spesso arduino si resetta non so cosa possa essere.
            Riesci a darmi degli indizzi

            grazie mille

          1. Ciao Frank,
            complimenti !!!
            Non uso XCTU in quanto lavoro con Mac e Linux, quindi su questo fronte posso esserti poco utile.
            Il baudrate dei moduli Xbee di tipo S2 probabilmente hanno dei limiti di trasmissione quando fungono da endpoint, hai consultato la documentazione del produttore, dovrebbe riportare un limite come questo.

            Per l’ultimo quesito posso aiutarti, è capitato anche a me, è una questione di buffer; io ho risolto mettendo un delay(10) prima della chiusura del loop(), se non è sufficiente incrementa questo valore, del resto non so cosa tu voglia trasferire come informazione ma probabilmente non dovrai inviare un segnale ogni millisecondo.

            Mauro

    • frank il 1 Novembre 2013 alle 13:08
    • Rispondi

    Ciao Mauro

    Sonoo riuscito a vedere dei dati sulla seriale , a parte che trasmetto un valore per il servo es. 90 e in ricezione mi trovo .90 non so perchè.

    hai qualche idea , inoltre xctu mi dice sempre se provo ad andare in ricezione nel range test pacchetti BAD , non ne ho ancora visto uno GOOD.

    grazie mille

    1. Ciao Frank,
      invii e ricevi attraverso moduli Xbee connessi a due arduino o uno al Pc ed uno ad arduino?

      Mauro

    • Salvatore il 1 Novembre 2013 alle 14:50
    • Rispondi

    Ciao Mauro,

    è possibile ricevere comunicazioni da più modulo xbee? Per esempio un circuito con sopra un sensore di temperatura e un circuito con un sensore di luce che mandano le loro informazioni a una scheda arduino?

    Se si come fa la scheda a sua volta mandare un segnale alle varie schede? Ogni modulo xbee ha un suo nome?

    Salvatore.

    1. Ciao Salvatore,
      quella che hai descritto è una delle caratteristiche principali del protocollo XBee, nato per consentire la realizzazione di reti Mesh ossia un modulo fa da coordinatore per più router ed endpoint.
      Prova a leggere il mio primo articolo sugli XBee e sulla loro configurazione o la documentazione ufficiale della Digi, che produce i moduli xbee che uso nei miei tutorial.

      Mauro

    • Salvatore il 1 Novembre 2013 alle 18:33
    • Rispondi

    Ciao Mauro,
    letto ed ho capito come configurare i modulo, che tra poco acquisterò. Mi rimangono dei dubbi come fare comunicare un modulo router o end device, con il coordinator, se montati su una basetta. Cioè il modul.o router/end device non è montato su arduino.

    Mi rimane anche il dubbio sui valori che dovrebbero assumete i campi “MY ID” e “DL ID” nel caso di un modulo coordinator e 2/3/4 moduli router.

    Sarebbe belo un tuo tutorial su dove spieghi tutto questo.

    Ti ringrazio per la tua disponibilità.

    1. Ciao Salvatore,
      trovi la risposta a questi quesiti nella documentazione ufficiale del produttore dei moduli o sui siti dedicati alla comunicazione XBee per questo ho scritto un articolo specifico, la documentazione é dettagliata a riguardo.

      Mauro

    • frank il 4 Novembre 2013 alle 20:19
    • Rispondi

    Ciao Mauro
    per i test trasmetto da un xbee collegato ad arduino , verifico con XCTU , nel tab terminal cosa mi arriva sul ricevitore , e come detto mi si aggiunge sempre un . alla fine della trasmissione , montando il ricevitore su arduino infatti il servo non si muove ho copiato ache i tue schetch di esempio ( modificati poichè piloto il servo con due pulsanti ) ma niente da fare , a questo punto non so se è un problema di schetch o di programmazione xbee

    grazie mille

    1. Ciao Frank,
      prova a collegare il ricevitore su arduino e scrivere lo sketch in modo che ciò che ricevi sia scritto nel monitor seriale.
      In pratica ricevi il dato dall’xbee e lo scrivi sul Serial.println().

      Collega l’arduino via usb al computer, apri il monitor seriale e controlla cosa scrive.
      Il “.” potrebbe essere aggiunto da XCTU e non nella trasmissione.

      Mauro

    • luca il 5 Novembre 2013 alle 22:44
    • Rispondi

    Ciao Mauro. Complimenti per i tutorial..

    Mi è sorto un problema dopo aver testato il Tutorial sugli xbee.

    Ma se io devo controllare più di un servo…come fa la scheda di Arduino Ricevente i comandi seriali ad associare al servo 1, e al servo 2,…..le rispettive letture dato che sulla seriale escono a raffica dei numeri senza alcun riferimento a cosa….?

    1. Ciao Luca,
      dovrai scrivere tu del codice in grado di istruire l’arduino ricevente a riconoscere se il valore é per il servo connesso a se stesso o all’altro arduino.

      Un meccanismo che potresti fare con più byte invece di un solo byte.

      Mauro

    • frank il 6 Novembre 2013 alle 21:59
    • Rispondi

    Ciao Mauro
    La prova che tu suggerisci l’ho gia fatta ma niente , il servo sul secondo arduino con xbee router non mi si muove ,
    inoltre non so se possa contare XCTU mi da tutti i pacchetti BAD , il tool che usi per MAC esiste anche in versione windows ?

    1. Ciao frank,
      il test che ti ho chiesto non serviva a verificare se il servo si muovesse o meno ma a controllare la trasmissione tra i due moduli.
      Dall’output sul tuo monitor seriale avresti potuto capire se quello che invii arrivi correttamente al ricevitore e se il “.” fosse visibile anche in questo modo.

      Il tool che io uso è il monitor seriale dell’IDE Arduino per questo ti ho consigliato la procedura da eseguire per verificare che la comunicazione funzionasse in modo corretto.

      Mauro

    • frank il 7 Novembre 2013 alle 18:52
    • Rispondi

    Ciao Mauro

    Infatti , ho fatto come dicevi tu , la stringa che mi arriva è numerica corretta il mio dubbio a questo punto e che mi arriva un solo range di valori .

    Ma io teoricamente trasmetto valori da 1 a 179 …..

    52 51 53 51 54 51 55 51 56 51 57 52 48 52 49

    A questo punto mi viene il dubbio sui valori delle resistenze che uso 10K vado poi su due ingressi digitali pin 2 e 4 e con questo codice mi sembra dovrebbe funzionare

    if ( digitalRead(next) == 1) {grado = grado++;}
    if ( digitalRead(prev) == 1 ) {grado = grado–;}
    if ( grado > maxGrad ) {grado = maxGrad;}
    if ( grado < minGrad ) {grado = minGrad;}

    if (grado != oldgrado) {
    Serial.print( grado );
    oldgrado = grado;
    delay(20);
    }

    hai idee..

    mi scuso per il codice nel commento

    1. Ciao Frank,
      so che ti sei scusato per il codice, ma come ho scritto non è comprensibile il codice nei commenti per cui faccio davvero fatica a capire cosa fai.

      Dalla tua descrizione sembra che il valore inviato non vari mai, quindi l’errore non é nella ricezione del “.” come credevi, ma nella trasmissione.

      Perché usi Serial.print() e non Serial.write() come ho fatto scritto io nei miei tutorial?
      Se li leggi con maggiore attenzione scoprirai la differenza fondamentale tra i due metodi e il motivo del malfunzionamento.

      Mauro

    • frank il 10 Novembre 2013 alle 10:14
    • Rispondi

    Grazie Mauro
    Della tua pasienza , oggi provo poi faccio sapere , se dovcessi aggiungere del codice nei commenti vi è un modo , corretto ?

    grazie mille

    1. Ciao Frank,
      non non è possibile per 2 motivi:
      1. arriva completamente illeggibile a me;
      2. non ho il tempo di sistemarlo e provarlo, siete migliaia ogni giorno a scrivermi puoi capire che non posso provare tutti i codici che scrivete.

      Se mi esprimi un dubbio io provo a risponderti.
      L’alternativa è partecipare ad un mio corso.

      Mauro

  1. ciao bene, prima di tutto grazie per il vostro prodotto che è molto di aiuto il testo, lo sai che sono stato in grado aruinos comunicano tramite l’XBee, sto usando due s1 XBee e due mega aurdiono 2560, a quanto pare ho configurato male il XBee, lei il tuo post precedente e ho fatto in base a questo c’è, io sono utlizando la configurazione di base che si sostituisce il cavo seriale. sarà per questo che non funziona? porvaor Chiedo aiuto su questo dato che sono abbastanza indietro con il mio progetto e questo mi ha molto da terminat aiuta.

    la ringrazio molto amico.

    1. Ciao Victor,
      probabilmente hai utilizzato un traduttore automatico per il tuo commento in quanto non ho compreso cosa stai realizzando e cosa non funziona.

      Mauro

  2. Ciao Mauro
    Mi sto complicando la vita con 2 servo 1 led RGB e xbee , premetto che con un servo sono riuscito grazie a te a fare funzionare il tutto , ora vorrei pilotare 2 servo ed un leg rgb per cui mi servirebbe trasmettere una matrice di dati , penso di aver capito che posso usare Serial.write(data,5) dove data è la mia matrice e 5 la lunghezza dellarray logicamente data in byte ( oopure posso anche int ? ) , come faccio a ricomporla in ricezione ?
    Serial.read() mi legge il buffer di ricezione ma come faccio a ricostruire il mio array ?

    grazie mille

    1. Ciao Frank,
      leggi i miei articoli sul robot beginner controllato via XBee, in quel caso io invio due valori dal Tx e li recupero dal buffer seriale sull’Rx.

      Mauro

    • Alex il 9 Febbraio 2014 alle 18:57
    • Rispondi

    Ciao,
    volevo farti una domanda banale, al limite dello stupido. Come hai fatto ad attaccarti ai pin da 5v e gnd che stanno sull’xbee shield? Dall’immagine non riesco a capirlo.
    Grazie mille in anticipo e grazie anche per l’ottimo esempio 🙂

    1. Ciao Alex,
      la domanda è giusta e dalla foto non si vede affatto, ho saldato due header femmina in corrispondenza dei contatti +5v e Gnd direttamente sulla xbee shield.

      Mauro

        • Alex il 10 Febbraio 2014 alle 21:30
        • Rispondi

        Infatti mi sembrava, solo che ho sempre paura a saldare su un circuito già fatto quindi volevo una conferma.. grazie mille sei stato gentilissimo 😉

        1. Paura che condivido Alex, ma in fondo é anche quel brivido che rende le cose più interessanti e nel peggiore dei casi, mi dico, ho rovinato una shield da poche decine di euro … posso sacrificarli per la soddisfazione di realizzare il mio progetto e dire: c’è l’ho fatta.

          Mauro

    • luigi il 22 Novembre 2015 alle 04:58
    • Rispondi

    Ciao Mauro,
    come cambierebbero gli sketch del ricevitore e del trasmettitore se quest’ultimo fosse un romeo controller versione2? quale porta seriale occorre usare? mi sembra di aver capito che xbee sul romeo all in one v2 riceve i dati sulla seriale1…..
    Ciao e complimenti

    1. Ciao Luigi,
      purtroppo non conosco la romeo controller versione 2 e non ne possiedo una per i test.

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.