Roby 3.0

ITIS “F.GIORDANI” Caserta
A.S. 2018/19
classe: 5D informatica
indirizzo di studio: Informatica e Telecomunicazione – articolazione Informatica
Materia: Informatica
Programmatore: Bonomo Alessandro
Sistema Operativo: Windows 10
Linguaggio: Arduino

Obiettivo didattico:

Programmare Roby, usando il sensore di  colore, di prossimità e i motori.

Obiettivo dell’esercitazione:

Programmare Roby per farlo muovere riconoscendo i colori e farlo fermare quando incontra un ostacolo.

Elenco attrezzature e materiali:

  1. Scheda arduino.
  2. Breadboard.
  3. Chip motore L293D.
  4. Sensore di prossimità
  5. Sensore di colore
  6. Cavo usb per collegare Arduino.

 

 

Codice Arduino:

//inizio classe sensore di colore
class sensoreColore
{
private:
int r,g,b; //colori
int out = 7; //rileva il segnale in ingresso all’Arduino
int s0 = 1; //rileva la Frequenza
int s1 = 2; //rileva la Frequenza
int s2 = 3; //rileva il Colore
int s3 = 4; //rileva il Colore
public:
sensoreColore()
{
//configurazione di default
out = 2;
s0 = 3;
s1 = 4;
s2 = 5;
s3 = 6;
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
pinMode(out, INPUT);
//Frequenza al 100/100
digitalWrite(s0, HIGH);
digitalWrite(s1, HIGH);
}
sensoreColore(int out,int s0,int s1,int s2,int s3)
{
//configurazione con parametri
this->out=out;
this->s0=s0;
this->s1=s1;
this->s2=s2;
this->s3=s3;
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
pinMode(out, INPUT);
//Frequenza al 100/100
digitalWrite(s0, HIGH);
digitalWrite(s1, HIGH);
}
int rilevaBlue()
{
int b;
digitalWrite(s2, LOW);
digitalWrite(s3, HIGH);
b = pulseIn(out, digitalRead(out));
return b;
}

int rilevaVerde()
{
int v;
digitalWrite(s3, HIGH);
digitalWrite(s2, HIGH);
v = pulseIn(out, digitalRead(out));
return v;
}

int rilevarosso()
{
int r;
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
r = pulseIn(out, digitalRead(out));
return r;
}

};

// inizio classe driverL293D
class driverL293D
{
private:
int pinB_M2; // motore di sinistra ,pin attivazione direzione avanti
int pinA_M2; // motore di destra ,pin attivazione direzione avanti
int pinB_M1; // motore di sinistra ,pin attivazione direzione indietro
int pinA_M1; // motore di destra ,pin attivazione direzione indietro
public:
driverL293D()
{
//configurazione di default
this->pinB_M2=2;
this->pinA_M2=3;
this->pinB_M1=4;
this->pinA_M1=5;
pinMode(pinB_M2 , OUTPUT);
pinMode(pinA_M2 , OUTPUT);
pinMode(pinB_M1 , OUTPUT);
pinMode(pinA_M1 , OUTPUT);
}
driverL293D(int pinB_M2,int pinA_M2,int pinB_M1,int pinA_M1)
{
//configurazione con pin come parametri
this->pinB_M2=pinB_M2;
this->pinA_M2=pinA_M2;
this->pinB_M1=pinB_M1;
this->pinA_M1=pinA_M1;
pinMode(pinB_M2 , OUTPUT);
pinMode(pinA_M2 , OUTPUT);
pinMode(pinB_M1 , OUTPUT);
pinMode(pinA_M1 , OUTPUT);
}
void avantiM1()
{
digitalWrite(pinB_M1 , 1);
digitalWrite(pinA_M1 , 0);
}
void indietroM1()
{
digitalWrite(pinB_M1 , 0);
digitalWrite(pinA_M1 , 1);
}
void fermaM1()
{
digitalWrite(pinB_M1 , 0);
digitalWrite(pinA_M1 , 0);
}
void avantiM2()
{
digitalWrite(pinB_M2 , 1);
digitalWrite(pinA_M2 , 0);
}
void indietroM2()
{
digitalWrite(pinB_M2 , 0);
digitalWrite(pinA_M2 , 1);
}
void fermaM2()
{
digitalWrite(pinB_M2 , 0);
digitalWrite(pinA_M2 , 0);
}
};

