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 $\Delta_{t} $ tra generazione e ricezione è proporzionale alla distanza incognita $d $ attraverso la velocità del suono locale $ V_{s} $ , secondo la relazione:
E’ di interesse conoscere l’accuratezza del $\Delta_{t}$ , sapendo che l’incertezza proveniente dai dati del costruttore è di $\pm 3mm $ a 20°C e che lo standard di rivelazione che adotterà il sensore per la componente $\Delta_{t} $ sono in microsecondi. Avremo come velocità alla temperatura di 20°C:
$$v_s= \sqrt{401,8*T} = \sqrt{401,8*(273.15+ 20)} = 343,2 m/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) |
$\Delta_{t} \mu 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)
|
$S_{xi} $ | $S_{x} $ | $u_{d} $ |
$d $ |
1.66 mm |
0.525 mm |
0.525 mm |
$S_{xi} = \sqrt{\frac{\sum_{j=1}^{10}(X_{i,j}-\overline{X}_{i})^2}{n-1}}$ |
$S_{x} = \frac{S_{xi}}{\sqrt{n}}$ |
$u_{d} = S_{x}$ |
|
|
|
|
|
Incertezza standard è relativa unicamente a quella della distanza.
$u_{a}(d) = 0.52mm$
Ed incertezza estesa con fattore k a 1,96 (97,5 %)
$U_{a}(d) = k * u_{a} = 1.029mm$
Nel display possiamo notare informazioni di riepilogo come il $\Delta_{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);
}
}