Component · Sensor

VL53L0X ToF-sensor

De VL53L0X meet met een laser in plaats van geluid — een smalle, snelle bundel die millimeternauwkeurig meet via I²C, voor robots die nauwkeurig moeten meten.

Wat het is

De VL53L0X meet afstand net als een laserafstandsmeter—met licht in plaats van geluid. Hij stuurt een onzichtbare infrarode laserimpuls uit en meet met een smalle bundel de looptijd van het licht, wat via I²C een snelle, nauwkeurige meting oplevert. Waar een HC-SR04 met een brede meetkegel meet, is de VL53L0X de keuze voor een nauwkeurige afstandsmeting met een smalle bundel—de sensor die je kiest wanneer “ongeveer hoe ver” niet goed genoeg is.

Diagram met labels van een VL53L0X-looptijdsensor op een breakout-bord: een klein paars bord met in het midden een looptijdcomponent in de behuizing met twee openingen—een ronde laseremitter en een vierkante SPAD-opening—een pijl voor de laserbundel en onderaan een 6-pins stekkerblok (VIN, GND, SCL, SDA, GP1, XSH).
De infrarode laser zendt een puls uit vanaf de emitter en de SPAD-ontvanger meet de looptijd—een nauwkeurige afstandsmeting met een smalle bundel. SVG downloaden

Hoe het werkt

De behuizing bevat twee openingen: een laseremitter en een SPAD-ontvanger (een detector voor losse fotonen). De sensor stuurt een impuls van 940 nm infraroodlicht uit, de ontvanger meet hoe lang het licht nodig heeft voor de heen- en terugweg en—omdat licht een bekende snelheid heeft—wordt die tijd omgerekend naar afstand. Alle tijdmeting vindt op de chip plaats; je microcontroller leest alleen de waarde in millimeters via I²C. De afwegingen tegenover geluid zijn precies de afwegingen in ultrasone versus looptijdsensoren.

Wanneer je hem gebruikt

Kies een VL53L0X wanneer een robot precies en met een smalle bundel moet afstanden:

  • Nabije, exacte afstanden — een specifieke opening beoordelen, op een vaste afstand een muur volgen of precies stoppen.
  • Kleine of dunne obstakels — een tafelpoot of draad die door de brede meetkegel van de ultrasone sensor onscherp wordt gemaakt of helemaal wordt gemist.
  • Snelle regellussen — tot 50 metingen per seconde voor snelle besturing.

Voor goedkope, robuuste detectie van “is er iets vooruit?” over een groter gebied is de HC-SR04 een goede keuze qua prijs en functionaliteit—en de filterideeën in de HC-SR04 uitlezen gelden voor elke afstandsmeetreeks, ook voor een laser.

Aansluiting en aandachtspunten

  • I²C-adresconflicten. Elke VL53L0X deelt één standaardadres—gebruik de XSHUT-pin om ze één voor één uit de reset te halen en adressen opnieuw toe te wijzen als je er meerdere gebruikt.
  • Let op het omgevingslicht. Fel zonlicht (veel infrarood) en donkere of spiegelende oppervlakken verkorten het bruikbare bereik.
  • Houd het raampje schoon. Een vingerafdruk of stof op de opening verstrooit de bundel en verstoort de metingen.
  • Respecteer de ondergrens (~5 cm); zoals elke afstandssensor heeft ook deze een dode zone die te dichtbij ligt om te meten.

Pinindeling

Pin Naam Functie
1 VIN 3–5 V. De breakout verlaagt de ingangsspanning naar 2,8 V voor de sensor
2 GND Ground
3 SCL I²C-klok
4 SDA I²C-data
5 GPIO1 Interrupt-uitgang — activeert wanneer een meting klaar is
6 XSHUT Uitschakelen, actief laag. Trek de pin laag om de sensor volledig uit te schakelen

XSHUT is de pin waarmee meerdere sensoren mogelijk worden en het is belangrijk om dat te begrijpen voordat je de tweede koopt.

Meerdere VL53L0X-sensoren gebruiken

Elke VL53L0X start op hetzelfde adres, 0x29, en er zijn geen adreskeuzepinnen. Zet er twee op één bus, dan antwoorden beide tegelijk en wordt elke transactie verstoord. Het adres kan in software worden gewijzigd, maar de wijziging is vluchtig—hij verdwijnt na elke keer dat de voeding uit- en ingeschakeld wordt.

De standaardoplossing gebruikt XSHUT om ze één voor één uit de reset te halen:

#include <Wire.h>
#include <VL53L0X.h>

const int XSHUT[] = {4, 5, 6};          // one GPIO per sensor
const uint8_t ADDR[] = {0x30, 0x31, 0x32};
VL53L0X sensor[3];

