«

»

Dic 20

Stampa Articolo

Robot 4WD il progetto di Bruno

Bruno è un appassionato di robotica ed arduino che ha realizzato un Robot 4WD ed ha inviato foto, schema e sketch perchè io lo potessi condividere con te sul blog.

Robot 4WD laterale

Il progetto di Bruno è un Robot 4WD realizzato con una struttura simile a quella del Beginner Robot della Dagu a cui sono state aggiunti componenti e shield per permetterti di gestire più programmi e funzioni che il Robot 4WD può fare.

Le immagini del Robot 4WD

Inizia con l’assemblaggio della parte meccanica del Robot 4WD:

Robot 4WD motori

i motori sono collegati alla shield motori sul retro del Robot 4WD:

Robot 4WD retro

dove trova posto anche il pulsante di selezione programma da eseguire:

Robot 4WD pulsante selezione

sulla parte frontale trovi il sensore SHARP incaricato di rilevare gli ostacoli:

Robot 4WD fronte sharp

montato su un servo che gli consente di ruotare di 180° per rilevare gli oggetti anche lateralmente:

Robot 4WD  servomotore

hai già intravisto la breadboard usata da Bruno per le connessioni tra arduino, il servo, il sensore, i led ed il pulsante:

Robot 4WD connessioni breadboard

puoi osservarla meglio nella foto seguente:

Robot 4WD laterale

nell’insieme, visto dall’alto:

Robot 4WD alto

Lo schema dei collegamenti del Robot 4WD

Puoi seguire lo schema realizzato da Bruno per costruire il tuo rover:

Schema-Robot-4WD

Lo sketch

Bruno mi ha inviato lo sketch che puoi utilizzare sul tuo Robot 4WD:

int E_DX=5; // 1 DX
int M_DX=4;

int E_SX=6; // 2 SX
int M_SX=7;

#define VELOCITA_DRITTO 130
#define VELOCITA_SVOLTA 255

int esegui=0;
int programma=0;
int statoLedProgramma=0;

#define OUT_LED_PROGRAMMA 12
#define OUT_LED_AVVIO 13
#define IN_IR A5			// ingresso analogico sensore distanza

#define SENSIBILITA_EVITA  200		// soglia distanza sotto cui fermarsi

unsigned long tempoLampeggio = 0;
#define TEMPO_LAMPEGGIO_BREVE 250	// in millisecondi
#define TEMPO_LAMPEGGIO_LUNGO 500	// in millisecondi
#define OUT_SERVO_IR 9			// PWR servo testa sensore distanza

byte angoli[2]={
  10,170};

char direzioni[2]={
  'S','D'};

byte angoloAvanti=85;

#include <Servo.h>

Servo testaIR;

void setup()
{
  pinMode(M_DX,OUTPUT);
  pinMode(M_SX,OUTPUT);

  attachInterrupt(0,interruptProgramma,FALLING);
  attachInterrupt(1,interruptStartStop,FALLING);

  pinMode(OUT_LED_PROGRAMMA, OUTPUT);
  pinMode(OUT_LED_AVVIO, OUTPUT);
  pinMode(OUT_SERVO_IR, OUTPUT);

  testaIR.attach(OUT_SERVO_IR);
  testaIR.write(angoloAvanti);
  aspetta(1000);
  testaIR.write(angoli[0]);
  aspetta(1000);
  testaIR.write(angoli[1]);
  aspetta(1000);
  testaIR.write(angoloAvanti);
  aspetta(1000);

  Serial.begin(9600);

  accendiLed();
  fermo();
}

void loop()
{
  accendiLed();

  if(esegui)
  {
    switch(programma)
    {
    case 0:
      faiUnGiro();
      break;

    case 1:
      fermo();
      break;

    case 2:
      fermo();
      break;

    case 3:
      fermo();
      break;
    }
  }
  else
    fermo();

}

void aspetta(int tempo)
{
  unsigned long tempoVolta=millis();
  while(millis()-tempoVolta < tempo)
  {
    accendiLed();
  } 
}

