Eerst worden drie verschillende methodes besproken om de afstand te meten. Daarna volgt een tabel met alle voor- en nadelen van deze methodes. Vervolgens wordt nog een andere afstandmeter besproken. Sinds kort worden modules geproduceerd die goedkoop, heel klein en gemakkelijk met de Arduino uit te lezen zijn.

Afstanden meten door de "vluchttijd" van licht te meten

De meest nauwkeurige manier om een afstand te meten, is door de tijd te meten die licht erover doet om heen en weer naar het voorwerp te gaan, de zogenaamde "vluchttijd" (Engels: Time of Flight). De lichtsnelheid is immers nauwkeurig bekend en wordt vrijwel niet beïvloed door de aanwezigheid van lucht. Een bijkomend voordeel van deze techniek is dat de hoek waarmee naar het voorwerp gekeken wordt klein is. Hieronder vind je een beschrijving van een aantal populaire afstandsmeters die dit principe gebruiken.
Opmerking: deze sensors gebruiken een infrarood laser van 940 nm. Men stelt dat deze golflengte ongevaarlijk is voor het menselijk oog. Toch kun je beter niet in de sensor kijken als deze aanstaat.

VL53L0X of VL6180X

Meestal heb je alleen de vier rechtse pinnen nodig
Het is bijna onvoorstelbaar dat met zo'n kleine chip (4,4 × 2,4 × 1 mm) een laser puls kan worden uitgezonden, waarvan de tijd tussen uitzending en terugkomst kan worden gemeten. Maar het lukt, zelf bij afstanden van enkele centimeters. Daarmee is dit een van beste afstandsmeters die er voor de Arduino te koop zijn. Omdat de lichtsnelheid in lucht altijd vrijwel exact hetzelfde is, zal de meting goed reproduceerbaar zijn. Het ontwerp is zo, dat de de sensor weinig last heeft van infrarood in de omgeving (bijvoorbeeld van zonlicht). Deze sensor is zo snel dat je er bijna continu mee kunt meten, hetgeen nieuwe toepassingen mogelijk maakt. Om dit apparaat te kunnen programmeren kun je het best een software bibliotheek gebruiken. Er zijn er momenteel twee: vl53l0x-arduino-master (van Pololu) en Adafruit_VL53L0X-master. Beide hebben demo programma's waarmee je de VL53L0X kunt testen. Je kunt bij deze sensor eenvoudig het I²C adres veranderen. Alleen de Adafruit bibliotheek heeft dat geïplementeerd: gewoon initialiseren met het nieuwe adres is genoeg. Het default adres is 0x29, maar elk adres tot 0x7F moet in te stellen zijn. Je moet eventuele andere aangesloten sensoren dan wel uitzetten door XSHUT laag te maken (via een draadje naar GND of via een digitale pin).
Een van de types die ik testte zie je op de foto; deze kost ongeveer 5 euro. Ik heb ook een nog veel kleinere getest. Die werkte ook prima. De bibliotheken voor zowel de Adafruit als de Pololu versie kun je gemakkelijk via Arduino IDE "bibliotheken beheren" menu binnenhalen. Het installeren gaat dan automatisch en je kunt meteen in het menu voorbeelden gaan zoeken naar de VL versie die je hebt. Deze voorbeeldprogramma's werken werken erg goed. De VL6180X geeft je ook de mogelijkheid om het omgevingslicht te meten en dat kun je zelfs omrekenen naar lux.

VL53L1X

Een VL53L1X in werking
De VL53L1X kan meten tot ruim 4 meter. Koop er altijd een op een breakout board, zodat je hem makkelijk kunt aansluiten. Veel breakout boards kun je met 5 volt gebruiken en niet alleen met 3,3 volt. De sensor heeft geavanceerde mogelijkheden, maar die vallen buiten het kader van deze pagina. Om deze sensor te kunnen gebruiken heb je een andere bibliotheek nodig dan bij de hierboven besproken VL53L0X. Er is VL53L1X.h van Pololu en SparkFun_VL53L1X.h. Hierbij krijg je diverse voorbeeldprogramma's. Ik gebruikte beide bibliotheken. Deze doen precies wat ze moeten doen. De sensor is handig in gebruik en het grote bereik geeft vele mogelijkheden. De gemeten afstand is vrij nauwkeurig. Bij sommige modulus is nauwelijks te zien of het (kleine) beschermingsfolie nog op de sensor zit. Haal deze eraf anders krijg je vooral bij grotere afstanden slechte metingen.

TOF10120

