Arduino - Infračervený senzor vzdialenosti VL53L0X
V minulej lekcii, Arduino a práca s tlačidlami - Knižnica , sme vytvorili OOP knižnicu pre prácu s tlačidlom pre pohodlné znovu-používaní kódu v Arduino projektoch.
Vzdialenosť sme už pomocou Arduino merali a to ultrazvukovým modulom HC-SR04. Dnes to skúsime pomocou senzora VL53L0X, ktorý funguje na princípe TOF (z anglického Time of Flight). Je založený na základe času letu svetelného lúča. V závere článku si potom vysvetlíme výhody a nevýhody využitia zvukové vlny vs. svetelného lúča.
Špecifikácia
Čo udáva výrobca?
Rozsah meranej vzdialenosti | 50 mm - 1200 mm |
---|---|
Presnosť merania v závislosti na farbe povrchu | 3% - 12% |
komunikácia | Aj 2 C |
- Farba povrchu - Tmavšie povrchy horšie odrážajú svetlo a tým sa zhoršujú podmienky pre detekciu odrazeného lúča.
- Infračervené žiarenie - Pretože senzor vysiela svetlo s vlnovou dĺžkou 900 nm, viac infračerveného svetla spôsobuje väčšie odchýlku.
- Doba merania - Defaultný nastavenie pracuje s časom 33 ms. Softvérovo môžeme meniť čas a tým zvýšiť prenos na úkor frekvencie meraní.
Princíp merania
Ako asi tušíte, svetelný lúč vyslaný zo senzora sa odrazí od nejakej prekážky a vráti sa späť k senzoru za určitý čas. Pretože poznáme rýchlosť svetla vo vzduchu, vieme vypočítať aj vzdialenosť. Svetlo sa šíri vo vákuu rýchlosťou 299 792 458 m / s, pre bežné podmienky doma môžeme rýchlosť približne určiť na hodnotu 300 000 000 m / s. Vzdialenosť sa vypočíta podľa jednoduchého vzťahu:
vzdialenosť = rýchlosť x čas / 2
(Delíme 2, pretože svetelný lúč prejde vzdialenosť dvakrát, tam a späť). 1 meter tak svetlo prekoná približne za 3.33 nanosekúnd (9 poriadkov), preto je senzor vybavený presným meraním času, rádovo s presnosťou až na pikosekundy (12 poriadkov).
Zapojenie senzora
Senzor komunikuje pomocou I 2 C protokolu a stačí zapojiť piny
SCL
(A5
) a SDA
(A4
) a
napájanie. Napájacie pin VIN
pripojíme k 3-5 V na Arduino a
prepojíme zeme (GND
):
Zdroj: Adafruit
Výsledný projekt vyzerá takto:
Kód
Ku sprevádzkovanie senzora odporúčam stiahnuť knižnicu
Adafruit_VL53L0X.h
od Adafruitu:
Inicializácia
Najprv načítame knižnicu a inicializujeme senzor:
#include "Adafruit_VL53L0X.h"
Adafruit_VL53L0X lox = Adafruit_VL53L0X();
setup()
V setup()
vykonáme inicializáciu komunikácie a počkáme na
USB:
Serial.begin(115200); while (!Serial) { delay(1); }
Následne zahájime komunikáciu so senzorom. Funkcia
lox.begin()
vráti false
ak monitor sériového portu
vypíše chybu:
if (!lox.begin()) { Serial.println(F("Failed to boot VL53L0X")); while(1); }
loop()
V loop()
slučke máme potom meranie ošetrené podmienkou,
ktorá vyhodnotí chybu v prípade, že nameraná vzdialenosť prekročí
povolený rozsah:
VL53L0X_RangingMeasurementData_t measure; Serial.print("Reading a measurement..."); lox.rangingTest(&measure, false); // pro výpis debug informací předáme true if (measure.RangeStatus != 4) { // úspěch Serial.print("Distance (mm): "); Serial.println(measure.RangeMilliMeter); } else { Serial.println(" out of range "); } delay(100);
Celý kód pre skopírovanie
Pre istotu si teraz uveďme kompletný zdrojový kód:
#include "Adafruit_VL53L0X.h" Adafruit_VL53L0X lox = Adafruit_VL53L0X(); void setup() { Serial.begin(115200); while (! Serial) { delay(1); } Serial.println("Adafruit VL53L0X test"); if (!lox.begin()) { Serial.println(F("Failed to boot VL53L0X")); while(1); } Serial.println(F("VL53L0X API Simple Ranging example\n\n")); } void loop() { VL53L0X_RangingMeasurementData_t measure; Serial.print("Reading a measurement... "); lox.rangingTest(&measure, false); // pro výpis debug informací předáme true if (measure.RangeStatus != 4) { // úspěch Serial.print("Distance (mm): "); Serial.println(measure.RangeMilliMeter); } else { Serial.println(" out of range "); } delay(100); }
Meranie
Pomocou Arduino Uno sa mi podarilo namerať hodnoty každých približne 40 ms (interval merania), čo predurčuje senzor na využitie v jednoduchých projektoch ako je detekcia prekážky, pásové dopravníky a pod. Odskúšal som si meranie vzdialenosti padajúce knihy zo stola. Na určenie napr. Polohy a rýchlosti je senzor vhodný, ale určenie gravitačného zrýchlenia sa mi nepodarilo realizovať. Z grafu je vidieť, že na začiatku bola kniha vo vzdialenosti 50 cm a potom padala približne 0.5 sekundy. Za tú dobu rýchlosť dosiahla maximum približne 2 m / s, meranie som opakoval dvakrát.
Porovnaní s ultrazvukovým senzorom HC-SR04
A ako je to teda oproti ultrasonickému senzora?
Ultrazvukový senzor využíva pre meranie vzdialenosti zvukové vlny, ktoré sa odrazí od prekážky späť do senzora. Nevýhodou tohto senzora je závislosť rýchlosti zvuku na teplote vzduchu. Rýchlosť zvuku sa mení s teplotou približne 0.6 m / s na 1 ° C. Tento nedostatok sa samozrejme dá upraviť pridaním snímače teploty a softvérovú kalibráciou, čo je ale komplikácie.
Výhody sonického senzora
Ultrazvukový senzor má výhodu v tom, že presnosť merania neovplyvňuje farba a druh prekážky. Zvuk sa odrazí rovnako dobre od bieleho či čierneho povrchu. U infračerveného senzora sa vo väčších vzdialenostiach prejaví chyba merania viac (3-12% z meranej vzdialenosti). Preto je ultrazvukový senzor vhodnejšie pre meranie väčších vzdialeností, ako je napr. Parkovací senzor pri aute. Rozlíšenie je softvérovo upravené, u ultrazvukového 1 cm (výrobca senzora udáva až 0.3 cm).
Výhody svetelného senzora
Infračervený senzor je veľkosťou o niečo menšia oproti ultrazvukovému. Hodí sa na meranie vzdialenosti, napr. Pre výukové projekty s robotickými hračkami. Rozlíšenie infračerveného senzora je 1 mm.
Cenovo sú obaja senzory porovnateľné, cena za ultrazvukový senzor je približne 25 Sk, za infračervený 60 Sk.