void faiUnGiro()
{
  if(esegui)
  {
    if(analogRead(IN_IR)<=SENSIBILITA_EVITA)
      avanti();
    else
    {
      fermo();
      aspetta(750);
      indietro();
      aspetta(500);
      fermo();
      aspetta(750);

      muovi(valutaDirezioneEvita());
    }
  }
}

void muovi(char direzione)
{
  switch(direzione)
  { 
  case 'I':
    sinistra();
    aspetta(2000);
    fermo();
    aspetta(500);
    break;

  case 'S':
    sinistra();
    aspetta(750);
    fermo();
    aspetta(500);
    break;

  case 'D':
    destra();
    aspetta(750);
    fermo();
    aspetta(500);
    break;
  }
}

char valutaDirezioneEvita()
{
  unsigned long adesso=millis();
  unsigned long tempoVolta=0;

  int valori[2];

  char direzione = 'A';

  for(int i=0;i<=1;i++)
  {
    testaIR.write(angoli[i]);

    tempoVolta=millis();
    while(millis()-tempoVolta < 1500)
    {
      accendiLed();
    } 

    //delay(1000);
    int distanza=analogRead(IN_IR);
    valori[i]=distanza;
  } 

  int distanzaminima=999999;

  Serial.println("---");
  for(int i=0;i<=1;i++)
  {
    Serial.println(valori[i]);
    if(valori[i]<distanzaminima)
    {
      distanzaminima=valori[i];
      direzione=direzioni[i];
    }  
  }

  if(distanzaminima>SENSIBILITA_EVITA)
    direzione='I';

  Serial.println(direzione);
  testaIR.write(angoloAvanti);
  return direzione;
}

void interruptStartStop()
{
  if(esegui==0)
    esegui=1;
  else
  {
    esegui=0;
    fermo();
  }
}

void interruptProgramma()
{
  if(programma<3)
    programma++;
  else
    programma=0;

  Serial.println(programma);
  esegui=0;
  fermo();
}

void accendiLed()
{
  unsigned long adesso=millis();

  switch(programma)
  {
  case 0: 
    statoLedProgramma=0; 
    break;		

  case 1: 
    statoLedProgramma=1; 
    break;

  case 2: 
    if(adesso-tempoLampeggio > TEMPO_LAMPEGGIO_BREVE)
    {
      tempoLampeggio=adesso;

      if(statoLedProgramma == 0)
        statoLedProgramma=1; 
      else
        statoLedProgramma=0; 
    }

    break;

  case 3: 
    if(adesso-tempoLampeggio > TEMPO_LAMPEGGIO_LUNGO)
    {
      tempoLampeggio=adesso;

      if(statoLedProgramma == 0)
        statoLedProgramma=1; 
      else
        statoLedProgramma=0; 
    }

    break;
  }

  digitalWrite(OUT_LED_PROGRAMMA,statoLedProgramma);

  if(esegui)
    digitalWrite(OUT_LED_AVVIO,HIGH);
  else
    digitalWrite(OUT_LED_AVVIO,LOW);
}

void fermo()
{
  analogWrite(E_DX,0);
  analogWrite(E_SX,0);
}

void avanti()
{
  digitalWrite(M_DX,HIGH);
  digitalWrite(M_SX,HIGH);  

  analogWrite(E_DX,VELOCITA_DRITTO);
  analogWrite(E_SX,VELOCITA_DRITTO);
}

void indietro()
{
  digitalWrite(M_DX,LOW);
  digitalWrite(M_SX,LOW);  

  analogWrite(E_DX,VELOCITA_DRITTO);
  analogWrite(E_SX,VELOCITA_DRITTO);
}

void destra()
{
  digitalWrite(M_DX,HIGH);
  digitalWrite(M_SX,LOW);  

  analogWrite(E_DX,VELOCITA_SVOLTA);
  analogWrite(E_SX,VELOCITA_SVOLTA);
}

void sinistra()
{
  digitalWrite(M_DX,LOW);
  digitalWrite(M_SX,HIGH);  

  analogWrite(E_DX,VELOCITA_SVOLTA);
  analogWrite(E_SX,VELOCITA_SVOLTA);
}

Buona sperimentazione robotica !!!

Permalink link a questo articolo: http://www.mauroalfieri.it/elettronica/robot-4wd-il-progetto-di-bruno.html

