Il dispositivo HC-SR04, associato ad una scheda Arduino, provvede ad emettere il segnale e, lavorando "a riflessione", rileva il tempo impiegato dal segnale a ritornare sul sensore di ricezione. Questo è il principio informatore ma da qui a fare delle misure sufficientemente precise ce ne vuole.
Inoltre, sono stati sviluppati dei software che fanno uso di librerie apposite.
Nel lavoro da me sviluppato non si fa uso di librerie specifiche ed il calcolo è affidato ad una funzione che restituisce la distanza calcolata.
Per avere una misura affidabile e sufficientemente precisa servono, però, alcuni accorgimenti tecnici.
La distanza massima del "ping" è stata impostata a 5 metri; la distanza minima è di circa 20 millimetri e al di sotto non è possibile effettuare la misura, a causa della caratteristica di riflessione del segnale. Si potrebbe ovviare a questo inconveniente utilizzando sensori di tipo diverso ma questo esula dallo scopo della presente trattazione.
La precisione di misura, ottenuta con questo sistema da me ideato, è dell'ordine del millimetro.
Di seguito, lo sketch che potete provare e valutare.
/*
* -------------------- Inizio programma ------------------------------------------
* Misura della distanza da un oggetto
* senza libreria per il calcolo - risoluzione: 1 mm
* ing. Achille De Santis
* V2 del 13-01-2021
* -----------------------------------------------------------------
*/
//--------- I/O -----------
#define TRIG_PIN 10
#define ECHO_PIN 9
#define LEDrosso 6
#define LEDgiallo 5
#define LEDverde 4
#define soundbuzzer 7
// ------------------------
// ---------- Da inserire -------------------------------------------------------------
unsigned const MAX_DISTANCE=5000; // Distanza massima per il ping.
// ------------------------------------------------------------------------------------
unsigned const sample=25; //
float const V1= 0.340; //
float const V2= 0.340/2;
float T1;
float S; //
float distance; //
float calcolaDistanza() // calcolo della distanza
{
S=0;
for (int i=1; i<=sample; i++)
{
inviaImpulso();
T1 = pulseIn(ECHO_PIN, HIGH);
distance = V2*T1-3;
delay(5);
S=S+distance;
//delay(5);
}
distance=S/sample; // in millimetri
return(distance);
}
void intestazione()
{ Serial.println(" ------------------------------------------------------ ");
Serial.println(" - Tecnatron - ing. Achille De Santis - ");
Serial.println(" - tecnatron@gmail.com - ");
Serial.println(" - Misura della distanza da un oggetto - ");
Serial.println(" - senza libreria - risoluzione: 1 mm - ");
Serial.println(" - LEDrosso=6, LEDgiallo=5, LEDverde=4, soundbuzzer=7 - ");
Serial.println(" - TRIGGER_PIN=10, ECHO_PIN=9 - ");
Serial.println(" - V2 del 13-01-2021 - ");
Serial.println(" ------------------------------------------------------ ");
delay(500);
}
void inviaImpulso() //
{
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(5);
digitalWrite(TRIG_PIN, HIGH);
}
void segnala(bool r, bool g, bool v, bool c) //
{ digitalWrite(LEDrosso, r), (LEDgiallo, g), (LEDverde, v), (soundbuzzer, c); }
void setup()
{
Serial.begin(9600); //
intestazione(); //
pinMode(ECHO_PIN, INPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(LEDrosso, OUTPUT);
pinMode(LEDgiallo, OUTPUT);
pinMode(LEDverde, OUTPUT);
pinMode(soundbuzzer, OUTPUT); //
digitalWrite(TRIG_PIN, HIGH);
delay(200);
distance=calcolaDistanza(); //
}
void loop()
{
distance=calcolaDistanza();
Serial.print("Distanza = " + String(distance,1)+ " mm");
if (distance>=MAX_DISTANCE || distance<=0)
{ segnala(0,0,0,1); Serial.println("\t Fuori campo!"); }
else if (distance>=80 )
{ segnala(0,0,1,0); Serial.println("\t Lontano!");} //
else if (distance>=40 && distance<80) //
{ segnala(0,1,0,0); Serial.println("\t Vicino!");}
else if (distance>=30 && distance<40 ) //
{ segnala(0,1,0,1); Serial.println("\t Pericolo Collisione!");}
else if (distance>=1 && distance<30 ) //
{ segnala(1,0,0,1); Serial.println("\t Pericolo collisione!");}
delay(1000);
}
// ------------------ Fine programma -----------------------------------------------
Nessun commento:
Posta un commento