Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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:

Zapojení senzoru vzdálenosti VL53L0X do Arduino - Arduino - Hardware

Zdroj: Adafruit

Výsledný projekt vypadá takto:

Senzor vzdálenosti VL53L0X a Arduino - Arduino - Hardware

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:

Graf měření rychlosti s Arduino - Arduino - Hardware

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.


 

Předchozí článek
Arduino - Měření vzdálenosti ultrasonickým modulem HC-SR04
Všechny články v sekci
Arduino - Hardware
Přeskočit článek
(nedoporučujeme)
Arduino - Měření teploty a vlhkosti čidlem DHT11
Článek pro vás napsal michal
Avatar
Uživatelské hodnocení:
6 hlasů
Autor sa venuje vzdelávaniu a má rad novinky vo vzdelávani.
Aktivity