Linguaggio: Arduino
Elenco attrezzature e materiali:
- Scheda arduino.
- Breadboard.
- Chip motore L293D.
- Sensore di prossimità
- Sensore di colore
- Cavo usb per collegare 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 pinSxAvanti; // motore di sinistra ,pin attivazione direzione avanti
int pinDxAvanti; // motore di destra ,pin attivazione direzione avanti
int pinSxIndietro; // motore di sinistra ,pin attivazione direzione indietro
int pinDxIndietro; // motore di destra ,pin attivazione direzione indietro
public:
driverL293D()
{
//configurazione di default
this->pinSxAvanti=2;
this->pinDxAvanti=3;
this->pinSxIndietro=4;
this->pinDxIndietro=5;
pinMode(pinSxAvanti , OUTPUT);
pinMode(pinDxAvanti , OUTPUT);
pinMode(pinSxIndietro , OUTPUT);
pinMode(pinDxIndietro , OUTPUT);
}
driverL293D(int pinSxAvanti,int pinDxAvanti,int pinSxIndietro,int pinDxIndietro)
{
//configurazione con pin come parametri
this->pinSxAvanti=pinSxAvanti;
this->pinDxAvanti=pinDxAvanti;
this->pinSxIndietro=pinSxIndietro;
this->pinDxIndietro=pinDxIndietro;
pinMode(pinSxAvanti , OUTPUT);
pinMode(pinDxAvanti , OUTPUT);
pinMode(pinSxIndietro , OUTPUT);
pinMode(pinDxIndietro , OUTPUT);
}
void avantiDi(int millisec)
{
digitalWrite(pinSxAvanti , 1);
digitalWrite(pinDxAvanti , 0);
digitalWrite(pinSxIndietro , 1);
digitalWrite(pinDxIndietro , 0);
int tempo=0;
while(millisec-tempo>0)
{
delay(1);
tempo++;
}
fermo();
}
void indietroDi(int millisec)
{
digitalWrite(pinSxAvanti , 0);
digitalWrite(pinDxAvanti , 1);
digitalWrite(pinSxIndietro , 0);
digitalWrite(pinDxIndietro , 1);
int tempo=0;
while(millisec-tempo>0)
{
delay(1);
tempo++;
}
fermo();
}
private:
void fermo()
{
digitalWrite(pinSxAvanti , 0);
digitalWrite(pinDxAvanti , 0);
digitalWrite(pinSxIndietro , 0);
digitalWrite(pinDxIndietro , 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 pinSxAvanti=2;
const int pinDxAvanti=3;
const int pinSxIndietro=4;
const int pinDxIndietro=5;
const int pinEcho = 6;
const int pinTrigger = 7;
const int ledrosso = 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(pinSxAvanti, pinDxAvanti, pinSxIndietro, pinDxIndietro);
classSensoreProssimita sensProssObj(pinEcho,pinTrigger);
sensoreColore sensoreColoreObj(pinOut,s0,s1,s2,s3);
void setup()
{
Serial.begin(9600);
pinMode( ledrosso, OUTPUT );
pinMode(ledSegnalazRosso,OUTPUT);
pinMode(ledSegnalazVerde,OUTPUT);
pinMode(ledSegnalazBlue,OUTPUT);
// vai avanti per x millisecondi
driverMotoriObj.avantiDi(5000);
// vai avanti per x millisecondi
driverMotoriObj.indietroDi(5000);
}
void loop()
{
int pausa=100;
int r,v,b; //colori
r=sensoreColoreObj.rilevarosso();
v=sensoreColoreObj.rilevaVerde();
b=sensoreColoreObj.rilevaBlue();
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);
Serial.println(“prevale il colore rosso”);
Serial.print(“rosso=”);
Serial.println(r);
Serial.print(“verde=”);
Serial.println(v);
Serial.print(“blue=”);
Serial.println(b);
delay (pausa);
}
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);
Serial.println(“prevale il colore Verde”);
Serial.print(“rosso=”);
Serial.println(r);
Serial.print(“verde=”);
Serial.println(v);
Serial.print(“blue=”);
Serial.println(b);
delay (pausa);
}
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);
Serial.println(“prevale il colore Blu”);
Serial.print(“rosso=”);
Serial.println(r);
Serial.print(“verde=”);
Serial.println(v);
Serial.print(“blue=”);
Serial.println(b);
delay (pausa);
}
long dist=sensProssObj.getDistanzaLetta();
if( dist <= 10)
{
digitalWrite(ledrosso, LOW);
}
else
{
digitalWrite(ledrosso, HIGH);
}
delay(10); // Faccio respirare un pò il ciclo
}
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