Rover5 leonardo: montaggio passo passo e collaudo

Riprendo l’articolo comparso venerdì sul Rover5 per mostrarti le fasi di montaggio passo dopo passo con un video e il collaudo del Rover5 leonardo sia su un terreno accidentato sia in casa, sull’infimo pavimento.

rover5 leonardo

Ho voluto dare un nome al robot e siccome ha la base del Rover5 e usa la scheda Arduino Leonardo come microcontrollore ho deciso di chiamarlo Rover5 leonardo.

Avrai notato che tutte le schede puoi posizionarle nella parte posteriore del Rover5 leonardo per lasciare spazio a shield aggiuntive o sensori che nei prossimi progetti vedrai pian piano comporre il rover pilotabile da iPhone/iPad e Android.

rover5 leonardo

La lista della spesa per il Rover5 leonardo

parto subito con l’elenco del materiale che ti occorre:

  • n.1 arduino leonardo
  • n.1 motor shield fe
  • n.1 breadboard anche piccola o in alternativa una proto shield
  • n.1 rover5
  • n.1 base plastica simile al piano del robot beginner kit
  • n.1 o 2 sensori sharp GP2D120X con i relativi cavetti
  • n.4 cavi per breadboard neri
  • n.4 cavi per breadboard rossi

La scelta dell’Arduino Leonardo è derivata sia dal suo costo inferiore rispetto alla versione uno R3 sia al tipo di microcontrollore Atmega 32U4 che garantisce miglio risposta ai segnali di input provenienti da schede esterne, in questo progetto è indifferente l’uso di un arduino uno o di una leonardo, ma le evoluzioni che ho in mente di proporti necessitando di una scheda con caratteristiche proprie della leonardo.

Collegamenti del Rover5 leonardo

le connessioni che devi effettuare sono molto semplici, in quanto la motor shield fe fa gran parte del lavoro a te restano solo i collegamenti:

  • dell’alimentazione dei sensori +5v e Gnd di arduino verso la breadboard
  • i pin di segnale dei sensori A4 e A5
  • l’alimentazione della motor shield fe prelevata dal Vin e Gnd di Arduino
  • il collegamento dei motori, destro e sinistro

Per aiutarti ho realizzato un video del montaggio del Rover5 leonardo:

Lo shetch del Rover5 leonardo

Visto frontalmente presenta il sensore sharp GP2D120X che utilizzerai con la libreria DistanceGP2Y0A21YK.h per determinare la distanza tra rover ed ostacolo:

rover5 frontale

Ecco il primo sketch che ho realizzato:

#include <DistanceGP2Y0A21YK.h>

#define PWMA 6
#define PWMB 9
#define DIRA 7
#define DIRB 8
#define SHIR A5

#define motoreA 0
#define motoreB 0
#define AVANTI  0
#define INDIETRO  0
#define DISTANZA 8

DistanceGP2Y0A21YK Dist;
int distance = 0;

void setup()
{
  pinMode( PWMA,OUTPUT );
  pinMode( PWMB,OUTPUT );
  pinMode( DIRA,OUTPUT );
  pinMode( DIRB,OUTPUT );

  pinMode( SHIR,INPUT );

  Dist.begin( SHIR );
  Serial.begin( 9600 );
}

void loop()
{
  distance = Dist.getDistanceCentimeter();
  Serial.println( distance );
  if ( distance > DISTANZA ) { avanti(); }
  else                       { gira(); }
}

void avanti()
{
    digitalWrite( DIRA,HIGH );
    digitalWrite( DIRB,LOW );

    analogWrite( PWMA,100 );
    analogWrite( PWMB,100 );
}

void indietro()
{
    digitalWrite( DIRA,LOW );
    digitalWrite( DIRB,HIGH );

    analogWrite( PWMA,100 );
    analogWrite( PWMB,100 );
}

void alt()
{
    analogWrite( PWMA,0 );
    analogWrite( PWMB,0 );
}