// inizio classe sensore di prossimità
class classSensoreProssimita
{
private:
int pinEcho;
int pinTrigger;
static const float v=0.034; // velocità del suono in una temperatura media di 20° in cm/s
public:
classSensoreProssimita()
{
// configurazione di default
pinEcho=2;
pinTrigger=3;
pinMode( pinEcho, INPUT );
pinMode( pinTrigger, OUTPUT );
}
classSensoreProssimita(int pinEcho,int pinTrigger)
{
this->pinEcho=pinEcho;
this->pinTrigger=pinTrigger;
pinMode( pinTrigger, OUTPUT );
pinMode( pinEcho, INPUT );
}
long getDistanzaLetta() // ritorna la distanza letta in cm
{
digitalWrite( pinTrigger, LOW );
digitalWrite( pinTrigger, HIGH );
delayMicroseconds( 10 );
digitalWrite( pinTrigger, LOW );
long t = pulseIn( pinEcho, HIGH );
long s = v * t / 2;
return s;
}
};

// dichiarazione pin
const int pinB_M2=2;
const int pinA_M2=3;
const int pinB_M1=4;
const int pinA_M1=5;
const int pinEcho = 6;
const int pinTrigger = 7;
const int led = 13;
const int ledSegnalazRosso=A0;
const int ledSegnalazVerde=A1;
const int ledSegnalazBlue=A2;
const int pinOut=8;
const int s0=9;
const int s1=10;
const int s2=11;
const int s3=12;
// oggetti delle classi
driverL293D driverMotoriObj(pinB_M2, pinA_M2, pinB_M1, pinA_M1);
classSensoreProssimita sensProssObj(pinEcho,pinTrigger);
sensoreColore sensoreColoreObj(pinOut,s0,s1,s2,s3);
void setup()
{
pinMode(led, OUTPUT );
pinMode(ledSegnalazRosso,OUTPUT);
pinMode(ledSegnalazVerde,OUTPUT);
pinMode(ledSegnalazBlue,OUTPUT);
}
void loop()
{
// valori dei colori letti
int r,v,b;
// distanza letta dal sensore di prossimita’
long dist=sensProssObj.getDistanzaLetta();
// leggo i valori dei colori
r=sensoreColoreObj.rilevarosso();
v=sensoreColoreObj.rilevaVerde();
b=sensoreColoreObj.rilevaBlue();
// se la distanza letta e’ minore o uguale a 10 cm
if( dist <= 10)
{
digitalWrite(led, HIGH); // attiva led 13
// spegni motori
driverMotoriObj.fermaM1();
driverMotoriObj.fermaM2();
}
else
{
digitalWrite(led, LOW); // disattiva led 13
/*
* imposta il movimento in senso orario dei motori
* in modo da far girare le ruote in avanti
*/
driverMotoriObj.avantiM1();
driverMotoriObj.avantiM2();
}
if (r < b && r < v )
{
// Se la Frequenza del rosso è minore del verde e del blu, prevale il colore Rosso
digitalWrite(ledSegnalazRosso,1);
digitalWrite(ledSegnalazVerde,0);
digitalWrite(ledSegnalazBlue,0);
}
if (v < r && v < b)
{
// Se la Frequenza del verde è minore del rosso e del blu, prevale il colore Verde
digitalWrite(ledSegnalazRosso,0);
digitalWrite(ledSegnalazVerde,1);
digitalWrite(ledSegnalazBlue,0);
}
if (b<r && b < v )
{
// Se la Frequenza del blu è minore del verde e del rosso, prevale il colore Blu
digitalWrite(ledSegnalazRosso,0);
digitalWrite(ledSegnalazVerde,0);
digitalWrite(ledSegnalazBlue,1);
}
delay(10); // Faccio respirare un pò il ciclo
}

Collegamenti:

Collegamenti (vista generale)

Il blocco 3 led esploso:

Il blocco sensore di prossimita’ nel dettaglio:

Il blocco sensore di colore nel dettaglio:

Il driver ed i motori

Il blocco driver esploso:

 

Descrizione top-down dei passi realizzativi:

  1. Realizzare il circuito
  2. Scrivere il codice arduino
  3. Collegare la scheda arduino al pc tramite il cavo usb
  4. Caricare il programma cliccando sul pulsante “carica” dell‘ambiente software arduino

Test finale:

Osservare il funzionamento di Roby.

Comments are closed.