Bekijk de 38 andere Arduino lessen

7 · Afstand meten met de HC-SR04 ultrasoon geluidsensor


Introductie

Benieuwd hoe je een ultrasoon geluidsensor kunt uitlezen? In de deze Nederlandstalige Arduino tutorial voor beginners leg ik je dit precies uit 😃

Lesmateriaal

Onderaan op deze pagina vind je de knop lesmateriaal waarmee je het lesmateriaal kunt downloaden. Dit materiaal bestaat uit de code, schakelschema en andere bestanden die in de les worden gebruikt.

Ultrasoon geluid

Ultrasoon geluid is geluid wat wij als mensen niet kunnen horen. De frequentie is simpelweg te hoog. Er zijn wel dieren die dit geluid kunne horen zoals vleermuizen, honden en dolfijnen. Zo geeft bijvoorbeeld een hondenfluitje een ultrasoon geluid.

HC-SR04 ultrasoon sensor

In deze les maken we gebruik van de HC-SR04 ultrasoon afstandssensor Deze maakt gebruik van ultrasoon geluid om een afstand te bepalen.

HR-SR04 ultrasoon afstandssensor
HR-SR04 ultrasoon afstandssensor

De sensor heeft twee "ogen", ieder gemarkeerd met een letter:

  • T is de zender (Transmitter)
  • R is de ontvanger (Receiver)

Voorwerpen weerkaatsen ultrasoon geluid. Doordat deze sensor geluid kan zenden ontvangen is het mogelijk de afstand te berekenen. Dit doet hij door geluid uit te zenden en vervolgens te meten hoe lang het duurt voordat de ontvanger dit geluid terug hoort. Het is bekend hoeveel afstand geluid in een bepaalde tijd kan afleggen. Op deze manier kunnen we aan de hand van de verstreken tijd tussen zenden en ontvangen, berekenen wat ongeveer de afstand is.

De sensor heeft naast de bekende 5V en GND nog twee speciale pins: Trig en Echo. Als de trigger pin HIGH is begint de HC-SR04 sensor met zenden. De echo pin wordt HIGH als de ontvanger geluid ontvangt.

💡 Het is belangrijk dat we straks de berekende afstand door 2 delen. Het geluid is immers eerst naar het object toegegaan en daarna teruggekaatst. De afstand is dus 2x afgelegd.

De schakeling

HR-SR04 ultrasoon afstandssensor aangesloten op de Arduino
HR-SR04 ultrasoon afstandssensor aangesloten op de Arduino

Druk de HR-SR04 in het breadboard en sluit de volgende jumper wires aan:

  • De 5V op de Arduino -> de linker pin van de sensor
  • De 12 op de Arduino -> de trig pin van de sensor
  • De 8 op de Arduino -> de echo pin van de sensor
  • De GND op de Arduino -> de rechter pin van de sensor

Arduino Code

We beginnen de code met het definiëren van drie variabelen:

1 const int trigPin = 12;
2 const int echoPin = 8;
3 
4 float duration;
5 float distance;
  • trigPin is de pin waarop we de trigger hebben aangesloten
  • echoPin is de pin waarop we de echo hebben aangesloten
  • duration is de verstreken tijd
  • distance is de gemeten afstand

setup()

1 void setup() {
2     Serial.begin(9600);
3     pinMode(trigPin, OUTPUT);
4     pinMode(echoPin, INPUT);
5 }

Als eerste initialiseren we de seriële monitor. Daarna stellen we de trigPin in als uitvoer en de echoPin als invoer.

loop()

1 // Herhaal oneindig
2 void loop() {
3     digitalWrite(trigPin, LOW);
4     delayMicroseconds(2);
5 
6     digitalWrite(trigPin, HIGH);
7     delayMicroseconds(10);
8     digitalWrite(trigPin, LOW);
9 
10     duration = pulseIn(echoPin, HIGH);              
11     distance = (duration * 0.0343) / 2;
12                                      
13     Serial.print("Afstand: ");
14     Serial.println(distance);
15 
16     delay(100);                     
17 }

delayMicroseconds()

In de code zien we een nieuwe functie delayMicroseconds(). Eerder maakte we al gebruik van delay() deze pauzeert een aantal milliseconden. De delayMicroseconds() is nog wat preciezer en pauzeert in microseconden.

Uitleg code

De loop() functie bestaat uit 4 delen:

  • trigPin voorbereiden
  • Meting starten
  • Duur en afstand berekenen
  • Data naar seriële monitor sturen

