Sensori di distanza Arduino: HC-SR04, IR, VL53L0X e LiDAR
Confronto tra sensori di distanza per Arduino: HC-SR04, JSN-SR04T, Sharp IR, VL53L0X/VL53L1X, TF-Luna e TCRT5000; portata, precisione, angolo e superfici.
Scegliere tra i sensori di distanza per Arduino sembra all'inizio una questione di «quale misura più lontano», ma a decidere davvero sono la superficie da misurare, la precisione necessaria, quanto deve essere stretto il fascio e le condizioni ambientali. Lo stesso HC-SR04 che misura la distanza da un muro al centimetro può diventare instabile sul tessuto morbido di un divano, e un sensore laser economico preciso al millimetro può perdere metà della portata sotto il sole. In questa guida mettiamo fianco a fianco i sei sensori più usati nei progetti Arduino.
I sensori a confronto sono: l'ultrasuoni HC-SR04 e il fratello impermeabile JSN-SR04T, il sensore infrarosso a triangolazione Sharp GP2Y0A21, i sensori laser a tempo di volo (ToF) VL53L0X e VL53L1X, il piccolo LiDAR TF-Luna e il sensore di prossimità a corto raggio TCRT5000. Per ognuno spieghiamo principio di funzionamento, portata, precisione, angolo del fascio, comportamento sulle superfici e interfaccia, con uno sketch di esempio compilato. Alla fine una tabella riassume quale scegliere per quale progetto.

