a cadenza discontinua
Come se fossi
BLOG
Edizione del 04/12/2020
Edizione Precedente >>

Arduino - Sensore ad Ultrasuoni con Termoresistore e calcolo dell'incertezza

Ultrasonic Ranging Module HC-SR04 con NTC THERMISTOR MF52-103

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.

Ultrasonic Ranging Module HC - SR04

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:

$$d=\frac{1}{2} V_{s} \Delta_{t} $$

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$$

NTC THERMISTOR MF52-103 (10K)

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);
  }
}


di Guido Camerlingo