void setup() {
  Wire.begin();

  // 1. Hold every sensor in reset.
  for (int i = 0; i < 3; i++) { pinMode(XSHUT[i], OUTPUT); digitalWrite(XSHUT[i], LOW); }
  delay(10);

  // 2. Release one at a time and give each a new address before the next wakes.
  for (int i = 0; i < 3; i++) {
    digitalWrite(XSHUT[i], HIGH);
    delay(10);
    sensor[i].init();
    sensor[i].setAddress(ADDR[i]);      // now it is off 0x29 and the next can boot
    sensor[i].setTimeout(500);
  }
}

Twee details verrassen mensen: de pinnen moeten voor de reset LOW worden gestuurd en daarna worden losgelaten, en de hele reeks moet opnieuw worden uitgevoerd omdat de adressen niet blijven staan. Sommige breakouts trekken XSHUT via een pull-upweerstand op HIGH, dus de pin simpelweg zwevend laten betekent dat de sensor ingeschakeld blijft.

Tijdbudget voor de meting: de afstelknop voor nauwkeurigheid, snelheid en bereik

De VL53L0X heeft één instelling die belangrijker is dan alle andere, en de meeste voorbeeldcode raakt hem nooit aan. Het tijdbudget voor de meting bepaalt hoe lang de sensor fotonen mag integreren voor één meting, en het is een afweging tussen drie dingen:

Tijdbudget voor de meting Updatefrequentie Typisch bereik Beste voor
20 ms ~50 Hz ~0,8 m Snelle regellussen, korte afstand
33 ms (standaard) ~30 Hz ~1,2 m Algemeen gebruik
66 ms ~15 Hz ~1,7 m Betere nauwkeurigheid op afstand
200 ms ~5 Hz ~2 m Maximale afstand, statische meting
sensor.setMeasurementTimingBudget(20000);   // microseconds

Er zijn daarnaast modi voor groot bereik en hoge nauwkeurigheid die de drempelwaarde voor de signaalsnelheid en de pulsperioden aanpassen. De praktische regel is: bereikt de sensor niet ver genoeg, besteed dan meer tijd voordat je de sensor de schuld geeft. Een tijdbudget voor de meting van 200 ms verdubbelt het bruikbare bereik van een tijdbudget van 20 ms echt.

Minimaal werkende code

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;

void setup() {
  Serial.begin(115200);
  Wire.begin();

  if (!sensor.init()) {
    Serial.println("VL53L0X not found");   // check wiring and XSHUT
    while (1) {}
  }
  sensor.setTimeout(500);
  sensor.setMeasurementTimingBudget(33000);
  sensor.startContinuous();
}

void loop() {
  uint16_t mm = sensor.readRangeContinuousMillimeters();

  if (sensor.timeoutOccurred()) {
    Serial.println("timeout");
  } else if (mm >= 8190) {
    Serial.println("out of range");        // 8190/8191 mean "no valid target"
  } else {
    Serial.println(mm);
  }
  delay(20);
}

8190 en 8191 zijn geen afstanden. Het is de manier waarop de sensor zegt dat hij geen bruikbare reflectie kreeg — er is niets of het meetobject is te donker of te ver weg. Code die 8191 als 8,19 meter behandelt, reageert vreemd in een lege ruimte; code die het als nul behandelt, maakt daar een noodstop van.

Wat hij niet kan zien

De VL53L0X werkt juist slecht op de tegengestelde soorten oppervlakken van een ultrasone sensor, en dat is de volledige basis voor de keuze tussen beide.

Omstandigheid Wat er gebeurt Waarom
Zwarte matte oppervlakken Het bereik daalt sterk, vaak tot een derde Er komt nauwelijks 940 nm-licht terug
Spiegels en gepolijst metaal De gemeten afstand is te groot, of er wordt niets gemeten De bundel kaatst spiegelend terug, zoals licht op glas
Fel direct zonlicht Het bereik neemt sterk af Zonlicht bevat veel 940 nm-infrarood dat de reflectie overstemt
Glas Meet soms het glas, soms wat er erachter ligt, onvoorspelbaar Deelt het licht deels door en kaatst het deels terug
Dichterbij dan ~3–5 cm Onbetrouwbaar Onder de minimale werkafstand van de sensor
Verder dan ~1,2 m bij standaardinstellingen Time-out Verhoog het tijdbudget voor de meting voordat je concludeert dat de sensor defect is

De invloed van zonlicht verdient nadruk, omdat die het meest verrassend is. Een VL53L0X die binnen perfect werkt, kan in een zonnige wintertuin bijna nutteloos zijn, en de uitval is geleidelijk—het bereik wordt korter in plaats van dat de metingen duidelijk verkeerd worden.

Problemen oplossen

