Robot Beginner Radio ricevitore xbee

… riprendendo il progetto presentato Lunedì Robot Beginner Radio il trasmettitore xbee oggi costruisci il Robot Beginner Radio ricevitore

Robot Beginner Radio ricevitore shield

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:

Robot Beginner Radio materiale

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

Robot Beginner Radio partenza step1

i due cavetti vanno collegati uno al +5v e l’altro al Gnd del connettore ICSP di Arduino

Step 2 – Inserisci la motor shield

Robot Beginner Radio motor shield step2

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

Robot Beginner Radio cavi motore step3

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

Robot Beginner Radio collegamento sensore step4

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

Robot Beginner Radio protezione sensore step5

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

Robot Beginner Radio Xbee module step6

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

Robot Beginner Radio Cavi superiori step7

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

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

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/robot-beginner-radio-ricevitore-xbee.html

24 comments

Skip to comment form

    • Salvatore on 2 dicembre 2013 at 19:49
    • Reply

    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

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

    • Gianluca on 9 gennaio 2014 at 20:59
    • Reply

    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!

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

        • Gianluca on 10 gennaio 2014 at 11:44
        • Reply

        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

          • Gianluca on 10 gennaio 2014 at 15:25
          • Reply

          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.

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

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

            • Gianluca on 10 gennaio 2014 at 16:32

            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

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

    • Gianluca on 10 gennaio 2014 at 17:47
    • Reply

    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

    1. Ciao Gianluca,
      prova i soli moduli con arduino senza la motor shield per risolvere i dubbi.
      Mauro

    • Gianluca on 10 gennaio 2014 at 18:14
    • Reply

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

    1. Ciao Gianluca,
      dovresti procurarti un altro adattatore XBee-Arduino o XBee-seriale per collegare l’altro modulo.

      Mauro

    • Gianluca on 10 gennaio 2014 at 18:32
    • Reply

    io ho un adattatore XBee-Arduino e uno XBee-USB (quello che ho usato per configurare l’XBee..

    1. Ciao Gianluca,
      puoi usare quelli per il tuo test, come vedi nei mio tutorial di configurazione.

      Mauro

    • Gianluca on 10 gennaio 2014 at 21:10
    • Reply

    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

    1. Ciao Gianluca,
      ottimo, il primo passo é fatto.
      Per i motori modifica il mio sketch per la tua shield.

      Mauro

    • Gianluca on 11 gennaio 2014 at 11:32
    • Reply

    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

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

    • Gianluca on 11 gennaio 2014 at 19:19
    • Reply

    FINALMENTE CI SONO RIUSCITO!! 😀

    Grazie per l’aiuto e per il disturbo!

    Gianluca

    1. Eccellente, sono contento del tuo risultato Gianluca.

      Mauro

    • Gianluca on 19 gennaio 2014 at 21:40
    • Reply

    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

    1. Ciao Gianluca,
      certo, si può fare, io lo descrivo nello sketch del ricevitore come fare e nel mio robot funziona.

      Mauro

Lascia un commento

Your email address will not be published.

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