Come misurano i sensori di distanza? Tre principi di base
Quasi tutti i sensori di distanza usati con Arduino si basano su uno di tre metodi. Tempo di volo: il sensore invia un impulso di suono o di luce e misura quanto impiega il riflesso a tornare; la distanza è la metà del prodotto tra tempo e velocità. Gli ultrasuoni lo fanno con il suono, il VL53L0X e il TF-Luna con la luce. Poiché la luce è circa un milione di volte più veloce del suono, i sensori ToF contengono chip speciali che temporizzano al picosecondo. Triangolazione: i sensori Sharp IR inviano un fascio infrarosso sul bersaglio e guardano dove la luce riflessa cade su un rivelatore sensibile alla posizione (PSD); con oggetti vicini il punto si sposta verso un'estremità, con oggetti lontani verso l'altra. Intensità di riflessione: sensori semplici come il TCRT5000 misurano solo quanto è forte la luce che torna; poiché dipende molto dal colore della superficie, è rilevamento di prossimità più che vera misura di distanza.
| Principio | Sensori | Pro | Contro |
|---|---|---|---|
| Tempo di volo con il suono | HC-SR04, JSN-SR04T | Economico, insensibile a colore e luce | Fascio largo, debole su superfici morbide e inclinate, sensibile alla temperatura |
| Tempo di volo con la luce | VL53L0X, VL53L1X, TF-Luna | Veloce, fascio stretto, buona precisione | Sole e vetro creano problemi |
| Triangolazione infrarossa | Sharp GP2Y0A21 | Poco influenzato dal colore, uscita analogica semplice | Uscita non lineare, campo stretto, ingannevole sotto i 10 cm |
| Intensità di riflessione | TCRT5000 | Economicissimo, velocissimo | Solo pochi mm o cm, molto legato al colore |
La grande tabella di confronto
La tabella seguente riunisce i valori tipici dei moduli. Le portate sono quelle dichiarate dai produttori; in un progetto reale possono essere più corte a seconda della superficie e dell'ambiente. Poiché i prezzi cambiano da paese a paese, sono indicati in modo relativo.
| Sensore | Portata | Precisione | Angolo del fascio | Interfaccia | Alimentazione | Prezzo relativo |
|---|---|---|---|---|---|---|
| HC-SR04 | 2–400 cm | Circa ±0,3–1 cm | Circa 15° | Impulso Trig/Echo | 5 V (HC-SR04P: 3,3–5 V) | Economicissimo |
| JSN-SR04T | Circa 25–450 cm | Circa ±1 cm | Largo (circa 45° e oltre) | Trig/Echo, UART in alcune versioni | 5 V | Economico |
| Sharp GP2Y0A21 | 10–80 cm | Buona da vicino, scarsa da lontano | Stretto (pochi gradi) | Tensione analogica | 4,5–5,5 V | Medio |
| VL53L0X | 3 cm – 2 m (predefinito ~1,2 m) | Circa ±3% | 25° | I2C (0x29) | Modulo 3,3–5 V | Economico |
| VL53L1X | 4 cm – 4 m | Circa ±3%, risoluzione al mm | 27° (riducibile a 15°) | I2C (0x29) | Modulo 3,3–5 V | Medio |
| TF-Luna | 0,2–8 m | ±6 cm (fino a 3 m), ±2% (3–8 m) | 2° | UART o I2C | 5 V, logica 3,3 V | Costoso |
| TCRT5000 | Circa 0,2–15 mm (ottimo a 2,5 mm) | Non misura distanza, solo presenza | Stretto | Digitale (DO) + analogica (AO) | 3,3–5 V | Economicissimo |
HC-SR04: il classico a ultrasuoni
L'HC-SR04 invia otto impulsi sonori a 40 kHz e tiene il pin ECHO a HIGH finché l'eco non torna. Arduino misura la durata di questo impulso in microsecondi con pulseIn(). A 20 °C il suono percorre circa 343 metri al secondo, cioè 0,0343 cm al microsecondo; poiché il suono va al bersaglio e torna, distanza = tempo × 0,0343 / 2. La velocità del suono cambia con la temperatura (circa 331,3 + 0,606 × T m/s): tra 0 °C e 35 °C la differenza è di circa il 6%, cioè fino a 12 cm di errore a 2 metri. Il codice qui sotto applica questa correzione e prende la mediana di cinque misure per scartare qualche eco sbagliato occasionale.
1const int TRIG_PIN = 9;
2const int ECHO_PIN = 10;
3const float SICAKLIK = 20.0; // ortam sıcaklığı, °C / ambient temperature, °C
4float sesHizi; // cm/µs
5
6float mesafeOlc() {
7 digitalWrite(TRIG_PIN, LOW);
8 delayMicroseconds(2);
9 digitalWrite(TRIG_PIN, HIGH); // 10 µs tetik darbesi / 10 µs trigger pulse
10 delayMicroseconds(10);
11 digitalWrite(TRIG_PIN, LOW);
12 unsigned long sure = pulseIn(ECHO_PIN, HIGH, 30000UL); // 30 ms ≈ 5 m sınırı / ~5 m limit
13 if (sure == 0) return -1; // yankı yok / no echo
14 return sure * sesHizi / 2.0; // gidiş-dönüş / round trip
15}
16
17void setup() {
18 Serial.begin(9600);
19 pinMode(TRIG_PIN, OUTPUT);
20 pinMode(ECHO_PIN, INPUT);
21 sesHizi = (331.3 + 0.606 * SICAKLIK) / 10000.0; // m/s -> cm/µs (20 °C: 0,0343)
22}
23
24void loop() {
25 float olcum[5];
26 for (int i = 0; i < 5; i++) { // 5 ölçüm, aralarında 60 ms / 5 readings, 60 ms apart
27 olcum[i] = mesafeOlc();
28 delay(60);
29 }
30 for (int i = 1; i < 5; i++) { // sırala / sort
31 float x = olcum[i];
32 int j = i - 1;
33 while (j >= 0 && olcum[j] > x) { olcum[j + 1] = olcum[j]; j--; }
34 olcum[j + 1] = x;
35 }
36 float d = olcum[2]; // ortanca / median
37 if (d < 0) Serial.println("Menzil disi / out of range");
38 else { Serial.print(d, 1); Serial.println(" cm"); }
39}
40- Aspetta almeno 60 ms tra le misure: se misuri di nuovo mentre gli echi dell'impulso precedente rimbalzano ancora nella stanza, ottieni risultati errati.
- Superfici morbide e inclinate: tessuto, gommapiuma e tende assorbono il suono; le superfici inclinate di oltre 45 gradi deviano l'eco lontano dal sensore.
- Fascio largo: il cono di circa 15 gradi copre a 2 metri un'area di quasi 50 cm di diametro; in un corridoio stretto può vedere anche le pareti laterali.
- Schede a 3,3 V: l'HC-SR04 classico vuole 5 V e la sua uscita ECHO è a 5 V; su ESP32 e Pico metti un partitore di tensione su ECHO o usa l'HC-SR04P, che funziona a 3,3 V.
- Più sensori: due HC-SR04 attivati insieme sentono l'uno l'eco dell'altro; attivali uno dopo l'altro.
Il collegamento dell'HC-SR04 e l'uso con il Monitor seriale e un display LCD sono spiegati in dettaglio nell'articolo sensore di distanza HC-SR04; qui ci concentriamo sul confronto.
JSN-SR04T: l'ultrasuoni impermeabile
Il JSN-SR04T funziona con la stessa logica di trigger ed eco dell'HC-SR04, ma il suo trasduttore è in una capsula impermeabile in fondo a un cavo, separata dalla scheda elettronica. Per questo è la scelta per i luoghi umidi come serbatoi d'acqua, pozzi, cisterne per l'acqua piovana e sensori di parcheggio all'aperto. Ha due differenze importanti: poiché un solo trasduttore trasmette e ascolta, c'è una zona cieca a breve distanza (circa 20–25 cm), e il fascio è più largo di quello dell'HC-SR04. Monta il sensore sul coperchio del serbatoio, almeno 25 cm sopra il livello massimo dell'acqua. Il codice qui sotto trasforma la distanza in percentuale di riempimento.
1// JSN-SR04T ile su deposu doluluğu / water tank level with a JSN-SR04T
2const int TRIG_PIN = 9;
3const int ECHO_PIN = 10;
4const float SENSOR_BOSLUK = 25.0; // sensörden en yüksek su seviyesine, cm (ölü bölge) / sensor to max level (blind zone)
5const float DEPO_DERINLIK = 120.0; // en yüksek seviyeden depo dibine, cm / max level to tank bottom
6
7float mesafeOlc() {
8 digitalWrite(TRIG_PIN, LOW);
9 delayMicroseconds(5);
10 digitalWrite(TRIG_PIN, HIGH);
11 delayMicroseconds(20); // JSN-SR04T 10 µs'den uzun darbeyi sever / likes a longer pulse
12 digitalWrite(TRIG_PIN, LOW);
13 unsigned long sure = pulseIn(ECHO_PIN, HIGH, 40000UL);
14 if (sure == 0) return -1;
15 return sure * 0.0343 / 2.0; // 20 °C ses hızı / speed of sound at 20 °C
16}
17
18void setup() {
19 Serial.begin(9600);
20 pinMode(TRIG_PIN, OUTPUT);
21 pinMode(ECHO_PIN, INPUT);
22}
23
24void loop() {
25 float d = mesafeOlc();
26 if (d < 0) {
27 Serial.println("Yanki yok / no echo");
28 } else {
29 float suYuksekligi = DEPO_DERINLIK - (d - SENSOR_BOSLUK); // dipten su yüksekliği / water height
30 float yuzde = constrain(suYuksekligi / DEPO_DERINLIK * 100.0, 0, 100);
31 Serial.print("Mesafe / distance: ");
32 Serial.print(d, 1);
33 Serial.print(" cm Doluluk / fill: %");
34 Serial.println(yuzde, 0);
35 }
36 delay(1000); // su yüzeyi dalgalanır, sık ölçme / water ripples, measure slowly
37}
38Sharp GP2Y0A21: l'infrarosso analogico
Lo Sharp GP2Y0A21YK0F è un sensore infrarosso che lavora tra 10 e 80 cm e fornisce una tensione analogica in base alla distanza. Poiché usa la triangolazione, è meno sensibile al colore del bersaglio rispetto ai sensori basati sull'intensità di riflessione. La sua uscita non è lineare: circa 2,3 V a 10 cm e 0,4 V a 80 cm, con una curva di potenza inversa nel mezzo. Il codice converte la curva con l'approssimazione distanza = 29,988 × V^-1,173. La trappola principale è sotto i 10 cm: quando il bersaglio si avvicina, la tensione torna a scendere e un oggetto a 5 cm può sembrare a 20 cm. Monta il sensore in modo che il bersaglio non possa mai avvicinarsi a meno di 10 cm.
1// Sharp GP2Y0A21YK0F (10–80 cm), analog / analog output
2const int SHARP_PIN = A0;
3
4float sharpCm() {
5 long toplam = 0;
6 for (int i = 0; i < 20; i++) { // 20 okumanın ortalaması / average of 20 readings
7 toplam += analogRead(SHARP_PIN);
8 delay(2);
9 }
10 float volt = toplam / 20.0 * 5.0 / 1023.0;
11 if (volt < 0.35) return -1; // 80 cm'den uzak / farther than 80 cm
12 float cm = 29.988 * pow(volt, -1.173); // ters güç eğrisi / inverse power curve
13 if (cm > 80) return -1;
14 return cm; // 10 cm altı yanıltıcı / misleading below 10 cm
15}
16
17void setup() {
18 Serial.begin(9600);
19}
20
21void loop() {
22 float cm = sharpCm();
23 if (cm < 0) Serial.println("Menzil disi / out of range");
24 else { Serial.print(cm, 1); Serial.println(" cm"); }
25 delay(100);
26}
27I sensori Sharp assorbono brevi picchi di corrente durante la misura, che creano disturbi sull'alimentazione. Un condensatore da circa 10 µF vicino ai pin VCC e GND del sensore calma molto le letture. La famiglia comprende anche modelli con altri campi: il GP2Y0A41SK0F lavora da 4 a 30 cm, il GP2Y0A02YK0F da 20 a 150 cm; ognuno ha coefficienti di curva diversi.
VL53L0X e VL53L1X: sensori laser ToF
VL53L0X e VL53L1X sono minuscoli sensori laser a tempo di volo di STMicroelectronics. Inviano un impulso laser invisibile a 940 nm, misurano con contatori di fotoni il tempo di ritorno del riflesso e forniscono il risultato direttamente in millimetri via I2C. Sono quasi indipendenti dal colore, hanno un fascio più stretto degli ultrasuoni e una misura dura 20–50 ms. Il VL53L0X misura fino a circa 1,2 metri in modalità predefinita e fino a 2 metri in modalità lungo raggio; il VL53L1X arriva a 4 metri e il suo campo visivo (ROI) si può restringere via software. Entrambi hanno l'indirizzo I2C predefinito 0x29. Il codice usa la libreria VL53L0X di Pololu; cerca «VL53L0X» nel Gestore librerie e installa la versione Pololu.
1#include <Wire.h>
2#include <VL53L0X.h> // Pololu VL53L0X kütüphanesi / library
3
4VL53L0X sensor;
5
6void setup() {
7 Serial.begin(9600);
8 Wire.begin(); // Uno: SDA A4, SCL A5 / ESP32: SDA 21, SCL 22
9 sensor.setTimeout(500);
10 if (!sensor.init()) {
11 Serial.println("VL53L0X bulunamadi / not found");
12 while (true) {}
13 }
14 // Uzun menzil modu (2 m'ye kadar, daha gürültülü) / long range mode (up to 2 m, noisier):
15 // sensor.setSignalRateLimit(0.1);
16 // sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
17 // sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
18 sensor.setMeasurementTimingBudget(50000); // 50 ms: daha kararlı ölçüm / steadier reading
19 sensor.startContinuous();
20}
21
22void loop() {
23 uint16_t mm = sensor.readRangeContinuousMillimeters();
24 if (sensor.timeoutOccurred()) {
25 Serial.println("Zaman asimi / timeout");
26 } else if (mm >= 8190) { // 8190-8191: hedef yok / no target
27 Serial.println("Menzil disi / out of range");
28 } else {
29 Serial.print(mm);
30 Serial.println(" mm");
31 }
32}
33Il budget di tempo di misura (timing budget) regola l'equilibrio tra precisione e velocità: 20 ms è veloce ma rumoroso, 200 ms lento ma stabile. Il sole e le forti sorgenti infrarosse accorciano nettamente la portata; tienine conto se misuri all'aperto. Per collegare due VL53L0X allo stesso bus I2C, dato che entrambi hanno l'indirizzo 0x29, ne tieni spento uno con il pin XSHUT e dai all'altro un nuovo indirizzo (setAddress); i dettagli sull'I2C sono nell'articolo Cos'è l'I2C.
TF-Luna: 8 metri con un piccolo LiDAR
Il TF-Luna è il piccolo LiDAR a punto singolo di Benewake: misura il tempo di volo modulando luce infrarossa a 850 nm, lavora da 0,2 a 8 metri con un fascio strettissimo di soli 2 gradi e può fare fino a 250 misure al secondo. Per impostazione predefinita invia ogni misura via UART a 115200 baud in un pacchetto di 9 byte: due byte di intestazione 0x59, distanza (cm), intensità del segnale, temperatura interna e un checksum. Se l'intensità è sotto 100 o pari a 65535 (sovraesposizione), la misura è considerata inaffidabile. Si alimenta a 5 V ma il livello logico UART è 3,3 V, quindi si collega direttamente a un ESP32. Poiché il SoftwareSerial dell'Uno non è affidabile a 115200 baud, scegli una scheda con UART hardware come ESP32 o Mega; la logica per decodificare i pacchetti UART è spiegata nell'articolo comunicazione seriale UART.
1// TF-Luna LiDAR, UART (115200), ESP32 Serial2
2// TF-Luna TX -> GPIO 16, RX -> GPIO 17, VCC 5V, GND
3const int RXD2 = 16, TXD2 = 17;
4
5uint8_t kare[9]; // 0x59 0x59 DistL DistH AmpL AmpH TempL TempH Checksum
6int konum = 0;
7
8void setup() {
9 Serial.begin(115200);
10 Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2);
11}
12
13void loop() {
14 while (Serial2.available()) {
15 uint8_t b = Serial2.read();
16 if (konum < 2) { // iki 0x59 başlık baytını bekle / wait for two 0x59 header bytes
17 if (b == 0x59) kare[konum++] = b;
18 else konum = 0;
19 continue;
20 }
21 kare[konum++] = b;
22 if (konum < 9) continue;
23 konum = 0;
24
25 uint8_t toplam = 0;
26 for (int i = 0; i < 8; i++) toplam += kare[i];
27 if (toplam != kare[8]) continue; // sağlama toplamı hatalı / bad checksum
28
29 uint16_t mesafe = kare[2] | (kare[3] << 8); // cm
30 uint16_t guc = kare[4] | (kare[5] << 8); // sinyal gücü / signal strength
31 float derece = (kare[6] | (kare[7] << 8)) / 8.0 - 256.0;
32
33 if (guc < 100 || guc == 65535) { // zayıf ya da aşırı sinyal / weak or saturated
34 Serial.println("Guvenilmez / unreliable");
35 } else {
36 Serial.print(mesafe);
37 Serial.print(" cm guc / amp: ");
38 Serial.print(guc);
39 Serial.print(" ic sicaklik / chip temp: ");
40 Serial.println(derece, 1);
41 }
42 }
43}
44TCRT5000: prossimità e rilevamento linea

