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

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

Permanent link to this article: https://www.mauroalfieri.it/elettronica/robot-4wd-il-progetto-di-bruno.html

11 pings

Skip to comment form

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

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.