We beginnen met er zeker van zijn dat trigPin op LOW wordt ingesteld en dus niet aan het zenden is. Hierna kunnen we beginnen om 10 microseconden ultrasoon geluid uit te zenden. Dit doen we door trigPin op HIGH in te stellen en vervolgens met delayMicroseconds() pauzeren. Daarna stoppen we het zenden door de trigPin weer op LOW in te stellen. Het geluid is weggestuurd en nu wachten we totdat het geluid terugkomt.

pulseIn()

De pulseIn() functie is een speciale functie om de lengte van een puls te meten. Deze kan een wisseling van LOW naar HIGH zijn, of omgekeerd. pulseIn() heeft 3 parameters waarvan de laatste optioneel is:

  • pinnummer waar de puls van gelezen wordt
  • het type puls om uit lezen: LOW of HIGH
  • aantal microseconden om te wachten tot de puls start

Als we in onze code kijken dan zien we:

1 pulseIn(echoPin, HIGH);

Dit betekend dat we wachten totdat de echoPin van LOW naar HIGH gaat. Zoals hieronder schematisch is weergegeven:

pulseIn() met Pulsetype HIGH
pulseIn() met Pulsetype HIGH

Zodra deze verandering wordt waargenomen begint het meten van de verstreken tijd. De timer stopt als de waarde weer terug veranderd van HIGH naar LOW.

We kunnen ook het omgekeerde doen:

1 pulseIn(echoPin, LOW);

In dit geval wachten we totdat de pin van HIGH naar LOW veranderd en starten dan de meting.

pulseIn() met Pulsetype LOW
pulseIn() met Pulsetype LOW

Afstand meten

Nu we weten hoe pulseIn() werkt, is onderstaande code makkelijk te begrijpen.

1 duration = pulseIn(echoPin, HIGH);              
2 distance = (duration * 0.0343) / 2;

We beginnen met het meten van hoe lang het geluid onderweg is geweest. Hiervoor zetten we pulseIn() op de echoPin, en wachten totdat het geluid terugkomt. We weten nu de tijd tussen het verzenden en ontvangen van het geluid. Dit slaan we op in duration.

Om de afgelegde afstand te berekenen moeten we eerst de snelheid van het geluid weten. Deze is 343 meter per seconde. Dit gelijk aan 0.000343 meter per microseconde.

We willen echter het aantal centimeters per microseconde weten. Een meter is 100 centimeter. Dus vermenigvuldigen we 0.000343 met 100. Zo komen we op 0.0343 centimeter per seconde.

Omdat het geluid de afstand twee keer aflegd, moeten we deze waarde door 2 delen om de afstand in centimeters te krijgen.

🎓 Met hoeveel hadden we moeten vermenigvuldigen om de afstand in millimeters te krijgen?

Code uploaden naar Arduino

Ons programma is nu klaar om naar de Arduino te worden gestuurd. Open hierna de seriële monitor:

Hulpmiddelen ▸ Seriële monitor

Gemeten afstand weergegeven in seriële monitor
Gemeten afstand weergegeven in seriële monitor

Beweeg nu je hand van de sensor af en naar de sensor toe. Als het goed is zie je de afstand tot je hand in de seriële monitor.

7 · Afstand meten met de HC-SR04 ultrasoon geluidsensor schakelschema

Bas van Dijk

Over Bas on Tech


Mijn naam is Bas van Dijk, ondernemer, freelance frontend developer en maker. Onder de naam "Bas on Tech" bied ik op YouTube videolessen aan over technische onderwerpen zoals Arduino en 3D-printen.

De video’s zijn in het Nederlands met ondertiteling, zodat mensen met een gehoorbeperking ze ook kunnen volgen.

Jaren geleden toen ik mijn eerste Arduino kocht had ik maar één doel: zo snel mogelijk een LCD schermpje aansluiten en er een tekst op laten zien. Na allerlei bronnen te hebben geraadpleegd kwam ik er na veel puzzelen eindelijk uit. Ik was als een kind zo blij met die paar letters op een geel schermpje.

Met Bas on Tech wil ik mijn kennis delen zodat ook anderen deze blijheid kunnen ervaren. Ik heb gekozen voor kort en krachtige YouTube video’s, met een duidelijke vaste opbouw en één onderwerp per video. Daarnaast staan onder elke video links naar de broncode en webshops waar de onderdelen te koop zijn.