Il TCRT5000 non è un misuratore di distanza ma un sensore a riflessione: la luce del LED infrarosso rimbalza sulla superficie e il fototransistor accanto misura quanta ne torna. Funziona al meglio a circa 2,5 mm e oltre 1,5 cm il segnale cala in fretta. Poiché il bianco riflette molto e il nero pochissimo, a parità di distanza dà valori del tutto diversi a seconda del colore; per questo si usa per distinguere nero e bianco nei robot segui-linea, per contare i fori dei dischi encoder e per rilevare oggetti molto vicini. Il comparatore del modulo commuta l'uscita digitale quando si supera la soglia regolata con il trimmer. Dettagli nell'articolo sensore infrarosso TCRT5000.
1// TCRT5000 modülü: DO dijital, AO analog / TCRT5000 module: DO digital, AO analog
2const int DO_PIN = 7;
3const int AO_PIN = A1;
4const int LED_PIN = 13;
5
6void setup() {
7 Serial.begin(9600);
8 pinMode(DO_PIN, INPUT);
9 pinMode(LED_PIN, OUTPUT);
10}
11
12void loop() {
13 bool nesneVar = (digitalRead(DO_PIN) == LOW); // çoğu modülde LOW = yansıma var / LOW = reflection on most modules
14 int yansima = analogRead(AO_PIN); // düşük değer = güçlü yansıma / low value = strong reflection
15 digitalWrite(LED_PIN, nesneVar);
16 Serial.print(nesneVar ? "Nesne VAR / object " : "Nesne yok / none ");
17 Serial.println(yansima);
18 delay(100);
19}
20Effetto della superficie e dell'ambiente
La portata di un sensore sulla carta cambia quando incontra la superficie da misurare. Gli ultrasuoni sono eccellenti su superfici dure che riflettono il suono, ma soffrono con i tessuti che lo assorbono; i sensori a luce sono sensibili a colore, lucentezza e sole. La tabella mostra quale sensore resta affidabile in quale situazione mentre progetti.
| Superficie / ambiente | Ultrasuoni (HC-SR04) | Sharp IR | Laser ToF (VL53, TF-Luna) | TCRT5000 |
|---|---|---|---|---|
| Muro duro e liscio | Ottimo | Buono | Ottimo | Buono (solo vicinissimo) |
| Tessuto, gommapiuma, tende | Debole (suono assorbito) | Buono | Buono | Medio |
| Superficie nera opaca | Buono | Medio | Portata ridotta | Debolissimo |
| Vetro, specchio, metallo lucido | Buono (il suono rimbalza) | Ingannevole | Ingannevole (la luce passa o devia) | Ingannevole |
| Superficie inclinata | Debole (eco deviato) | Medio | Buono | Medio |
| Sole, all'aperto | Nessun effetto | Influenzato | Portata molto ridotta | Influenzato |
| Superficie dell'acqua | Buono (misura serbatoi) | Debole | Variabile | Non adatto |
| Variazioni di temperatura | Cambia la velocità del suono, serve correzione | Poco influenzato | Poco influenzato | Poco influenzato |
Riepilogo collegamenti: Uno, ESP32 e Pico
| Sensore | Arduino Uno | ESP32 | Raspberry Pi Pico | Nota |
|---|---|---|---|---|
| HC-SR04 / JSN-SR04T | TRIG D9, ECHO D10, 5V | TRIG 5, ECHO 18 (con partitore), VIN 5V | TRIG GP14, ECHO GP15 (con partitore), VBUS | ECHO esce a 5 V |
| Sharp GP2Y0A21 | A0, 5V | GPIO 34 (con partitore), VIN 5V | GP26 (con partitore), VBUS | L'uscita può arrivare a 3,1 V |
| VL53L0X / VL53L1X | SDA A4, SCL A5 | SDA 21, SCL 22 | SDA GP4, SCL GP5 | Indirizzo 0x29 |
| TF-Luna | SoftwareSerial sconsigliato | TX → GPIO 16, RX → GPIO 17 | TX → GP1 (RX di uart0), RX → GP0 | Alimentazione 5 V, logica 3,3 V |
| Modulo TCRT5000 | DO D7, AO A1 | DO 27, AO 34 | DO GP16, AO GP27 | 3,3–5 V |
Misura a ultrasuoni con il Raspberry Pi Pico
In MicroPython la durata di un impulso si misura con machine.time_pulse_us(); fa lo stesso lavoro di pulseIn() su Arduino e in caso di timeout restituisce un valore negativo. Alimenta l'HC-SR04 dal pin VBUS (5 V dell'USB) del Pico e metti un partitore da 1 kΩ + 2 kΩ sulla linea ECHO, oppure usa l'HC-SR04P, che funziona direttamente a 3,3 V. Esistono driver MicroPython anche per VL53L0X e TF-Luna; il pacchetto UART del TF-Luna si decodifica facilmente con machine.UART seguendo la stessa logica del codice Arduino.
1from machine import Pin, time_pulse_us
2import time
3
4trig = Pin(14, Pin.OUT)
5echo = Pin(15, Pin.IN) # 5 V ECHO için gerilim bölücü şart / divider required for a 5 V ECHO
6SES_HIZI = 0.0343 # cm/µs, 20 °C
7
8def mesafe_olc():
9 trig.low()
10 time.sleep_us(2)
11 trig.high()
12 time.sleep_us(10) # 10 µs tetik / 10 µs trigger
13 trig.low()
14 sure = time_pulse_us(echo, 1, 30000) # zaman aşımında eksi döner / negative on timeout
15 if sure < 0:
16 return None
17 return sure * SES_HIZI / 2
18
19while True:
20 d = mesafe_olc()
21 print("Menzil disi" if d is None else "{:.1f} cm".format(d))
22 time.sleep_ms(100)
23Quale sensore di distanza per quale progetto?
| Progetto | Sensore consigliato | Perché? |
|---|---|---|
| Robot che evita gli ostacoli | HC-SR04 (economico) o VL53L0X | Il fascio largo non perde ostacoli; il VL53L0X è più veloce e piccolo |
| Livello di serbatoio o pozzo | JSN-SR04T | Sonda impermeabile, vede bene la superficie dell'acqua |
| Sensore di parcheggio | JSN-SR04T o HC-SR04 | Resiste all'aperto, bastano 2–3 m di portata |
| Robot segui-linea | TCRT5000 | Fatto apposta per distinguere nero e bianco |
| Mini sumo, misura precisa da tavolo | VL53L0X / VL53L1X | Risoluzione millimetrica, fascio stretto, dimensioni ridotte |
| Radar Arduino (scansione con servo) | HC-SR04 o TF-Luna | L'HC-SR04 costa poco; il fascio da 2° del TF-Luna disegna una mappa molto più nitida |
| Misuratore di altezza, contapersone | VL53L1X o TF-Luna | Lunga portata e misure stabili |
| Drone, lunga distanza | TF-Luna | Portata di 8 m, fino a 250 Hz |
| Rubinetto senza contatto, rilevamento mano | Sharp GP2Y0A21 | Campo 10–80 cm e uscita analogica semplice |
E qualche idea di progetto: fai ruotare un HC-SR04 su un servo per creare uno schermo radar con Arduino; usa un HC-SR04 davanti e due VL53L0X ai lati del tuo robot che evita gli ostacoli; apri il coperchio di un cestino intelligente quando si avvicina una mano; costruisci un metro digitale portatile con un display OLED, oppure invia al telefono il livello del serbatoio tramite un ESP32 con un JSN-SR04T.
Errori comuni e soluzioni
| Sintomo | Causa probabile | Soluzione |
|---|---|---|
| L'HC-SR04 segna sempre 0 o fuori portata | Nessun eco, problema di cablaggio o alimentazione | Controlla i 5 V e i pin TRIG/ECHO, dai un timeout a pulseIn |
| Le letture a ultrasuoni saltano ogni tanto | Eco dell'impulso precedente o di una parete laterale | Aspetta 60 ms tra le misure, usa un filtro mediano |
| Il JSN-SR04T non misura da vicino | Zona cieca (20–25 cm) | Monta il sensore ad almeno 25 cm dal bersaglio |
| Lo Sharp dà un valore grande e sbagliato da vicinissimo | La curva si inverte sotto i 10 cm | Impedisci al bersaglio di avvicinarsi a meno di 10 cm |
| Letture dello Sharp rumorose | I picchi di corrente disturbano l'alimentazione | Condensatore da 10 µF tra VCC e GND, media delle letture |
| VL53L0X non trovato | Cablaggio I2C o conflitto di indirizzi | Controlla SDA/SCL e l'indirizzo 0x29 con uno scanner I2C |
| Il sensore laser misura corto all'aperto | Infrarosso della luce solare | Aggiungi un'ombra, aumenta il timing budget o usa gli ultrasuoni |
| I dati del TF-Luna non hanno senso | Baud errati o SoftwareSerial troppo lento | Usa 115200 baud e una UART hardware, controlla il checksum |
I sensori di distanza sono il modo più semplice per dare a un progetto Arduino la percezione dell'ambiente, e scegliere quello giusto fa la differenza tra un progetto che gira tranquillo e uno che fa impazzire. Le tabelle e i codici di questo confronto ti aiutano a bilanciare budget e prestazioni secondo le tue esigenze. Nell'app BlueGrays trovi progetti di misura della distanza con HC-SR04, sensore di parcheggio, misuratore di altezza, robot che evita gli ostacoli, sensore di parcheggio con ESP32 e misura della distanza con TCRT5000, passo passo con schema e codice.
Domande frequenti
Qual è il miglior sensore di distanza per Arduino?
Non esiste un unico sensore migliore; la scelta dipende dal bersaglio e dall'ambiente. L'HC-SR04 va bene per usi generici ed economici, il VL53L0X o il VL53L1X per precisione millimetrica e fascio stretto, il JSN-SR04T per luoghi umidi e il TF-Luna per misure veloci oltre qualche metro.
Fino a quanti metri misura l'HC-SR04?
Secondo il produttore da 2 cm a 4 metri, ma in pratica le misure affidabili arrivano di solito a 2–3 metri. Ci si avvicina al limite con bersagli grandi, duri e perpendicolari al sensore; con bersagli morbidi, piccoli o inclinati la portata cala molto.
Che differenza c'è tra sensore di distanza a ultrasuoni e a infrarossi?
Il sensore a ultrasuoni misura il tempo dell'eco di un impulso sonoro; non risente di colore e luce, ma ha un fascio largo e fatica con le superfici morbide. I sensori a infrarossi usano la luce, hanno fasci più stretti e sono veloci, ma sole, vetro e alcune superfici scure possono falsare la misura.
Che differenza c'è tra VL53L0X e VL53L1X?
Sono entrambi sensori laser ToF con interfaccia I2C. Il VL53L0X misura fino a circa 2 metri, il VL53L1X arriva a 4 metri, può misurare più velocemente e permette di restringere il campo visivo via software. Il VL53L0X è adatto a piccoli robot a corto raggio, il VL53L1X a misure più lunghe e precise.
Quale sensore di distanza usare per il livello di un serbatoio d'acqua?
Il JSN-SR04T con sonda impermeabile è la scelta più comune; si monta sul coperchio del serbatoio, almeno 25 cm sopra il livello massimo. Anche l'HC-SR04 funziona in serbatoi asciutti e chiusi, ma umidità e condensa possono rovinarlo presto.
I sensori di distanza funzionano con ESP32 e Raspberry Pi Pico?
Sì, ma bisogna portare a 3,3 V con un partitore di tensione l'uscita ECHO di HC-SR04 e JSN-SR04T, alimentati a 5 V, e l'uscita analogica dello Sharp. I moduli VL53L0X e il TF-Luna usano già una logica compatibile con 3,3 V, e l'HC-SR04P funziona direttamente a 3,3 V.
Progetti da realizzare dopo questo articolo
Vedi tutti i progetti
HC-SR04 Misura della distanza (display seriale)
Il sensore HC-SR04 funziona come un pipistrello che trova la strada al buio: manda un suono che non puoi sentire, ne ascolta l'eco e misura quanto è lontano l'oggetto davanti a sé. L'Arduino scrive qu

