ToF senzor vzdialenosti
Zo stránky SensorWiki
| Autori: | Matúš Hutár , Matej Kubala | |
| Študijný odbor: | Aplikovaná mechatronika | 1. Ing. Letný semester (2019) | 
Zadanie
- Úlohou je naštudovať princíp senzora ToF ( Time of Flight), presnejšie senzor VL53L1X.
 - Vyčítať z neho potrebné dáta na určenie vzdialenosti a následne vytvoriť vizualizačnú aplikáciu.
 
Hardware
Literatúra:
Analýza
V tejto časti popíšete ako idete daný problém riešiť. Uvediete sem aj všetky potrebné technické údaje, ktoré sú potrebné na úspešné vyriešenie projektu. Napríklad:
- popis komunikačnej zbernice (i2c, 1-wire, RS-232 a pod.)
 - obrázok zapojenia vývodov použitej súčiastky
 - odkaz na katalógový list
 - priebehy dôležitých signálov
 - este jedna polozka
 
Popis riešenia
Sem opíšete ako konkrétne ste problém vyriešili. Začnite popisom pripojenia k procesoru (nezabudnite na schému zapojenia!) a zdôraznite ktoré jeho periférie ste pritom využili.
Pozn.: Názov obrázku musí byť jedinečný, uvedomte si, že Obr1.jpg už pred vami skúsilo nahrať už aspoň 10 študentov.

Algoritmus a program
Algoritmus je rozdelený do niekoľkých krokov. V prvom rade je nutné vyčítať hodnoty vzdialenosti z ToF senzoru a následne ich posielať do počítača po sériovej linke. Táto časť je realizovaná v Arduino, pričom na programovanie sme využili jazyk Wiring v programovacom prostredí Arduino IDE verzie 1.8.8. Druhá časť spočíva v čítaní prichádzajúcich údajov zo sériovej linky a adekvátne zobrazovanie týchto údajov. Táto časť je realizovaná v počítači, pročom na programovanie sme využili jazyk Processing a programovacie prostredie Processing 3.5.3.
Pre lepšie pochopenie komunikačných kanálov uvádzame jednoduchý diagram.
Samtotný program pre Adruino sa skladá z inicializácie objektu senzora a nastavenie potrebných parametrov pre tento objekt a tiež inicializácie I2C a sériovej komunikácie. V nekonečnom cykle sa nachádza vyčítanie hodnoty vzdialenosti zo senzora a posielanie tejto hodnoty po sériovej linke.
VL53L1X sensor;                               // definovanie objektu senzora
void setup()
{
  Serial.begin(115200);                      //inicializacia seriovej komunikacie
  Wire.begin();                              // inicializacia I2C komunikacie
  Wire.setClock(400000);                     // nastavenie frekvencie 400 kHz pre I2C
  if (!sensor.init())                        // inicializacia senzora
  {
    // neuspesna inicializacia sa prejavy chybovym hlasenim
    Serial.println("Failed to detect and initialize sensor!");
    while (1);
  }
  
  sensor.setDistanceMode(VL53L1X::Long);     // nastavenie modu "rozsahu merania"
  sensor.setMeasurementTimingBudget(50000);  // nastavenie casoveho rozostupu merani
  sensor.setAddress(0x29);                   // nastavenie I2C adresy senzora
  sensor.startContinuous(50);                // zacatie merania v intervale kazdych 50 ms
}
void loop()
{
  int x = sensor.read();                    // inicializacia premennej pre uchovanie vycitanej hodnoty (int)
  Serial.println(x);                        // posielanie vycitanej hodnoty cez seriovu linku
}
Programová časť pre zobrazovanie údajov v počítači pozostáva z definovania obrazovky na vykresľovanie a inicializácie sériového portu. Vo funkcii 'serialEvent' sa nachádzajú príkazy, ktoré sa vykonajú vždy, keď sa objaví nová hodnota na sériovom porte. Sú tu príkazy na rozpoznanie prichádzajúcich znakov a prevod týchto znakov na číslo, ktoré reprezentuje prečítanú vzdialenosť zo senzora. Nakoniec sa vo funkcii 'draw' vykresluje aktuálne číslo, teda vzdialenosť, ako aj jeho grafická reprezentácia v podobe polohy bieleho obdĺžnika.
Z uvedeného uvádzame ukážku prevodu znakov na samotné číslo.
void serialEvent(Serial port) {
  count++;                                                  // zvysenie pomocnej hodnoty o 1
  myChar = port.readChar();                                 // vycitanie aktualneho znaku zo serioveho portu
  x=Character.getNumericValue(myChar);                      // zmena char -> int aktualneho znaku
  if (x == -1){                                             // ak prichadzajuci znak nie je ciselna hodnota  (je to napr "/n")
    count = 0;                                              // resetovanie pomocnej premennej
    println(cislo);                                         // vypis cisla do konzoly
    cislo = 0;                                              // vynulovanie cisla
  }
  
  // v tejto podmienke sa z jednotlivych cifier cisla stane samotne cislo
  
  if (count != 0) {
      cislo = cislo+x;
      cislo = cislo*10;
  }
  
  //  v tejto podmienke sa zmapuje aktualna hodnota cisla do intervali 0-1
  //  na nasledne graficke zobrazenie
  
  if ((cislo != 0) && (count == 0)){
    x_maped=map(cislo,0,2200,0,1);
  }
}
Zdrojový kód: tof_arduino.ino a tof_processing.pde
Overenie
Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí, ako sa prejavuje a aké má užívateľské rozhranie (čo treba stlačiť, čo sa kde zobrazuje). Ak ste namerali nejaké signály, sem s nimi. Ak je výsledkom nejaký údaj na displeji, odfotografujte ho.
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
