Linguaggio: Arduino
Obiettivo didattico:
Obiettivo dell’esercitazione:
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:
- Realizzare il circuito
- Scrivere il codice arduino
- Collegare la scheda arduino al pc tramite il cavo usb
- Caricare il programma cliccando sul pulsante “carica” dell‘ambiente software arduino
Test finale:
Osservare il funzionamento di Roby.
Commenti recenti