Sensore di parcheggio con HC-SR04
Una versione in miniatura del sensore di parcheggio delle auto: più qualcosa si avvicina, più i bip accelerano. Il sensore di distanza misura l'oggetto davanti a sé; se è a più di 20 centimetri resta

Progetto di misurazione dell'altezza
Un misuratore d'altezza da appendere allo stipite della porta che ti dice in centimetri quanto è alto chi ci sta sotto. Prima premi il primo pulsante senza nessuno sotto e il sensore di distanza misur

Robot che evita gli ostacoli
Che ne dite di costruire un veicolo intelligente che trova la propria strada? L'Obstacle Avoiding Robot scruta costantemente l'ambiente circostante grazie al sensore a ultrasuoni posto davanti a lui.

ESP32 HC-SR04 Misuratore di distanza a ultrasuoni
Il sensore a ultrasuoni HC-SR04 calcola la distanza misurando il tempo di volo (Time of Flight) dell'onda sonora che emette dopo aver colpito un oggetto e essere rimbalzata indietro. In questo progetto invieremo un impulso di 10 microsecondi dall'ESP32 al pin TRIG del sensore e leggeremo il tempo di eco proveniente dal pin ECHO con pulseIn(). Visualizziamo la distanza calcolata in cm su un display LCD I2C 16x2. Poiché l'HC-SR04 funziona a 5V, è necessario un divisore di tensione sul pin EC

