Lekce 14 - Arduino - Měření vzdálenosti infračerveným senzorem VL53L0X
V minulé lekci, Arduino - Měření vzdálenosti ultrasonickým modulem HC-SR04, jsme pomocí Arduina měřili vzdálenosti ultrasonickým modulem HC-SR04, který jsme si popsali, zapojili a naprogramovali.
Vzdálenost jsme již v našem Arduino tutoriálu měřili ultrazvukovým modulem HC-SR04. Dnes to zkusíme pomocí senzoru VL53L0X, který funguje na principu TOF (z anglického Time of Flight). Je založený na základě času letu světelného paprsku. V závěru článku si pak vysvětlíme výhody a nevýhody využití zvukové vlny vs. světelného paprsku.
Specifikace VL53L0X
Začneme tím, že se podíváme na údaje, které k senzoru uvádí výrobce:
Rozsah měřené vzdálenosti | 50 mm - 1200 mm |
Přesnost měření v závislosti na barvě povrchu | 3 % - 12 % |
Komunikace | I2 C |
Na přesnost měření vzdálenosti pomocí světelného paprsku má pak vliv:
- Barva povrchu - Tmavší povrchy hůře odrážejí světlo, tím se zhoršují podmínky pro detekci odraženého paprsku.
- Infračervené záření - Protože senzor vysílá světlo o vlnové délce 900 nm, více infračerveného světla způsobuje větší odchylku.
- Doba měření - Defaultní nastavení pracuje s časem 33 ms. Softwarově můžeme měnit čas a zvýšit přenos na úkor frekvence měření.
Princip měření
Jak asi tušíme, světelný paprsek vyslaný ze senzoru se odrazí od nějaké překážky a vrátí se zpět k senzoru za určitý čas. Protože známe rychlost světla ve vzduchu, umíme vypočítat i vzdálenost. Světlo se šíří ve vakuu rychlostí 299 792 458 m/s, pro běžné podmínky doma můžeme rychlost aproximovat na hodnotu 300 000 000 m/s. Vzdálenost se vypočítá podle jednoduchého vztahu:
vzdálenost = rychlost x čas / 2
Výsledek dělíme dvěma, protože světelný paprsek projde vzdálenost dvakrát, tam a zpět. Jeden metr tak světlo překoná přibližně za 3.33 nanosekund (9 řádů), proto je senzor vybaven přesným měřením času, řádově s přesností až na pikosekundy (12 řádů).
Projekt se senzorem VL53L0X
Pojďme se pustit do přípravy projektu. Tinkercad bohužel použitý senzor nemá v nabídce komponent, dnes tedy budeme tvořit reálný projekt.
Zapojení senzoru
Zapojení senzoru je celkem jednoduché. Senzor komunikuje pomocí I2C protokolu a stačí zapojit pin SCL na pin A5 a pin SDA na pin A4. Napájecí pin VIN připojíme k 3-5 V na Arduinu a propojíme uzemnění GND:
Zdroj: Adafruit
Výsledný projekt vypadá takto:
Program projektu
Ke zprovoznění senzoru si budeme muset stáhnout knihovnu Adafruit_VL53L0X od Adafruitu.
Inicializace
Nejprve načteme knihovnu a inicializujeme senzor:
#include "Adafruit_VL53L0X.h"
Adafruit_VL53L0X lox = Adafruit_VL53L0X();
Funkce setup()
Ve funkci setup()
nejprve provedeme inicializaci komunikace a
počkáme na USB:
void setup() { Serial.begin(115200); while (!Serial) { delay(1); } // Sem dopíšeme podmínku }
Následně zahájíme komunikaci se senzorem. Funkce lox.begin()
vrátí false
, pokud monitor sériového portu vypíše chybu:
if (!lox.begin()) { Serial.println(F("Failed to boot VL53L0X")); while(1); } Serial.println(F("VL53L0X API Simple Ranging example\n\n"));
Hlavní smyčka
V loop()
smyčce máme pak měření ošetřené podmínkou,
která vyhodí chybu v případě, že naměřená vzdálenost překročí
povolený rozsah:
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); }
Celý kód pro zkopírování
Pro jistotu si nyní 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); }
Výsledky měření
Pomocí Arduino Uno se mi podařilo naměřit hodnoty každých přibližně 40 ms (interval měření), což předurčuje senzor k využití v jednoduchých projektech, jako je detekce překážky, pásové dopravníky apod. Odzkoušel jsem si měření vzdálenosti padající knihy ze stolu. K určení např. polohy a rychlosti je senzor vhodný, ale určení gravitačního zrychlení se mi nepodařilo realizovat.
Z grafu je vidět, že na začátku byla kniha ve vzdálenosti 50 cm, pak padala přibližně 0.5 sekundy. Za tu dobu rychlost dosáhla maxima přibližně 2 m/s, měření jsem opakoval dvakrát:
Porovnání s ultrazvukovým měřením
A jak je to tedy oproti ultrasonickému senzoru?
Ultrazvukový senzor využívá pro měření vzdálenosti zvukové vlny, které se odrazí od překážky zpět do senzoru. Nevýhodou tohoto senzoru je závislost rychlosti zvuku na teplotě vzduchu. Rychlost zvuku se mění s teplotou přibližně 0.6 m/s na 1°C. Tento nedostatek se samozřejmě dá upravit přidáním čidla teploty a softwarovou kalibrací, což je ale komplikace.
Výhody sonického senzoru
Ultrazvukový senzor má výhodu v tom, že přesnost měření neovlivňuje barva a druh překážky. Zvuk se odrazí stejně dobře od bílého či černého povrchu. U infračerveného senzoru se ve větších vzdálenostech projeví chyba měření více (3-12 % z měřené vzdálenosti). Proto je ultrazvukový senzor vhodnější pro měření větších vzdáleností, jako je např. parkovací senzor u auta. Rozlišení je softwarově upravené, u ultrazvukového 1 cm (výrobce senzoru udává až 0,3 cm).
Výhody světelného senzoru
Infračervený senzor je velikostí o něco menší oproti ultrazvukovému. Hodí se pro přesnější měření kratších vzdáleností, např. pro výukové projekty s robotickými hračkami. Rozlišení infračerveného senzoru je 1 mm.
Cenově jsou oba senzory srovnatelné, cena za ultrazvukový senzor je přibližně 25 Kč, za infračervený 60 Kč.
V příští lekci, Arduino - Měření teploty a vlhkosti čidlem DHT11, se budeme zabývat měřením teploty a vlhkosti. Ukážeme si čidlo DHT11 a řekneme si, jak jej zapojit a naprogramovat.