void gira()
{
  // STOP x 1/2 sec
  alt();
  delay( 500 );

  // INDIETRO x 1 secondo e 1/2
  indietro();
  delay( 1500 );

  // STOP x 1/2 sec
  alt();
  delay( 500 );

  // Gira
  digitalWrite( DIRA,HIGH );
  digitalWrite( DIRB,HIGH );

  analogWrite( PWMA,100 );
  analogWrite( PWMB,100 );

  delay( 800 );
}

è molto simile ad altri sketch che trovi nel blog relativi ai motori in corrente continua ed ai robot come il Robot Beginner Kit o il Robot Sfera, la particolarità di questo Rover5 è la sua capacità di sorpassare oggetti come puoi vedere nel video riportato sotto.

La linea 01: includi la libreria di decodifica del sensore, in questa versione del rover5 leonardo usi solo il sensore anteriore, vedrai come usare entrambi i sensori nelle sue prossime evoluzioni;

linee 03-07: definisci i pin a cui sono connessi i PWM e DIR dei due motori ( 4 nella versione 4WD ) ed il sensore ( A5 );

linea 13: imposta la distanza in cm ( 0-15 ) dall’oggetto rilevato, a cui il rover5 leonardo dovrà fermarsi e iniziare la manovra di rotazione;

Il cuore dello sketch è costituito dalle linee 31-37 ossia la funzione loop() al cui interno viene definito il moto del rover5 leonardo dopo la lettura del valore proveniente dal sensore, linea 33, valuta se la distanza tra robot e oggetto è maggiore di quella impostata alla linea 13 procede avanti, quando incontra un oggetto e la distanza scende sotto i cm impostati alla linea 13 compie la manovra di rotazione che hai definito con la funzione gira().

La funzione gira() è composta da una sequenza di azioni, manovre, che farai compiere al tuo rover5 leonardo:

  1. fermati – funzione alt();
  2. attendi 1/2 secondo – linea 67;
  3. indietreggia – linea 70 – per un tempo di 1 secondo e 1/2 sufficente – linea 71 -a far allontanare il rover5 dall’oggetto;
  4. fermati – linea 74;
  5. attendi 1/2 secondo – linea 75;
  6. imposta la direzione ei motori identica, essendo i motori montati in modo speculare la stessa rotazione procura un movimento rotatorio;
  7. imposta a 100 il valore del PWM per i canali A e B del rover;
  8. attendi un tempo di 800 millisecondi, tempo necessario a compiere la rotazione.

a questo punto il controllo ritorna alla funzione loop() che valuta se il rover5 leonardo si è allontanato sufficentemente dall’oggetto o necessita di un’ulteriore manovra.

Il video demo del rover5 leonardo

Nel video ho provato il rover5 leonardo sia all’esterno della mia abitazione sia in casa, con oggetti in giro e pavimento scivoloso, guarda cosa è successo:

Realizza anche tu il tuo rover5 leonardo e mandami i video o commenta questo articolo per sapere dove comprare i componenti o come aggiungere nuove funzioni.

Buon divertimento !!!

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

Permanent link to this article: http://www.mauroalfieri.it/elettronica/rover5-leonardo-montaggio-e-collaudo.html

17 comments