OepsDe 10120 aan het werk.
Deze sensor kan tot ca. 2 meter meten. Hij is erg nauwkeurig. Hij is wel iets duurder dan de VL53L0X, maar je krijgt er dan een kabeltje bij en soms een doosje en schroefjes om hem te bevestigen. Je kunt de module gebruiken met een I²C interface, of serieel. De draden zijn van links naar rechts (zie afbeelding hiernaast): groen en blauw: SDA en SCL (voor I²C); wit en geel: TX en RX; rood en zwart: VCC en GND. Je hoeft maar vier pinnen aan te sluiten.
Er is op Internet een voorbeeldprogramma te vinden, waarmee je direct goede resultaten krijgt. Helaas bevat dat programma nogal wat overbodige ballast die het programma bijna 1 kbyte langer maken, maar niet beter. Daarom heb ik een simpele, efficiënte variant gemaakt, die je hieronder kunt zien.
 Klik hier om de sketch te zien 
Dit is een fijne, snelle sensor die erg goed werkt. Als je een robot karretje maakt dan is het erg prettig dat je ver vooruit kunt zien of er obstakels aankomen.

uitvoer
Zoals gezegd heeft de sensor ook een seriële uitgang (TX en RX). Als je verder niets doet dan geeft de module constant de afstand door. Hieronder staat een simpel programma dat dat op je seriële monitor van de Arduino Ide laat zien. Sluit de witte draad aan op pin 2 en de gele op pin 3 van de Arduino.
#include <SoftwareSerial.h>
SoftwareSerial tof(2, 3);
void setup() {
  tof.begin(9600);
  Serial.begin(9600);
}

void loop() {
  if ( tof.available() ) {
    byte X = tof.read();
    Serial.write(X);
  }
}
Op de monitor zie je iets zoals hiernaast.

Met dit voorbeeld kun je niet veel meer doen dan de module testen. Als je meer controle wilt hebben dan is dat mogelijk, maar vrij ingewikkeld. Op de github.com site kun je een voorbeeld vinden, maar ik raad aan om in plaats daarvan gewoon de eerder besproken I²C verbinding te gebruiken.

Afstanden meten door tijdmeting van geluid

De HC-SR04

Afstanden meten met geluid (hier is de sensor gemonteerd op een draaiplateau)
Deze sensor kan volgens de leveranciers tot ca. 4,5 meter meten, maar ik houd het op maximaal iets meer dan 3 meter.
Deze goedkope en daardoor zeer veel gebruikte apparaten werken in principe hetzelfde als de VL53L0X, maar dan met ultrasoon geluid. Dit geluid is onhoorbaar voor mensen. Omdat de geluidssnelheid veel kleiner is dan die van licht, worden minder hoge eisen gesteld aan de elektronica. Het nadeel is dat er minder metingen per seconde gedaan kunnen worden, vooral als grotere afstanden moeten worden gemeten, want de geluidpuls moet eerst heen en weer zijn geweest voor er een resultaat is. Een ander nadeel is dat de geluidssnelheid in lucht niet helemaal constant is. Toch zijn deze apparaatjes best geschikt voor veel Arduino-projecten met robots of zelfrijdende auto's. Hieronder staat een eenvoudig voorbeeldprogramma. Het programma maakt eerst een puls van 10 μs (voorgeschreven door de fabrikant). Hierna genereert de module zelfstandig 8 korte, onhoorbare pulsen. Tegelijkertijd gaat de echopin van laag naar hoog. Zodra de echo aankomt wordt de echopin weer laag. Met de functie pulseIn() kun meten hoe lang de echopin hoog is en daaruit de afstand. Bij pulseIn kun je nog een derde parameter meegeven: de timeOut. Deze is noodzakelijk bij sommige versies van de HC-SR04, die geen ingebouwde timeout hebben. Hij kan ook gebruikt worden om de range te verkleinen, bijvoorbeeld als je veel metingen per seconde wil doen.
 Klik hier om de sketch te zien 

Als je deze module met de ESP2866 wilt gebruiken, sluit dan VCC aan op de 5 volt uitgang van de module, niet op 3,3 volt. Ik heb dit getest met de WeMos D1 mini, met de pinnen D6 en D7 voor trigger en echo. Met 3,3 volt werkt het echt niet.
Let op: bij serieus gebruik van de sensor moet je het programma steeeds laten testen of de sensor (nog) werkt. Een waarde in de buurt van 0,0 duidt op een probleem.

Afstanden meten via reflectie van infrarood licht

