L’Xbee servo è un progetto che puoi riprodurre facilmente se hai letto i miei ultimi esperimenti con gli XBee ed i segnali PWM.
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
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
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.
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 !!!
32 commenti
Vai al modulo dei commenti
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 ).
Autore
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
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
Autore
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
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
Autore
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
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
Autore
Ciao Frank,
invii e ricevi attraverso moduli Xbee connessi a due arduino o uno al Pc ed uno ad arduino?
Mauro
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.
Autore
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
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à.
Autore
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
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
Autore
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
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….?
Autore
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
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 ?
Autore
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
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
Autore
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
Grazie Mauro
Della tua pasienza , oggi provo poi faccio sapere , se dovcessi aggiungere del codice nei commenti vi è un modo , corretto ?
grazie mille
Autore
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
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.
Autore
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
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
Autore
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
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 🙂
Autore
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
Infatti mi sembrava, solo che ho sempre paura a saldare su un circuito già fatto quindi volevo una conferma.. grazie mille sei stato gentilissimo 😉
Autore
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
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
Autore
Ciao Luigi,
purtroppo non conosco la romeo controller versione 2 e non ne possiedo una per i test.