Component · Sensor
HC-SR04 ultrasone sensor
De HC-SR04 is de ultrasone sensor die de meeste robots gebruiken om afstand te meten. Echometing, het echte bereik, blinde vlekken en hoe je de sensor bedraadt.
Wat het is
De HC-SR04 is een ultrasone afstandssensor: het kleine bord met twee zilveren cilinders die robotogen lijken. Hij meet afstand zoals een vleermuis of duikboot: hij zendt een burst geluid uit dat te hoog is om te horen, luistert naar de echo en meet hoe lang de heen- en terugweg duurt. Voor enkele dollars krijgt een robot zo zicht op de ruimte vóór zich, waardoor hij de standaardsensor is in vrijwel elke eerste robot met obstakelvermijding.
De twee cilinders zijn een zender en een ontvanger. De ene tikt, de andere luistert. Al het andere op het bord is timingelektronica die de echo omzet in een signaal dat je microcontroller kan meten.
Hoe het werkt
De sensor spreekt een eenvoudige taal met twee lijnen:
- Je geeft de Trigger-pin 10 microseconden een HIGH-puls.
- De sensor zendt acht ultrasone pulsen uit op 40 kHz en brengt de Echo-pin omhoog.
- Wanneer de echo terugkomt, brengt hij Echo weer LOW.
- Je meet hoe lang Echo hoog bleef.
De pulsbreedte is de heen- en terugtijd. Geluid beweegt ongeveer 343 m/s in lucht, dus
distance = (echo_time × 343) / 2; de deling door twee is nodig omdat het geluid eruit ging en
terugkwam. De meeste Arduino-code verpakt dit in pulseIn() en wat rekenwerk.
Omdat de meting van de geluidssnelheid afhangt, verandert de waarde licht met de temperatuur; geluid beweegt sneller in warme lucht. Voor een robot die muren vermijdt is die fout verwaarloosbaar; voor nauwkeurige afstandsmeting telt hij en zou je de temperatuur moeten compenseren.
Wanneer je hem gebruikt
Kies een HC-SR04 zodra een robot ongeveer moet weten hoe ver het dichtstbijzijnde object verwijderd is: obstakelvermijding, wandvolgen, een beveiliging tegen van de tafel rijden of het activeren van gedrag wanneer iets nadert. De brede bundel is hier zelfs nuttig: een obstakel is moeilijk te missen.
Kies iets anders wanneer je een nauwkeurige afstand, een smalle bundel of snelle updates nodig hebt. Een looptijdsensor gebruikt licht in plaats van geluid en levert een compacte, snelle meting met millimeternauwkeurigheid, beter voor kaart maken of een specifieke opening beoordelen.
Bedrading en valkuilen
- Echo is een 5V-pin. Op een 5V-bord zoals de Arduino Uno is dat goed. Op een bord van 3,3 V zoals de ESP32 plaats je een spanningsdeler op Echo, anders riskeer je beschadiging van de pin.
- Houd rekening met de blinde vlek en de kegel. Niets dichter dan ~2 cm wordt geregistreerd, en de bundel van ~15° betekent dat de sensor het dichtstbijzijnde object in een kegel meldt; een tafelpoot opzij kan hem dus activeren.
- Zachte en schuine objecten liegen. Foam, stof of een muur onder een steile hoek verstrooien de echo weg van de ontvanger, waardoor de sensor “ver” of niets leest. Hij werkt het best op vlakke, harde oppervlakken die recht op hem gericht staan.
- Vraag niet te snel opnieuw een meting aan. Laat ~60 ms tussen metingen zodat de vorige echo is verdwenen; vraag je sneller opnieuw een ping aan, dan geven strooisignalen onjuiste waarden. Filteren helpt; zie sensorruis beheersen.
Pindindeling
| Pin | Naam | Richting | Functie |
|---|---|---|---|
| 1 | VCC | In | 5 V. Het bord verbruikt ongeveer 15 mA met een piek tijdens een ping |
| 2 | Trig | In | HIGH-puls van 10 µs om een meting te starten |
| 3 | Echo | Uit | Gaat HIGH wanneer de burst vertrekt en LOW wanneer hij terugkomt. 5V-uitgang |
| 4 | GND | — | Aarde |
De vier pinnen staan altijd in deze volgorde en de module is vrijwel altijd zo geplaatst dat de
pinnen van de transducers af wijzen. Daardoor staat VCC links als je naar de “ogen” kijkt.
Aansluiten op een Arduino
| HC-SR04 | Arduino Uno | ESP32 |
|---|---|---|
| VCC | 5 V | 5 V (van VIN, niet van de rail op 3,3 V) |
| Trig | Elke digitale pin | Elke GPIO |
| Echo | Elke digitale pin | Via een spanningsdeler; zie hieronder |
| GND | GND | GND |
Het probleem met 3,3 V
De Echo-pin stuurt volledige 5 V, terwijl een GPIO van een ESP32 of Raspberry Pi maximaal 3,3 V mag verdragen. 5 V toevoeren aan zo’n pin ligt boven het absolute maximum. De pin overleeft dat vaak een tijdje, maar beschadigt hem wel echt. Twee weerstanden lossen het op:
Echo ──┬── 1 kΩ ──┬── to 3.3 V GPIO
│ │
│ 2 kΩ
│ │
└──────────┴── GND
Deze spanningsdeler levert 5 V × 2/(1+2) = 3.33 V. Elke verhouding rond 2:1 werkt, bijvoorbeeld
1 kΩ en 2 kΩ of 10 kΩ en 20 kΩ. Gebruik geen waarden boven ongeveer 20 kΩ, want de ingangscapaciteit
van de pin vertraagt de flank dan genoeg om de timing te verstoren die je wilt meten.
De afstandsrekensom en waar die misgaat
distance = (echo_microseconds x speed_of_sound) / 2
Geluid beweegt bij 20 °C met 343 m/s, oftewel 0,0343 cm/µs. Dat levert de constante die iedereen gebruikt: deel de echotijd door 58,2 om centimeters te krijgen.
De geluidssnelheid is temperatuurafhankelijk, ongeveer:
speed (m/s) = 331.3 + 0.606 x temperature_celsius
| Temperatuur | Geluidssnelheid | Fout als je 20 °C aanneemt |
|---|---|---|
| 0 °C | 331 m/s | Leest 3,5% te ver |
| 20 °C | 343 m/s | — |
| 40 °C | 356 m/s | Leest 3,7% te dichtbij |
Op 2 m is dat ongeveer 7 cm verschil tussen een garage in de winter en een warme kamer. Voor obstakelvermijding is het verwaarloosbaar. Compenseer bij het meten van openingen; als je een MPU-6050 of vrijwel elke andere I²C-sensor op de robot hebt, heb je al een temperatuurmeting.
Minimaal werkende code
const int TRIG = 9, ECHO = 10;
const unsigned long TIMEOUT_US = 25000UL; // ~4.3 m, past the sensor's range
void setup() {
Serial.begin(115200);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
}
// Returns centimetres, or -1 when nothing came back.
float pingCm() {
digitalWrite(TRIG, LOW); delayMicroseconds(2);
digitalWrite(TRIG, HIGH); delayMicroseconds(10);
digitalWrite(TRIG, LOW);
unsigned long us = pulseIn(ECHO, HIGH, TIMEOUT_US);
if (us == 0) return -1.0f; // timeout: no echo, NOT "zero distance"
return us / 58.2f;
}
// Median of three kills the occasional wild reading.
float pingMedianCm() {
float a = pingCm(); delay(60);
float b = pingCm(); delay(60);
float c = pingCm();
if (a > b) { float t = a; a = b; b = t; }
if (b > c) { float t = b; b = c; c = t; }
if (a > b) { float t = a; a = b; b = t; }
return b;
}
void loop() {
float cm = pingMedianCm();
if (cm < 0) Serial.println("no echo");
else Serial.println(cm);
delay(60);
}
Drie details daarin bepalen het verschil tussen een werkende en een niet-werkende sensor:
De timeout is niet optioneel. pulseIn zonder timeout blokkeert totdat er een echo binnenkomt,
en op een zacht of schuin oppervlak komt die nooit. De robot lijkt op willekeurige momenten te
bevriezen, terwijl de oorzaak op alles behalve de sensor lijkt.
Nul is geen afstand. Een timeout betekent “er is niets teruggekomen”, meestal omdat het dichtstbijzijnde object ver weg of onzichtbaar is; het tegenovergestelde van nul. Code die een timeout als 0 cm behandelt, laat de robot in een lege kamer in nooodstop gaan.
De mediaan van drie verwijdert de afwijkende waarde die deze sensoren regelmatig produceren. Eén onterechte waarde van 20 cm in open ruimte is genoeg om een robot een bocht de muur in te laten sturen.
Het bundelpatroon eerlijk bekijken
De specificatie noemt 15°, wat klinkt als een smalle zaklampstraal. Dat is het niet; dit is de halve hoek van de hoofdlob en het praktische gevolg is dat de sensor op 1 m een kegel van ongeveer 50 cm breed detecteert.
| Afstand | Geschatte breedte van de kegel |
|---|---|
| 20 cm | ~10 cm |
| 50 cm | ~26 cm |
| 1 m | ~53 cm |
| 2 m | ~105 cm |
De sensor meldt het dichtstbijzijnde object dat zich ergens in die kegel bevindt en zegt niets over de positie binnen de kegel. Daarom detecteert een HC-SR04 een deurpost die hij niet kan lokaliseren en activeert een ver naar opzij staande tafelpoot de robot.
Voor het doorzwerven van een kamer is dat een voordeel; een obstakel is heel moeilijk te missen. Om de afstand tot een bepaald object te meten, is het ongeschikt en wil je een VL53L0X.
Wat hij niet kan zien
Dit volgt uit de natuurkunde, niet uit defecten, en het ontwerpen rond deze grenzen is de taak:
| Oppervlak | Wat er gebeurt | Waarom |
|---|---|---|
| Muur onder meer dan ~45° | Leest ver of niets | Geluid kaatst weg van de ontvanger, zoals licht tegen een spiegel |
| Kussens, gordijnen, foam | Leest niets | Het materiaal absorbeert de puls in plaats van hem te reflecteren |
| Zeer nabije objecten | Leest niets binnen ~2 cm | De ontvanger is nog doof door de zendburst |
| Dunne objecten, bijvoorbeeld een stoelpoot dwars | Gedetecteerd maar verkeerd geplaatst | De kegel is breed; de terugkeer is echt, de richting niet |
| Een andere HC-SR04 in de buurt | Willekeurige uitschieters | Hij hoort de tik van de andere sensor; spreid hun timing |
Een robot die alleen op ultrasone afstandsmeting vertrouwt, duwt uiteindelijk een gordijn voordat iets meegeeft. Daarom is een botsschakelaar de goedkoopste betrouwbare vorm van betrouwbaarheid op de hele robot.
Problemen oplossen
| Symptoom | Waarschijnlijke oorzaak | Oplossing |
|---|---|---|
| Leest altijd 0 | Een timeout als afstand behandelen | Gebruik een herkenningswaarde en behandel “geen echo” expliciet |
| Robot bevriest willekeurig | pulseIn zonder timeout |
Geef een timeout door; 25000 µs dekt het hele bereik |
| Metingen springen wild | Sneller pollen dan ~60 ms | Wacht tot de vorige echo verdwenen is |
| Steeds stabiel maar enkele procenten verkeerd | Temperatuur | Compenseer met de formule voor de geluidssnelheid |
| Werkt op de werktafel, niet op de robot | Motorruis op de 5V-rail | Ontkoppel de voeding van de sensor en houd de draden weg van motorleidingen |
| Twee sensoren storen elkaar | Ze horen elkaar | Activeer ze om de beurt, nooit gelijktijdig |
| ESP32-pin reageert niet meer | Echo van 5 V naar een GPIO voor 3,3 V | Voeg de spanningsdeler toe en controleer of de pin nog werkt |
| Detecteert objecten die niet vooruit liggen | De kegel van 15° | Verwacht; beperk de nuttige hoek mechanisch of gebruik een lasersensor |
HC-SR04 of VL53L0X?
| HC-SR04 | VL53L0X | |
|---|---|---|
| Methode | 40kHz-geluid | Laserlooptijd bij 940 nm |
| Bereik | 2 cm – 4 m | 3 cm – 2 m, in het beste geval tot 4 m |
| Bundel | Halve hoek ~15°; brede kegel | Beeldhoek ~25°, maar effectief een smalle lichtvlek |
| Updatefrequentie | ~16 Hz (cyclus van 60 ms) | Tot 50 Hz |
| Blind voor | Zachte en steil schuine oppervlakken | Donkere matte en spiegelende oppervlakken, fel zonlicht |
| Interface | Twee pinnen, geen bibliotheek nodig | I²C |
| Kosten | ~$2 | ~$5 |
Ze falen bij tegenovergestelde materialen, waardoor de keuze eenvoudig is zodra je de ruimte kent. Sonar ziet een doos met zwarte stof die de laser niet ziet; de laser ziet een glazen deur onder een hoek die sonar niet ziet. Bij een robot die betrouwbaar moet werken, is het eerlijke antwoord vaak beide, plus een botsschakelaar voor wanneer ze allebei fout staan.
Verken de graaf
Gebruikt in deze bouwprojecten
Projecten, leerroutes en simulators waarin de HC-SR04 ultrasone sensor voorkomt.
Vergelijken
Alternatieven
Vragen
FAQ over de HC-SR04 ultrasone sensor
Wat is de HC-SR04 ultrasone sensor?
De HC-SR04 is een betaalbare afstandssensor die meet hoe ver een voorwerp van de sensor ligt door er een korte burst ultrasoon geluid op af te sturen, hetzelfde principe dat vleermuizen en sonar gebruiken. Het is de sensor waarmee de meeste beginnersrobots obstakels detecteren en vermijden.
Hoe werkt de HC-SR04?
Je stuurt een korte puls naar de Trigger-pin. De sensor zendt acht bursts van 40 kHz uit en houdt de Echo-pin hoog totdat de reflectie terugkomt. Je meet hoelang Echo hoog blijft; omdat geluid ongeveer 343 m/s beweegt, is de afstand de tijd maal de geluidssnelheid, gedeeld door twee voor de heen- en terugweg.
Wat is het maximale bereik van de HC-SR04?
De HC-SR04 meet ongeveer 2 cm tot 4 m. Hij is het nauwkeurigst tussen 5 cm en 2 m; bij de grens van 4 m worden de metingen onbetrouwbaar en voorwerpen dichter dan ongeveer 2 cm vallen binnen de blinde vlek en kunnen niet worden gemeten.
Is de HC-SR04 nauwkeurig en betrouwbaar?
Nauwkeurig genoeg voor obstakelvermijding, met rond 3 mm resolutie bij een vlak, hard meetoppervlak dat recht op de sensor gericht staat. Zachte of schuine oppervlakken zijn lastig omdat ze de echo verstrooien, de temperatuur beïnvloedt de meting en de brede bundel van ~15° een kegel meet in plaats van een punt.
Hoe sluit ik een HC-SR04 aan op een Arduino?
Sluit VCC aan op 5 V, GND op aarde, Trigger op een willekeurige digitale uitgangspin en Echo op een digitale ingangspin. Let op één ding: Echo levert 5 V, dus bij een bord van 3,3 V zoals een ESP32 moet je Echo met een spanningsdeler omlaag brengen voordat je hem uitleest.
HC-SR04 of US-100; welke is beter?
De US-100 is een nauw verwante sensor met een temperatuurcompensatiemodus, een seriële interfaceoptie en bedrijf bij 3,3–5 V, waardoor hij nauwkeuriger en geschikter voor 3,3V-borden. De HC-SR04 is goedkoper en heeft meer tutorials. Voor leren volstaat de HC-SR04; voor precisie wint de US-100 net.
Hoe controleer ik of mijn ultrasone sensor werkt?
Print de gemeten afstand naar de seriële monitor en beweeg je hand naar en van de sensor; de waarde moet gelijkmatig volgen. Blijft hij op nul of een maximum staan, controleer dan de bedrading van Trigger en Echo, zorg voor een stabiele 5V-voeding en controleer of je timeout lang genoeg is voor het volledige bereik van 4 m.
Verder lezen