Hoewel er vele nadelen aan deze methode zitten werkt deze methode in de praktijk vaak vrij goed. Infrarood afstandsmeters zijn erg goedkoop, maar je kunt ze ook zelf gemakkelijk maken! Kant-en-klare sensoren zijn verkrijgbaar in verschillende bereiken. Hoe groter het bereik hoe groter het stuk dichtbij de sensor dat foutieve waarden geeft. Je moet het gewenste bereik dus nauwkeurig kiezen.
Klik hier voor een uitgebreide beschrijving van IR afstandsmeters, schakelaars en meer.

Voor en nadelen van de verschillende methodes

Tabel 1. Vergelijking methodes voor afstandsmeting
vluchttijd lichtvluchttijd geluidreflectie licht
voordeelnadeelvoordeelnadeelvoordeelnadeel
bijna continu metenweinig metingen per secondebijna continu meten
smalle meethoek (25°)te smalle meethoekbrede meethoekte brede meethoekbrede meethoekte brede meethoek
geen beïnvloedinggeluidssnelheid hangt o.a. af van de temperatuurafhankelijk van reflectie voorwerp
weinig last van zonlichtgeen last van zonlichtonbruikbaar bij zonlicht
vrij groot bereik (< 2m)tamelijk klein bereiktamelijk klein bereik
werkt niet bij helder glaswerkt ook bij glaswerkt niet goed bij glas
I²C interface; adres programmeerbaareigen software of bibliotheek gebruikenmaar één analoge pin nodig
niet zelf te makenmoeilijk zelf te makenmakkelijk zelf te maken
kleine sensorkleine sensorgrote sensor
Je ziet dat een brede meethoek zowel een voor- als een nadeel kan zijn. Met een brede meethoek heb je niet het risico dat je door een te nauwe doorgang wilt rijden. Bij een brede doorgang stop je misschien te snel. Je kunt de meethoek vergroten door de sensor heen en weer te laten draaien. Als je een zelfstandig rijdend karretje wil maken dat altijd op tijd stopt dan zul je minstens twee typen afstandsmeters moeten gebruiken of één met een voelspriet erbij. De hier genoemde nadelen zijn alleen van toepassing als de sensor voor afstandsmeting wordt gebruik. Voor andere toepassingen kan dat heel anders zijn. Zo is de VL53L0X niet geschikt als lijnvolger, maar een infrarood detector juist wel omdat deze zwart bijna niet ziet en wit heel goed.

Proximity sensor, gebaseerd op de APDS-9960 RGB and Gesture Sensor
Getest met de Arduino nano; bibliotheken werken niet met de Lolin D1 mini

Dit is een prachtige sensor... als je hem aan de praat krijgt. Belangrijk is dat je voor VCC 3,3 volt gebruikt en niet 5 volt. Of je voor de andere pinnen ook 3,3 volt moet gebruiken daar zijn de meningen het niet over eens. Ik denk zelf dat dat niet hoeft. Je zou verwachten dat de sensor goed te gebruiken is met bijvoorbeeld de 3,3 Volt Lolin D1 mini, maar alle verderop genoemde bibliotheken werken (nog) niet met deze processor.
Deze sensor is goed te gebruiken als nabijheidssensor, als de precieze afstand er niet toe doet. Het principe is gebaseerd op de reflectie van infrarood licht, dat geeft al aan dat de nauwkeurigheid niet groot is, maar als je alleen botsingen wilt voorkomen dan is er goed mee te werken. De sensor geeft een getal terug tussen 0 en 255. Hoe groter het getal, hoe dichter bij. Bij 255 raak je de sensor zowat aan. De maximale range is ongeveer 10 cm. Omdat deze sensor ook kleuren kan meten en gebaren kan hij interessant zijn. Het proximity gedeelte heeft een correctie voor omgevingslicht, maar of dat goed werkt heb ik nog niet kunnen testen. Het I²C adres is 0x39. Er zijn inmiddels drie bibliotheken voor deze sensor die je rechtstreeks vanuit bibliotheekbeheer kunt downloaden: SparkFun_APDS9960.h, Arduino_APDS9960.h en Adafruit_APDS9960.h. De Arduino bibliotheek geeft een getal terug dat de afstand benadert (dichterbij is een kleiner getal), de andere bibliotheken geven een groter getal als je de sensor nadert.
Als je (een of meer) van deze bibliotheken hebt geïstalleerd dan kun je via het voorbeelden menu voorbeeldprogramma's vinden die goed geschikt zijn om de sensor te testen. De twee andere mogelijkheden die deze sensor biedt (het detecteren van bewegingen en kleur) heb ik ook getest, (nog te doen:) zie hier.