… riprendendo il progetto presentato Lunedì Robot Beginner Radio il trasmettitore xbee oggi costruisci il Robot Beginner Radio ricevitore
Il ricevitore del tuo robot usa arduino come controllore la motor shield arduino per gli spostamenti e un modulo xbee per ricevere i segnali del trasmettitore.
Cosa rende il progetto differente dalla comune automobile radiocontrollata?
Innanzitutto lo stai realizzando tu e quindi sei a conoscenza di tutti i meccanismi di funzionamento del Robot Beginner Radio ricevitore;
in secondo luogo potrai aggiungere funzioni specifiche per i tuoi progetti che su un prodotto acquistato non sempre è possibile
in ultimo, non per importanza, ho aggiunto al progetto un sensore di prossimità ad infrarossi che ti permette di decidere quando il Robot Beginner Radio ricevitore incontra un ostacolo come deve comportarsi.
Il materiale necessario per il Robot Beginner Radio ricevitore
Parti con la lista del materiale utilizzato per il Robot Beginner Radio ricevitore:
Parte elettronica
- n.1 arduino uno ( incluso nel Robot Beginner Kit )
- n.1 arduino motor shield
- n.1 adattatore xbee arduino
- n.1 modulo xbee
- n.1 sensore di prossimità sharp ( incluso nel Robot Beginner Kit )
- n.2 cavetti per breadboard F/M
Parte meccanica
Puoi decidere di utilizzare la base meccanica che preferisci per realizzare il tuo robot io ho utilizzato una di quelle a mia disposizione.
Il montaggio del ricevitore
Pe ril montaggio della parte meccanica ti rimando all’articolo di assemblaggio del Robot Beginner Kit.
Il montaggio della parte elettronica, sebbene la maggior parte del montaggio avviene con la formula a panettone è necessario che tu faccia attenzione in alcuni passaggi:
Step 1 – Monta i cavetti per breadboard
i due cavetti vanno collegati uno al +5v e l’altro al Gnd del connettore ICSP di Arduino
Step 2 – Inserisci la motor shield
il montaggio è a panettone con l’accortezza di piegare leggermente i primi 2 pin dal lato alimentazione in modo che non vadano a toccare i condensatori di arduino
Step 3 – collega i cavi dei motori
negli appositi morsetti connessi al canale A ed al canale B devi collegare i cavetti provenienti dai motori della base del Robot Beginner Radio ricevitore.
Step 4 – Collega l’alimentazione del sensore SHARP
il sensore sharp presenta 3 pin di cui due sono +5v e Gnd che puoi collegare sui rispettivi pin della motor shield come mostrato in figura
Step 5 – Proteggi i collegamenti di alimentazione
per evitare corto circuiti ti consiglio di applicare un pezzo di nastro isolante sui due pin appena collagti di alimentazione del sensore
Step 6 – Montaggio dell’adattatore XBee arduino
monta l’adattatore sul castello di shield appena costruito. In particolare l’adattatore xbee è di solito alimentato attraverso il connettore ICSP di arduino, quando la scheda è montata direttamente su arduino, in questa configurazione il connettore ICSP non ha i contatti riportati sulla motor shield per cui non potrebbe essere alimentata.
Step 7 – Collega i cavetti +5v e Gnd
l’ultimo passaggio è il collegamento dell’alimentazione per l’adattatore xbee che puoi eseguire con i cavetti connessi all’ICSP allo step 1 e del cavetto giallo del sensore al pin A5.
Lo sketch del Robot Beginner Radio ricevitore
/* * * Sketch di Ricezione xBee Robot Beginner * * @autor Mauro Alfieri * @url: https://www.mauroalfieri.it * twitter: @mauroalfieri * */ int D1 = 12; int D2 = 13; int P1 = 3; int P2 = 11; int SHIR = A5; int SENS = 150; int pwm1 = 0; int pwm2 = 0; void setup() { Serial.begin( 57600 ); pinMode(D1,OUTPUT); pinMode(D2,OUTPUT); pinMode(P1,OUTPUT); pinMode(P2,OUTPUT); pinMode( SHIR,INPUT ); digitalWrite( D1,LOW ); digitalWrite( D2,LOW ); analogWrite( P1,0 ); analogWrite( P2,0 ); } void loop() { int dist = analogRead( SHIR ); if (Serial.available() > 2) { int valX = Serial.read(); int valY = Serial.read(); if (0 <= valX && valX <= 120 ) { digitalWrite(D1,LOW); digitalWrite(D2,LOW); pwm1 = map(valX,120,0,0,100); analogWrite(P1,pwm1); analogWrite(P2,pwm1); } if (135 <= valX && valX <= 255) { digitalWrite(D1,HIGH); digitalWrite(D2,HIGH); if ( dist < SENS ) { pwm1 = map(valX,135,255,0,100); } else { pwm1 = 0; } analogWrite(P1,pwm1); analogWrite(P2,pwm1); } if (0 <= valY && valY <= 120) { digitalWrite(D1,LOW); digitalWrite(D2,HIGH); pwm2 = map(valY,120,0,0,70); analogWrite(P1,pwm2); analogWrite(P2,pwm2); } if (135 <= valY && valY <= 255 ) { digitalWrite(D1,HIGH); digitalWrite(D2,LOW); pwm2 = map(valY,135,255,0,70); analogWrite(P1,pwm2); analogWrite(P2,pwm2); } if ((121 <= valX && valX <= 134 ) && (121 <= valY && valY <= 134 )) { analogWrite(P1,0); analogWrite(P2,0); } delay(10); } }
lo sketch attende un comando di tipo seriale dal trasmettitore e controlla i motori per spostare il Robot Beginner Radio ricevitore nella direzione impartita dal telecomando.
Il sensore serve al robot per evitare gli ostacoli per cui farai in modo che in presenza di un ostacolo a distanza inferiore di quella definita alla linea 17 il robot non accetti comandi per procedere oltre nella direzione “avanti” ma solo i comandi per andare indietro o girare.
Le linee dello sketch sono:
linee 11-14: definisci i pin di controllo di direzione e potenza della motor shield;
linee 16-17: definisci il pin a cui hai collegato il cavo giallo del sensore, nel mio esempio A5;
linee 19-20: imposta a 0 la potenza iniziale dei motori;
linea 24: imposta la comunicazione seriale a 57600 baud, come hai fatto per il trasmettitore;
linee 26-31: definisci la modalità di utilizzo di ciascun pin definito nelle linee 11-16;
linee 33-37: imposta a LOW i pin di direzione dei motori e la rispettiva potenza a 0;
linea 42: leggi la distanza degli ostacoli dal sensore SHARP con il comando analogRead();
linea 44: testa la comunicazione seriale in modo che il buffer seriale contenga almeno due valori, il primo sarà il valore dell’asse X ed il secondo dell’asse Y
linee 46-47: imposta i valori per le variabili valX e valY rispettivamente ai valori letti nel buffer seriale;
linea 49: verifica il valore letto dalla variabile valX e se il suo valore è compreso tra 0 e 120 vuol dire che stai ricevendo dal trasmettitore il comando di procedere indietro
Notice
Ricorda che il joystick restituisce valori da 127 a 0 quando lo sposti in una direzione e da 128 a 255 quando lo sposti nella direzione opposta.
Pertanto nel primo caso i valori sono in decremento da 127 a 0 e devi trasformarli in valori da 0 a 255 per controllare il PWM, nel caso del robot lo trasformeremo in un range 0-100 o 0-70 per avere maggiore controllo del robot.
Siccome il punto centrale del joystick potrebbe non essere proprio 127 esatto terremo +/- 7 valori di tolleranza il nuovo range del joystick sarà 120-0 e 134-255
linee 50-51: siccome vuoi procedere indietro porterai entrambi i pin di direzione a LOW;
linea 53: rimappa i valori del range 120-0 sul range 0-100 con l’uso del comando map();
linee 55-56: imponi a entrambi i motori la potenza da erogare come calcolata alla linea precedente;
linee 58-66: sono simili alle linee precedenti se non per l’impostazione della direzione dei motori entrambi ad HIGH e per il controllo alle linee 62-63 in cui testi che la distanza misurata dal sensore sharp sia maggiore di quella impostata alla linea 17, in tal caso imposti la potenza da erogare ai motori a 0 per evitare che il Robot Beginner Radio ricevitore urti contro l’ostacolo rilevato;
linee 68-76: applica gli stessi concetti visti alle linee 49-57 all’asse Y del joystick, nota che la direzione dei motori è impostata in modo differente tra i due motori in modo da consentire al Robot Beginner Radio ricevitore di girare;
linee 77-85: sono identiche alle precedenti ( 68-76 ) a meno della direzione dei motori che viene invertita.
linea 87: è un ulteriore controllo che consente al Robot Beginner Radio ricevitore di rimanere fermo quando il joystick è al centro, testi infatti che i valori di valX e valY siano compresi tra 121 e 134;
linee 88-89: imposta i valori di potenza di entrambi i motori a 0;
linea 92: aggiungi un delay di 10 millisecondi in modo da consentire al driver di eseguire il comando impartito prima di ricevere il comando successivo.
Nel prossimo articolo ti mostrerò un video del Robot Beginner Radio ricevitore in funzione.
Buon divertimento !!!
24 commenti
Vai al modulo dei commenti
Ciao Mauro,
prima di tutto complimenti per il tuo sito e i tuoi progetti, sempre interessantissimi.
Ho letto con interesse il progetto “Robot Beginner Radio ricevitore xbee”, in quanto ho realizzato anch’io qualcosa di simile, ma pilotando il robot tramite tablet Android; sperando di fare cosa gradita, di seguito riporto il link del video su Youtube:
http://www.youtube.com/watch?v=ZHEI9A_65-8
Autore
WOW Salvatore il tuo progetto è davvero molto interessante.
Ti andreabbe di pubblicare un paio di articoli in cui descrivi come lo hai realizzato?
Io posso aiutarti sia a scrivere l’articolo sia offrirti le pagine del blog per condividere la tua esperienza.
A te resta solo da inviarmi qualche foto del robot montato e in fase di montaggio, l’elenco delle shield con cui lo hai realizzato e il software sia sketch arduino sia su android.
Ovviamente l’articolo sarebbe a nome tu anche se ti do una mano a scriverlo.
Se ti va di provare sono a disposizione.
Mauro
Ciao Mauro!
Volevo farti prima di tutto i complimenti per tutti i tuoi tutorial; poi, ho provato a fare questo progetto soltanto che invece di utilizzare la motorshield che hai usato anche tu, io sto usando la Motomama Motor Shield e sto riscontrando alcuni problemi nel far comunicare i due arduino; il primo arduino (TX) ha il suo xbee configurato e il joystick shield; il secondo arduino la Motomama motor shield con il suo xbee configurato.
Volevo sapere se mi potresti dare una mano… GRAZIE!
Autore
Ciao Gianluca,
la motomama non la conosco, ma al fine del progetto non dovrebbe influire eccessivamente il tipo di motor shield che stai utilizzando.
Se mi descrivi i problemi che riscontri provo ad aiutarti.
Mauro
Certamente…
Allora, il problema che ho riscontrato è stato dalla parte del ricevitore, cioè, lo sketch che ho caricato è molto simile al tuo (cambiano gli ingressi dei motori) e ogni volta che attacco l’alimentazione esterna (che serve per i motori) o il modulo xbee (serie 2), c’è una specie di impulso che alimenta i motori (Es. arduino, motor shield, modulo xbee e motorino collegati, appena collego la batteria il motorino comincia a muoversi e, una volta scollegata la batteria il motorino continua a muoversi (cosa molto strana visto che una volta scollegata la batteria il motorino si dovrebbe fermare per mancanza di alimentazione).
Poi, l’altro problema è che anche se metto l’istruzione Serial.print() per far scrivere “qualcosa” quando arriva il comando, sul monitor seriale non viene scritto niente…
Un’altra cosa, con l’istruzione Serial.write sul trasmettitore, quando leggo sul monitor seriale vengono scritte solo ‘ { ‘.
Scusa le ripetizioni e grazie per il disturbo.
Gianluca
Se ti può essere di aiuto per capire meglio, io ho due moduli xbee identici a questo:
http://www.ebay.it/itm/0688-Modulo-XBee-S2-Serie-2-2mW-2-4-GHz-ZigBee-PCB-Antenna-XB24-Z7PIT-004-/350877421740
P.S.
Non so se serve l’antenna ma, non riesco a farli comunicare tra di loro.
Autore
Ciao Gianluca,
non li connosco dovresti chiedere al venditore di darti le specifiche.
La configurazione non dovrebbe essere differente da quella descritta nei miei tutorial.
Mauro
Autore
Ciao Gianluca,
cerco di aiutarti per un problema alla volta perchè mi era sembrato di capire che fossi riuscito a far funzionare tutto e solo la motor shield differente ti creasse dei problemi, ma non è così.
Innanzitutto il movimento dei motori quando colleghi l’alimentazione potrebbe essere causato dall0inizializzazione di arduino o della motor shield che ricevendo alimentazione porta alti i pin di controllo dei motori. I motori che continuano a ruotare dopo la disconnessione dell’alimentazione può essere dovuto a diversi fattori che puoi discriminare con dei test:
1. se i motori girano per pochi secondi e quando il robot è sollevato da tempo può essere causa di qualche condensatore che trattiene energia;
2. se i motori girano per qualche minuto anche se il robot è a terra il problema sono gli alieni 🙂 scherzi a aprte questa ipotesi non dovrebbe verificarsi
L’istruzione Serial.println() ti riferisci al Tx o all’Rx?
Il monitor seriale su cui vorresti vedere “qualcosa” è connesso all’arduino-tx o all’arduino-rx?
Potrebbe trattarsi di un problema di comunicazione tra i due moduli, sei certo che stiano comunicando in modo corretto?
L’istruzione Serial.write sul trasmettitore invia i dati all’XBee e devi controllare su ricevitore cosa arriva.
Mauro
Grazie per la risposta;
allora quel “qualcosa” è riferito all’arduino-rx;
l’istruzione Serial.write sul trasmettitore che invia dati all’xbee credo che funzioni perchè sul serial monitor leggo i valori del joystick ma, sul ricevitore non leggo niente e non si muove niente.
Gianluca
Autore
Ciao Gianluca,
da come lo descrivi sembra che tu non abbia configurato i moduli XBee per comunicare tra loro.
Hai provato la semplice comunicazione seriale illustrata nei tutorial dedicati alla configurazione?
Mauro
Ciao,
Anche io avevo pensato che fosse la configurazione ma l’ho fatta e rifatta tante volte (ho seguito sempre la guida, a meno che non salto sempre qualcosa…). Potrebbe essere la motor shield che non fa comunicare i due moduli xbee? (Forse devo “attivare” il modulo connettendo qualche pin…boh!)
Gianluca
Autore
Ciao Gianluca,
prova i soli moduli con arduino senza la motor shield per risolvere i dubbi.
Mauro
Il problema è che da una parte ho la xbee shield (tx) mentre dall’altra la motor shield e su questa c’è lo spazio per collegare il modulo xbee… Quindi non so proprio come fare per risolvere questo problema..
Autore
Ciao Gianluca,
dovresti procurarti un altro adattatore XBee-Arduino o XBee-seriale per collegare l’altro modulo.
Mauro
io ho un adattatore XBee-Arduino e uno XBee-USB (quello che ho usato per configurare l’XBee..
Autore
Ciao Gianluca,
puoi usare quelli per il tuo test, come vedi nei mio tutorial di configurazione.
Mauro
Sono riuscito a far comunicare i due moduli xbee… FINALMENTE!!
Ora però, non riesco a comandare i due motori… Spero di riuscirci.
Grazie per la tua disponibilità! A presto!
Gianluca
Autore
Ciao Gianluca,
ottimo, il primo passo é fatto.
Per i motori modifica il mio sketch per la tua shield.
Mauro
Grazie dei tuoi consigli ma, con il tuo sketch ho visto che i motori o si muovono o restano fermi e visto che ho avuto questo problema, sono riuscito a trovare un altro sketch che dovrò, ovviamente, modificare, magari con parti del tuo programma.
Gianluca
Autore
Ciao Gianluca,
questo é lo spirito giusto: prendere il meglio dalla rete e modificarlo per il tuo progetto.
Se vorrai pubblicare il risultato con tanto di foto, video sketch e descrizione di come lo hai realizzato io sono a disposizione con il blog.
Invia alla casella info del blog tutto il materiale 🙂
Mauro
FINALMENTE CI SONO RIUSCITO!! 😀
Grazie per l’aiuto e per il disturbo!
Gianluca
Autore
Eccellente, sono contento del tuo risultato Gianluca.
Mauro
Scusa ma si è impallato il pc…
Allora quello che volevo sapere è se si poteva regolare la potenza dei motoriduttori, cioè quando sposto il joystick di poco avanti o indietro questi motoriduttori vanno piano rispetto alla loro max velocità
Gianluca
Autore
Ciao Gianluca,
certo, si può fare, io lo descrivo nello sketch del ricevitore come fare e nel mio robot funziona.
Mauro