Skip to comment form

    • marco on 1 Ott 2012 at 22:13
    • Reply

    Ciao,
    non so se è un problema mio ma entrambi i video non sono visibili (viene indicato “video privato”).

    ciao

    1. Ciao Marco,
      grazie per la segnalazione, i video erano impostati su modalità “Privato” da Youtube.

      Non me ne ero accorto.

      Mauro

    • pasquale on 11 Mag 2013 at 19:45
    • Reply

    ciao stavo montando il rover 5 solo che invece dell arduino uno ci sarebbe romeo.
    secondo te la programmazione e la stessa? grazie e buona serata:

    1. Ciao Pasquale,
      purtroppo non conosco proprio la romeo, so di aver usato l’arduino Leonardo perché ha caratteristiche differenti dalla Uno nella gestione dei segnali grazie al fatto c’è non usa il 328 classico.

      Mauro

        • pasquale on 12 Mag 2013 at 20:02
        • Reply

        la programmazione della romeo sembra essere uguale alla uno ho gia caricato lo sketch. ho inserito questo e sembra iniziare a funzionare. ma forse sbaglio io ma non riesco a far funzionare il sensore hc-sr04.//Standard PWM DC control
        int E1 = 5; //M1 Speed Control
        int E2 = 6; //M2 Speed Control
        int M1 = 4; //M1 Direction Control
        int M2 = 7; //M1 Direction Control

        ///For previous Romeo, please use these pins.
        //int E1 = 6; //M1 Speed Control
        //int E2 = 9; //M2 Speed Control
        //int M1 = 7; //M1 Direction Control
        //int M2 = 8; //M1 Direction Control

        #include

        int steerPin = 10; // questo è il Servo 1 sullo scudo del motore
        Servo steerServo;

        int pingPin = A0; // Analogica pin 0 utilizzato per la Pin Ping (Trig)
        int inPin = A1; // Pin analogico 1 usato per il perno di Echo (Eco)
        unsigned long duration, inches;
        int indec, cmdec;
        int inchconv = 147; // rapporto tra la larghezza e puls pollici
        int cmconv = 59; // rapporto tra la larghezza di impulso e cm
        String s1, s2, s3;
        int steerCentre = 80; //mpostare questo di essere morto prima impostazione (o regolare squadretta di montaggio)

        void setup()
        {
        pinMode( E1,OUTPUT );
        pinMode( E2,OUTPUT );
        pinMode( M1,OUTPUT );
        pinMode( M2,OUTPUT );

        //Serial.begin(115200);
        pinMode(pingPin, OUTPUT);
        pinMode(inPin, INPUT);
        steerServo.attach(steerPin, 1000, 2000);
        steer(0);
        }

        void loop()
        {
        int cm, lcm, rcm;
        avanti(200);
        delay(200);
        cm = distanza();
        if(cm < 20)
        {
        alt();
        steer(-60);
        lcm = distanza();
        steer(60);
        rcm = distanza();
        steer(0);
        if (lcm < rcm)
        steer(-45);
        else
        steer(45);
        gira(180);
        delay(700);
        steer(0);
        }
        }

        void steer(int angle)
        {
        steerServo.write(steerCentre + angle);
        delay(800); // attendere servo per arrivarci
        }

        int distanza()
        {
        int rval;
        digitalWrite(pingPin, LOW);
        delayMicroseconds(2);
        digitalWrite(pingPin, HIGH);
        delayMicroseconds(10);
        digitalWrite(pingPin, LOW);
        duration = pulseIn(inPin, HIGH, 38000L); // Impostare il timeout per 38mS
        if (duration == 0)
        duration = 1000;
        rval = microsecondsToCentimeters(duration);
        // Serial.println(rval);
        return rval;
        }

        void avanti(int spd)
        {
        digitalWrite( M1,HIGH );
        analogWrite( E1,200);
        digitalWrite( M2,LOW );
        analogWrite( E2,200 );
        }

        void indietro()
        {
        digitalWrite( M1,LOW );
        analogWrite( E1,200);
        digitalWrite( M2,HIGH );
        analogWrite( E2,200 );
        }

        void alt()
        {
        analogWrite( M1,0 );
        analogWrite( M2,0 );
        }

        void gira(int spd)
        {
        // STOP x 1/2 sec
        alt();
        delay( 500 );

        // INDIETRO x 1 secondo e 1/2
        indietro();
        delay( 1500 );

        // STOP x 1/2 sec
        alt();
        delay( 500 );

        // Gira
        digitalWrite( M1,HIGH );
        analogWrite( E1,200);
        digitalWrite( M2,HIGH );
        analogWrite( E2,200);

        delay( 800 );
        }
        long microsecondsToCentimeters(long microseconds)
        {
        return microseconds / cmconv;
        }

        Mi daresti una mano a vedere se no ho dimenticato qualche passaggio?
        ti ringrazio ti terro aggiornato.
        il kit lo comprato sul sito robotdomestici.

    • Pasquale on 14 Mag 2013 at 09:39
    • Reply

    Ciao l’unica cosa che non ho ben capito e come funzionano i servo motori del rover se devo inserli in programmazione o no

    1. Ciao Pasquale,
      nel rover Leo-Wi non ci sono servomotori ma solo motori con encoder.
      Inizialmente avevo inteso che tu stessi eseguendo una modifica, ora mi sorge il dubbio che ho mal interpretato quello che stai realizzando.

      Prova a leggere tutti gli articoli dedicati a Leo-Wi, scoprirai come collegarli e programmarli.

      Mauro

    • Pasquale on 14 Mag 2013 at 11:46
    • Reply

    Hai ragione encoder ho sbagliato io a scrivere. Andrò a leggere quello che mi hai detto. Hai mica visto se la programmazione c e qualche errore?

    1. Ciao Pasquale io gli encoder nel progetto non li ho utilizzati.

      Mauro

        • pasquale on 14 Mag 2013 at 17:52
        • Reply

        scusa se ti disturbo ancora ma nella programmazione che ti ho inviato non riecco a fare funzionare il sensore per far fermare il rover potresti darmi una mano? ti ringrazio

        1. Ciao Pasquale,
          nei commenti gli sketch diventano illeggibili, potresti inviarmi lo sketch in posta all’indirizzo info del blog?

          Per il sensore puoi leggere alcuni articoli che ho scritto per testarlo e iniziare a verificare che funzioni e che i collegamenti siano giusti.

          É possibile eh non usando Arduino i valori letti siano differenti.

          Mauro

    • pasquale on 15 Mag 2013 at 17:13
    • Reply

    mauro non riesco a trovare l indirizzo leggo colo quello di facebook

    1. CiaoPasquale,
      mi é arrivato lo sketch.
      Non mi sono chiare alcune cose:
      1. leggo un pin 10 dedicato ad un servo, sul mio rover non é previsto
      2. non é prevista neppure una fotoresistenza

      Mi sorge il dubbio c’è tu abbia commentato l’articolo errato questo mi ha fuorviato nel risponderti, che progetto stai realizzando?
      Lo sketch é tuo, composto con il copia e incolla da quanto ho capito, se tutto questo che ho dedotto é corretto mi serve sapere che componenti stai usando e quali funzioni vuoi realizzare per aiutarti.

      In merito al corso dell’8 giugno é un corso di robotica proprio per c’è inizia, se hai già un tuo robot su ruote puoi prenotarti direttamente sul mio sito in modo che io ti riservi il posto e pagare in aula.

      Mauro

    • Pasquale on 16 Mag 2013 at 15:04
    • Reply

    Ciao si lo sketch e mio io volevo fare il modo che quando il rover entra nel buio si accendono dei Led per illuminare. Poi volevo e qui mi viene difficile quando va indietro si accende un secondo Led. È per ultimo vorrei fare un on e off con un comando ir. Grazie spero che mi puoi aiutare. Molto probabile che ci vediamo al corso.

    1. Ciao Pasquale,
      ora mi è chiaro a cosa serve la foto resistenza.
      Non ho ancora chiara l’utilità del servo.

      Ti consiglio la lettura degli articoli dedicati alle foto resistenze per la gestione del buio.
      Ti consiglio di aggiungere l’accensione del led ( chiamiamolo di retronarcia ) direttamente nella funzione indietro()

      Durante il corso approfondiremo anche queste tematiche ed idee, mi sono rimasti 2 posti per quello di giugno poi probabilmente il prossimo sarà a settembre.

      Mauro

    • sebastiano on 16 Mag 2014 at 08:44
    • Reply

    ciao mauro
    io sto facendo lo stesso progetto solo con arduino uno nello sketch dei sensori c’è qualche differenza col tuo che utilizzi il leonardo?

    1. Ciao Sebastiano,
      se leggi anche gli altri articoli dedicati al WiRC troverai descritto il motivo per cui ho scelto la leonardo dopo aver provato l’arduino uno r3.
      Il motivo riguarda i tempi di risposta dei comandi rispetto all’acquisizione dal WiRc.

      Forse con l’arduino uno smd potresti avere dei benefici, è da provare.

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.