Vl53l0x

Uit RobotMC.be
Versie door Jsuijs (overleg | bijdragen) op 27 aug 2018 om 19:10 (Meetopstelling)
(wijz) ← Oudere versie | Huidige versie (wijz) | Nieuwere versie → (wijz)
Ga naar: navigatie, zoeken

Inleiding

STMicroelectronics levert al enige tijd de VL6180x afstandsensor. Dit is een gevanaceerde sensor die volgens het 'Time Of Flight' principe werkt. De ervaringen met deze sensor zijn goed. De sensor lijkt betrouwbaar te werken, relatief ongevoelig voor omgevingslicht. Ten opzichte van de bekende Sharp afstandsensoren heeft deze sensor de volgende voordelen:

  • De sensor meet vanaf 0mm, dus objecten worden niet gemist omdat ze 'te dichtbij' zijn.
  • De sensor heeft een hoge nauwkeurigheid.

Voor hobby robotica heeft deze twee nadelen:

  • De maximale voedingsspanning bedraagt 2.7V, waardoor extra electronica nodig is om de sensor op een 3.3V systeem aan te sluiten.
  • De maximale afstand die deze sensor kan meten is ongeveer 60 cm (1).

Recent heeft STMicroelectronics een nieuwe sensor uitgebracht, de VL53L0x. Functioneel gezien is deze sensor vergelijkbaar met de VL6180x, met als grote verschil de maximale afstand, tot 2 meter. Dit is uiteraard onder ideale omstandigheden (binnenshuis , wit doel en in 'long range' mode). Maar ook onder minder ideale omstandigheden is 40 cm buitenshuis en 70 cm binnenshuis haalbaar volgens de datasheet (p26). Een aantrekkelijke sensor voor (onder andere) hobby robots!

(1) Door de scaling van deze sensor aan te passen, is de maximale afstand geen 20 cm maar 60 cm. Dit gaat ten koste van de resolutie. In de praktijk lijkt het maximum ca 55 cm.

Documentatie

STMicroelectronics stelt de volgende documentatie beschikbaar:

VL53L0X DataSheet

VL53L0X Satellite Data Brief (met schema)

API User Manual

De genoemde datasheet bevat alle gegevens om de sensor te integreren in een ontwerp, inclusief een beschrijving van de I2C interface. De registers van de chip zijn niet in deze datasheet beschreven en ook is niet beschreven hoe je de sensor initialiseert, calibreert en gebruikt. STMicroelectronics heeft ervoor gekozen dit onder te brengen in de API, die te downloaden is van hun website. De API User Manual beschrijft hoe je de API gebruikt.

Deze aanpak geeft je als gebruiker twee opties: je integreert de API in je project of je probeert de functionaliteit te achterhalen door de API te analyseren. De eerste resultaten van de laatste aanpak heb ik hier gevonden en met deze code kan ik de sensor uitlezen met RobotLib op een STM32.

VL53L0X breakout borden

VL53L0X Satellites

Vl53l0x-1.png

In juli 2016 waren de 'VL53L0X Satellites' van STMicroelectronics zelf de enige breakout boards. Het zijn setjes van 2 sensoren voor ongeveer 18 euro. Dit zijn kleine printjes, opgebouwd uit twee delen.

Het bovenste deel bevat de sensor zelf, plus de noodzakelijke weerstanden en condensatoren om deze te laten werken. Alle aansluitingen zijn uitgevoerd naar soldeerpads aan de rand van het printje.

Het onderste deel bevat een 'level shifter' en spanningsregelaar voor 2.8V. Dit deel van de schakeling maakt het mogelijk maakt om de sensor op een 3.3V of 5V systeem aan te sluiten. Hiervoor kan een 10-polige connector worden geïnstalleerd. De level shifter is gebaseerd op een TXS0108E, een '8-Bit Bidirectional Voltage-Level Shifter For Open-Drain And Push-Pull Application'. Op basis van de naam en de gegevens in de datasheet verwacht ik dat dit deze geschikt is om aan te sluiten op een i2c bus met meerdere devices. Dit werkte bij mij echter niet betrouwbaar en ook anderen melden problemen. Het werkt prima als je 1 sensor hebt, maar meerdere op dezelfde bus werkt mogelijk niet.