Klacht Waarschijnlijke oorzaak Oplossing
init() mislukt Bedrading, of XSHUT laag gehouden Doorzoek de bus op 0x29; controleer of XSHUT HIGH is of via een pull-upweerstand op HIGH staat
Twee sensoren, slechts één werkt Beide op 0x29 Gebruik bij elke start de XSHUT-reeks hierboven
Adressen verdwijnen nadat de voeding is uit- en ingeschakeld Ze zijn bewust vluchtig Voer de adresreeks opnieuw uit in setup()
De gemeten afstand is te groot, of er wordt niets gemeten (8190/8191) Geen bruikbare reflectie Controleer kleur, afstand en omgevingslicht van het meetobject
Bereik veel korter dan 2 m Standaardtijdbudget voor de meting Verhoog het naar 100–200 ms
Werkt binnen, faalt buiten Infrarood uit zonlicht Scherm de sensor af, of gebruik ultrasoon buiten
Metingen drijven over minuten Raam vervuild, of temperatuur Reinig de opening; voer de kalibratie van de sensor uit
Af en toe uitschieters Rand van een meetobject, of gedeeltelijke reflectie Pas een mediaanfilter toe, zoals bij elke afstandssensor

VL53L0X of iets anders?

Onderdeel Bereik Opvallend Kies het wanneer
VL53L0X 5 cm – 2 m Het goedkope, gangbare standaardmodel Nauwkeurige afstandsmeting op korte afstand binnenshuis
VL53L1X 4 cm – 4 m Tweemaal het bereik, programmeerbaar meetgebied Als je meer bereik nodig hebt, of het meetveld softwarematig wilt versmallen
VL6180X 5 mm – 20 cm Zeer kort bereik, meet ook omgevingslicht Spleten detecteren en voorwerpen op korte afstand detecteren
HC-SR04 2 cm – 4 m Geluid, brede kegel, geen bibliotheek nodig Goedkope, robuuste obstakeldetectie; ziet donkere oppervlakken
Sharp GP2Y0A21 10–80 cm Analoge IR-triangulatie, één ADC-pin Geen I²C beschikbaar en een niet-monotone uitgang is acceptabel

De VL53L1X verdient specifieke vermelding: hij is in vrijwel alle opzichten een directe vervanger voor de huidige VL53L0X, en het programmeerbare meetgebied (ROI) laat je het meetveld softwarematig versmallen—in feite stuur je de bundel zonder de sensor te bewegen. Als je vandaag een nieuw model kiest in plaats van te blijven werken met wat je hebt, is hij meestal de betere keuze.

Verken de graaf

Gebruikt in deze bouwprojecten

Projecten, leerroutes en simulators waarin de VL53L0X ToF-sensor voorkomt.

Vergelijken

Alternatieven

Vragen

FAQ over de VL53L0X ToF-sensor

Wat is de maximale afstand van de VL53L0X?

Ongeveer 2 meter in de standaardmodus—sommige borden ruilen updatefrequentie in voor een groter bereik. Hij is het nauwkeurigst op korte afstand, in de nabijheidszone; voorbij een paar meter, of in fel omgevingslicht met veel infrarood, zoals zonlicht, worden de metingen onbetrouwbaar. Hij heeft ook een dode zone onder ongeveer 5 cm.

Wat zijn de beperkingen van de VL53L0X?

Het bereik is kort (~2 m) vergeleken met een ultrasone sensor. Fel zonlicht en donkere of spiegelende oppervlakken verkorten het verder, en elke sensor heeft dezelfde I²C-adres—voor meerdere sensoren heb je de XSHUT-methode nodig om adressen opnieuw toe te wijzen. Houd ook het kleine raampje schoon; stof verstrooit de bundel.

Werkt de VL53L0X op zwarte oppervlakken?

Slecht. Donkere, matte oppervlakken absorberen de infrarode laser, waardoor de reflectie zwak is en het bruikbare bereik sterk daalt—bij een zwart doel komt de gemeten afstand dus veel dichter bij de grens van het bruikbare bereik dan bij een wit doel. Glanzende of spiegelende oppervlakken sturen hem eveneens in de war doordat ze de bundel wegkaatsen.

Wat is de VL53L0X-laserafstandssensor?

Een kleine looptijdsensor die afstand meet met licht in plaats van geluid. Hij stuurt een onzichtbare impuls van 940 nm infraroodlicht uit en meet hoe lang het licht nodig heeft voor de heen- en terugweg. Zo levert hij via I²C een snelle, nauwkeurige meting met een smalle bundel.

Looptijd versus ultrasoon—wat is beter?

Een looptijdsensor zoals de VL53L0X heeft een smalle bundel en is millimeternauwkeurig, waardoor hij een specifiek punt en kleine objecten kan meten die een ultrasone sensor zou missen. De HC-SR04 is goedkoper en heeft een groter bereik; het brede meetgebied van de ultrasone sensor helpt daarbij een obstakel minder snel te missen. Gebruik ToF voor precisie en ultrasoon voor goedkope, robuuste detectie.

Verder lezen

Bronnen