Sensore di parcheggio ESP32 (HC-SR04 + barra a 5 LED + cicalino + OLED)
La versione ESP32 del sensore di parcheggio per auto! Grazie al sensore a ultrasuoni HC-SR04 misuriamo la distanza dall'oggetto davanti al veicolo. Man mano che la distanza diminuisce, la barra composta da 5 LED si riempie (da verde → giallo → rosso) e l'intervallo tra i bip del cicalino si accorcia. Quando ci si avvicina troppo (meno di 10 cm), l'allarme suona ininterrottamente e tutti i LED si accendono. Sul display OLED SSD1306 vengono visualizzati in caratteri grandi il valore istantaneo in

Lettura della riflessione (prossimità) con TCRT5000
Con un piccolo sensore che manda luce invisibile e misura quanta ne torna indietro, rilevi la superficie che ha davanti. Più un oggetto o una superficie chiara si avvicina, più luce ritorna, e l'Ardui

Misurazione della distanza tramite display LCD
Uno strumento che misura le distanze senza righello: muovi la mano avanti e indietro davanti al sensore e guarda il numero cambiare. L'HC-SR04 manda un'onda sonora e ascolta l'eco, e l'Arduino calcola
Altri articoli
App BlueGrays
Costruisci questo circuito passo passo sul telefono
Schema, codice ed elenco componenti in un’unica schermata. Oltre 200 progetti Arduino, ESP32 e Pico da realizzare.
Inquadra con il telefono
Punta la fotocamera sul codice: si apre lo store del tuo telefono.
oppure apri lo store