Gelukkig zijn de twee delen van het board slechts gekoppeld met 0-ohm weerstanden (duidelijk zichtbaar op de foto rechts). Je kunt de level shifter dus eenvoudig loskoppelen en alleen het sensor-deel gebruiken. Het niet gebruikte deel kun je afbreken. Zelf heb ik er een montage gat in geboord om de sensor vast te zetten.

Pololu board

Vl53l0c-3.jpg

In augustus 2016 brengt Pololu een VL53L0X Time-of-Flight Distance Sensor Carrier with Voltage Regulator uitgebracht. Dit carrier board kan - samen met andere slaves - aangesloten worden een I2C bus op 3.3V of 5V. En uiteraard zijn ook de montagegaten niet vergeten. Het maakt gebruik van dit klassieke en bewezen circuit.

Ter ondersteuning heeft Pololu een uitgebreide Arduino Library voor de VL530X gemaakt. Zo te zien hebben ze (bijna) alle functies van de API ontdaan van de complexiteit en overgenomen. Hulde!

CJMCU

Vl53l0x-4.png

In september worden in het verre oosten bordjes met de markinger 'CJMCU' aangeboden. Aan de foto's te zien zijn dit copieen van de satellites van STM, echter zonder de 0-ohm weerstanden. Ik heb nog geen ervaring met dit board, maar hou er rekening mee dat ze, net als de satellites, niet betrouwbaar samenwerken met andere i2c slaves. Uiteraard kan dit worden opgelost door de TXS0108E te verwijderen en draden op de pads aan te sluiten. Hou rekening met enig priegelwerk.

Meerdere sensoren op 1 bus

De sensor heeft standaard I2C adres 0x29 en in de API staat, zonder verdere toelichting, dat de gebruiker dit I2C adres kan aanpassen. Het blijkt dat deze aanpassing tijdelijk is: het nieuwe adres is direct actief en blijft actief totdat de sensor wordt uitgeschakeld. Er is dus meer nodig om meerdere sensoren op een enkele bus te laten werken.

Vl53l0c-2.png

Naast de aansluiting op de I2C bus is per sensor een IO lijn nodig om de shutdown pin aan te sturen. Na reset wordt van alle sensoren - op 1 na - de shutdown pin laag gemaakt. Dit kan met een IO lijn, maar in dit geval heb ik gebruik gemaakt van een i2c IO expander.

Hierdoor is slechts 1 sensor actief en van deze sensor kan nu het I2C slave adres worden gewijzigd. Vervolgens wordt de tweede sensor actief gemaakt en kan ook hiervan het adres worden gewijzigd. Het adres van de laatste sensor hoeft niet gewijzigd te worden.

Let op: zorg dat de sensor actief blijft (shutdown pin hoog) nadat het adres is veranderd. Na shutdown heeft de sensor weer het default adres.

Resultaten

Onderstaande grafiek geeft de output van 4 sensoren. Sensoren 2 en 3 staan op 15mm van de het doel en met name sensor 2 geeft dit goed weer (met 13.4 mm offset van de trendline). Sensor 3 geeft - met name aan het begin - te lage waarden. Sensoren 1 en 4 staan op 34mm van het doel en dat is precies de beginwaarde van Sensor 4. Vl53l0c-4.png

In de grafiek zijn duidelijk de kleine verschillen zichtbaar, maar een gemiddelde afwijking van 6mm op 30 cm (van -7 tot 20mm) is niet slecht. Wat wel opvallend is, is dat de spreiding van van sensor 3 groter is dan de ander sensoren. Wellicht (waarschijnlijk? hopelijk!) wordt dit veroorzaakt doordat de sensor niet volledig is geïnitialiseerd en de calibratiedata nog niet is geladen.

Na calibratie (volgens de library van Pololu) zijn de resultaten als volgt:

Vl53l0c-5.png

Bovenstaande meting is gedaan op een aluminium achtergrond. Op een wit papier zijn de resultaten als volgt:

Vl53l0c-6.png

Alle voorgaande metingen zijn uitgevoerd op 3.3V. De nominale spanning van de sensor is echter 2.7 en hierop is de sensor ook gecalibreerd. Daarom ter afsluiting hieronder een meting op 2.7V.

Vl53l0c-7.png

Meetopstelling

Hierboven staan 4 grafieken van de tientallen die gemaakt zijn. De meeste grafieken hebben een bereik van 300 mm met 4x30 metingen om de 2 mm. Kortom, zo'n 18.000 metingen per grafiek. Hiervoor is onderstaande opstelling gebruikt.

Vl53l0c-8.jpg

De robot rechts voert de metingen uit. De gewenste positie van het doel (aluminium plaat links) wordt via i2c doorgegeven aan een Arduino mini pro die de stappenmotor aanstuurt. Bovenop de makerbeam constructie zijn twee sensoren gemonteerd, samen met het circuit dat meerdere sensoren op de bus mogelijk maakt.

Update

Na voorgaande 'laboratorium' testen is de sensor in de praktijk gebruikt, in eerste instantie om wanden te detecteren in de roborama baan. De sensor werkte hierbij volgens verwachting. Bij een tweetal experimenten waren de resultaten toch anders dan verwacht.

Omgeving in kaart brengen

Een sensor met grote nauwkeurigheid en bereik lijkt een goed alternatief voor de - veel duurdere - roterende lidars. De resultaten van de eerste test vielen echter tegen: op bepaalde plaatsen werden punten gedetecteerd die er niet waren. Nader onderzoek leerde het volgende:

  • De openingshoek van de sensor is groot, ruwweg 30 graden (geschat op basis van de meetresultaten). Als de sensor in een richting meet zonder obstakel, zal het reflecties rapporteren die tot 15 graden van de richting afwijken.
  • De meettijd is relatief lang (ten opzichte van een roterende lidar). Als de robot snel draait, geeft dit een verdere verdraaiing van obstakel tot de robothoek op moment van meting.
  • Bij matige reflectie is de gemeten afstand minder stabiel (meer ruis). Een 3-waarden median filter is een effectieve manier om dit te onderdrukken. Dit filter geeft echter twee maal een waarde af al is er geen object meer in beeld.

Samengevat: door de openingshoek, de meettijd en de vertraging van het door mij gebruikte filter kan de omgeving alleen met een lage rotatie in kaart worden gebracht.

Blikken detecteren

Buiten wanden detecteren zijn ook de plaatsen van blikken interessant voor ons. Tot een afstand van ongeveer 60 cm gaat dit in de meeste gevallen goed. Niet tot anderhalve meter en niet altijd, dus reden voor een volgend onderzoek:

  • De afstanden voor blikken liggen aanzienlijk lager dan die voor de witte wanden: 50 cm als de sensor op 10 cm hoogte zit en een kleine 60 cm als de sensor op 7 cm hoog is opgesteld. Waarom is niet duidelijk, maar het heeft ongetwijfeld met reflectie van de laser te maken. Mogelijk komt dit door de kleur van de blikken, de ronde vorm of de kleine opervlakte.
  • De sensor detecteert ook onregelmatigheden op de vloer. Hiervoor een test uitgevoerd met een witte strip van zo'n anderhalve cm hoog. Als de sensor op 7 cm hoogte wordt gemonteerd, wordt de stip gedetecteerd vanaf 30 cm afstand. Met een sensorhoogte van 9 cm is de strip vanaf 45 cm zichtbaar.

Als de sensor op 10 cm hoogte wordt gemonteerd, zijn in de test geen reflecties meer zichtbaar.

De grote vraag is natuurlijk of deze testen representatief zijn voor de situatie bij de gemiddelde roborama wedstrijd of op de gemiddelde team building day. Wat zijn dan de obstakels en wat doet het (zon) licht?

De praktijk zal het leren.

Joep