10 comments

1 ping

Vai al modulo dei commenti

  1. Andrea

    Grazie per la pubblicazione di questo progetto, senza di lui non sarei riuscito a montare il mio robot beginner 4w.

    Credo di avere un problema, Guardando le foto ho visto che la scheda motori è configurata per attingere corrente da Arduino, quindi usa 5volt, ma se configuro anche io questa opzione il robot non riesce a camminare, solo se lo alzo vedo le ruote girare!

    Sbaglio qualcosa? Ho provato anche a configurare la scheda motori per un alimentazione esterna a 9volt ma sembra non bastare neanche in questo caso, è normale?

    1. Mauro Alfieri

      Ciao Andrea,
      premetto che io non ho mai usato il 4WD e lascio a Bruno la possibilità di risponderti in merito.
      Dalla mia modesta esperienza con i 2WD mi sono accorto che a volte i motori assorbono molta corrente per spostare il peso dei robot su cui li utilizziamo, non è una questione di voltaggio ( V ) ma di maperaggio ( A ).

      Mauro

    2. bruno

      Ciao Andrea, sono contento che il post sia stato d’aiuto.
      Non ho ancora provato con l’alimentazione esterna per la scheda motori ma posso dirti che ho dovuto provare vari valori di VELOCITA_DRITTO e VELOCITA_SVOLTA prima di arrivare a quelli pubblicati.
      I due valori, così come il tempo di rotazione, sono legati allo stato delle batterie. Appena sostituite ho dovuto ridurre quasi tutti i valori.

      Penso che la struttura (peso, dimensioni e potenza) rendano un po’ difficile la rotazione e l’avanzamento del 4WD. Al mio basta un tappeto per farlo rallentare.

      Ho fatto anche una prova togliendo le ruote anteriori, quindi con motori collegati ma liberi da resistenza, e sostituendole con una caster ball (una ruota da cassettiera o sedia per intenderci) montata sotto il servo.
      Così ruotava fin troppo velocemente e anche la velocità era nettamente superiore però tirava tutto da una parte e quindi è necessario correggere i valori di velocità per i due lati.

      La mia versione attuale ha un pacco batterie da 4 AA per alimentare tutto quello che è sulla bread board lasciando così libera tutta l’alimentazione per arduino e motor shield.

      Questo sposta ancora un po’ il baricentro…Avendo messo tutto il peso verso l’asse posteriore al momento della rotazione quello anteriore risulta un po’ più scarico e permette di far scivolare le ruote.

      PS: Mauro nei prossimi giorni ti mando l’aggiornamento con il programmo e circuito per seguire un oggetto e la luce 🙂

      1. Mauro Alfieri

        Ottimo Bruno,
        sarà di certo un articolo di grande interesse.

        Mauro

  2. Sergio

    Ciao sono Sergio,
    Molto interessante il progetto e molto istruttivo per un principiante come me.
    Scusate l’ignoranza ma non riesco a capire una cosa, credo fondamentale: come fai a pilotare quattro motori con la shield, c’è scritto che può pilotare due motori dc.
    Forse mi sfugge qualcosa! Grazie

    1. Mauro Alfieri

      Ciao Sergio,
      lascio che sia Bruno, autore del progetto, a darti le risposte che cerchi.
      Io per il mio Rover Leo, puoi leggere l’articolo nel blog, ho collegato i motori sia a destra sia a sinistra in parallelo ottenendo due soli canali di controllo.

  3. Sergio

    Grazie Mauro

  4. Jacopo

    Ciao e scusami ancora; nello sketch qui rappresentato quale è la parte inerente il sensore sharp perche volevo sostituirlo con un hc-sr04 con il suo sketch. E possibile farlo?? grazie!!!

    1. Mauro Alfieri

      Ciao Jacopo,
      lascio a Bruno, autore del progetto, la risposta.

      Mauro

  5. Jacopo

    OK grazie !!

  1. Rover 4WD nunchuck - Bruno Rossi - Mauro Alfieri Elettronica Robotica

    […] ha già condiviso con noi appassionati il suo progetto Robot 4WD ed oggi ha voluto condividere l’evoluzione chiamandola Rover 4WD […]

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>