Durante un’esercitazione in “Strumenti e Metodi di Misura” nel corso triennale di ingegneria industriale è stata richiesta l’analisi di una misurazione di una distanza e l’individuazione della componentistica adeguata al calcolo dell’incertezze. Non chiedeva però la sua messa in opera… ma essendo pronto a cogliere l’attimo ho deciso di realizzarla facilmente con Arduino… Ho scelto uno dei sensori ad ultrasuoni più inflazionati della storia. Inoltre è stato necessario l’individuazione di un sensore di temperatura poiché la velocita del suono varia al variare della temperatura.
Il modulo riesce a misurare da una distanza di 2 cm a 400 cm, con una accuratezza di fabbrica di circa 3mm. Questo modulo comprende sia un emettitore che un ricevitore ad ultrasuoni.
Characteristics |
Value |
Working Voltage |
DC 5 V |
Working Current |
15mA |
Working Frequency |
40Hz |
Max Range |
4m |
Min Range |
2cm |
MeasuringAngle |
15 degree |
Trigger Input Signal |
10uS TTL pulse |
Echo Output Signal |
Input TTL lever signal and the range in proportion |
Dimension |
45*20*15mm |
Accuracy (20°C) |
+/- 3mm |
The Timing diagram is shown below. You only need to supply a short 10uS pulse to the trigger input to start the ranging, and then the module will send out an 8 cycle burst of ultrasound at 40 kHz and raise its echo. The Echo is a distance object that is pulse width and the range in proportion .You can calculate the range through the time interval between sending trigger signal and receiving echo signal.
L’intervallo temporale Δt tra generazione e ricezione è proporzionale alla distanza incognita d attraverso la velocità del suono locale Vs , secondo la relazione:
E’ di interesse conoscere l’accuratezza del Δt , sapendo che l’incertezza proveniente dai dati del costruttore è di ±3mm a 20°C e che lo standard di rivelazione che adotterà il sensore per la componente Δt sono in microsecondi. Avremo come velocità alla temperatura di 20°C:
vs=√401,8∗T=√401,8∗(273.15+20)=343,2m/s
Il termistore scelto è il MF52-103 3435B, operante ad un temperatura ampiamente dentro le specifiche 5-50 °C, di fatti è operante da -30°C a 125°C. È di facile reperimento essendo ampiamente utilizzato negli impianti di condizionamento, riscaldamento etc...
B value = 3435K, material-specific constant of NTC thermistor
Characteristics |
Value |
Resistance |
10K ohm |
Resistance Tolerances |
+/- 5% |
B Constant |
3435K |
B Constant Tolerances |
+/- 1% |
Accuracy of Temperature |
± 1.0 % |
Operative Range |
-30 a +125 °C |
B Constant Class |
B 25/85 °C |
Thermistore |
NTC |
Lo strumento creato è stato composto dai componenti relativi alla simulazione. Sono stati scelti poichè rientrano nelle caratteristiche e potevo creare realmente il caso. Anche se con valori di temperatura diversi poichè non riesco a ricreare condizioni di 10°C. Ho utilizzato una scheda arduino per comodità anche l’utilizzo di un Raspberry PI è consigliato pocihè consente una facile espansione IOT attraverso linux e python.
Ho collegato un piccolo display a cristalli liquidi per monitorare meglio i tentativi, oltre che a visualizzarlo in comunicazione seriale. Il codice sorgente è in allegato a questa relazione.
Ho effettuato 10 misurazione reali intervallate da 3000ms, alla temperatura di circa 21°C avendo i seguenti risultati.
Attempt |
T(C) |
Vs(m/s) |
Δtμs |
RT (ohm) |
d (mm) |
1 |
21.44 |
344.75 |
239 |
11491 |
41.2 |
2 |
21.25 |
344.62 |
225 |
11582 |
38.8 |
3 |
21.35 |
344.68 |
228 |
11536 |
39.3 |
4 |
21.35 |
344.68 |
234 |
11536 |
40.3 |
5 |
21.54 |
344.81 |
237 |
11446 |
40.9 |
6 |
21.54 |
344.81 |
239 |
11446 |
41.2 |
7 |
21.54 |
344.81 |
245 |
11446 |
42.2 |
8 |
21.44 |
344.75 |
242 |
11491 |
41.7 |
9 |
21.25 |
344.62 |
218 |
11552 |
37.6 |
10 |
21.25 |
344.56 |
218 |
11627 |
37.6 |
|
334.71 |
232.5 |
|
40.0 |
Calcolo l’incertezza utilizzando al serie della distanza d(mm)
|
Sxi | Sx | ud |
d |
1.66 mm |
0.525 mm |
0.525 mm |
Sxi=√∑10j=1(Xi,j−¯Xi)2n−1 |
Sx=Sxi√n |
ud=Sx |
|
|
|
|
|
Incertezza standard è relativa unicamente a quella della distanza.
ua(d)=0.52mm
Ed incertezza estesa con fattore k a 1,96 (97,5 %)
Ua(d)=k∗ua=1.029mm
Nel display possiamo notare informazioni di riepilogo come il Δt in microsecondi la distanza in cm ( per esigenze di spazio) e la Vs in m/s e la T in Celsius.
Lo script generato (download):
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3f, 16, 2); // Setup LC 16X2
// PIN CONSTANT
#define PIN_TRIGGER 3
#define PIN_ECHO 2
#define PIN_LED 3 // ANAGLOG
// VARS
long delta_t; // delta t in microsecondi 10^-6 relativo al tempo di volo
float d; // distanza percorsa
float RT, VR, ln, TX, T0, VRT, VS; // vars di calcolo
int attempt;
// MF52 CONSTANT
#define RT0 10000 // Ω
#define B 3435 // K
#define VCC 5 // V
#define R 10000 // R = 10KΩ
void setup() {
// COMUNICAZIONE SERIALE 9600 BAUD
Serial.begin(9600);
// SETUP PIN per HC-SR04
pinMode(PIN_TRIGGER, OUTPUT);
pinMode(PIN_ECHO, INPUT);
// SETUP VALORE INGRESSI
digitalWrite(PIN_ECHO, LOW);
digitalWrite(PIN_TRIGGER, LOW);
// INIT VARS
delta_t = 0;
d = 0;
// T0 in kelvin
T0 = 25 + 273.15;
// INIT LCD
lcd.init();
lcd.backlight();
pinMode(PIN_LED, OUTPUT);
analogWrite(PIN_LED, 50);
}
void loop() {
// attendo per la prossima rilevazione
delay(3000);
attempt++;
// NTC MF52-103
VRT = analogRead(A3); // VRT
VRT = (5.00 / 1023.00) * VRT; // Voltage
VR = VCC - VRT;
RT = VRT / (VR / R); // RT
ln = log(RT / RT0);
TX = (1 / ((ln / B) + (1 / T0))); // T
TX = TX - 273.15; // T °C
// print a seriale
Serial.print("ATTEMPT ");
Serial.println(attempt);
Serial.print("T:");
Serial.print("\t\t");
Serial.print(TX);
Serial.print("C\t\t");
Serial.print(TX + 273.15); //Conversion to Kelvin
Serial.println("K");
Serial.print("RT:");
Serial.print("\t");
Serial.println(RT);
// HC-SR04 -> IMPULSO 10microsecondi
digitalWrite(PIN_TRIGGER, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIGGER, LOW);
// pulseIN tempo di impulso
VS = 331.45+(0.62*TX);
delta_t = pulseIn(PIN_ECHO, HIGH);
// calcolo la d
d = delta_t * (VS/10000) / 2.0;
// print a seriale
Serial.print("Δt:\t\t");
Serial.println(delta_t);
Serial.print("d:\t\t");
Serial.println(d);
Serial.print("VS (m/s):\t\t");
Serial.println(VS);
// print a lcd
lcd.clear();
lcd.setCursor(0, 0);
String stringLineOne = String("dt:") + String(delta_t) + " d:" + String(d);
String stringLineTwo = String("Vs:") + String(VS) + " T:" + String(TX);//+ " RT:" + String(RT);
typewriting(stringLineOne);
lcd.setCursor(0, 1);
typewriting(stringLineTwo);
}
void typewriting(String messaggio){
int lunghezza = messaggio.length();
for(int i = 0; i < lunghezza; i++){
lcd.print(messaggio[i]);
//delay(150);
}
}