Operácie

ToF senzor vzdialenosti

Z SensorWiki

Balogh: zbytocne sa rozpisujete o Arduine a i2c zbernici, potom mate malo casu na senzor samotny
        v softverovej casti chyba informacia o parametroch ktore nastavujete - napr. co znamena
        time budget 50000 a ako to potom suvisi s hlavnou sluckou?          
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

  1. Arduino UNO PLUS
  • Mikrokontrolér vyvinutý a vyrobený firmou Waveshare, využívajúci ATMEGA328P-AU.
  • Výhody oproti klasickému Arduinu UNO sú, že dokáže využívať 5V aj 3V3 logiku.
  • Využíva Micro USB konektor namiesto USB B.

UNO-PLUS-intro.jpg

Obr. 1: Arduino UNO PLUS
  1. ATMEGA328P-AU
  2. AMS1117-3.3 : 3.3V voltage regulator
  3. NCP1117ST50T3G : 5V voltage regulator
  4. FT232RL : USB to UART convertor
  5. Arduino interface
  6. ICSP interface
  7. MICRO USB connector
  8. Power output header
  9. FT232 pins
  10. DC input : 7V ~ 12V
  11. Reset button
  12. Power indicator
  13. Serial port Rx/Tx indicator
  14. User LED
  15. 500mA fast self-recovery fuse
  16. Power configuration
  17. Bootloader selection switch


  • Rozloženie pinov

UNO-PLUS-PIN.jpg

Obr. 2: Arduino UNO PLUS pinout


2. Time of Flight VL53L1X

VL53L1X je najmodernejším laserovým snímačom, ktorý vylepšuje produktovú radu ST FlightSense ™. Je to najrýchlejší miniatúrny senzor Time of Flight na trhu s presným dosahom do 4 m a rýchlou frekvenciou do 50 Hz.Na rozdiel od bežných IR snímačov využíva najnovšiu technológiu ToF od spoločnosti ST Microelectronics, ktorá umožňuje meranie absolútnej vzdialenosti bez ohľadu na cieľovú farbu a odrazivosť.

  • Využitie TOF senzorov:

ToF kamery sa používajú v asistenčných a bezpečnostných funkciách pre pokročilé automobilové aplikácie, ako je aktívna bezpečnosť chodcov, detekcia kolízií. Kamery poskytujú obraz vzdialenosti v reálnom čase a preto je ľahké sledovať pohyby ľudí. To umožňuje nové interakcie so spotrebiteľskými zariadeniami, ako sú televízory, konzoly ako Xbox a Playstastion. Ďalším použitím týchto kamier je oblasť robotiky: Mobilné roboty môžu veľmi rýchlo vybudovať mapu svojho okolia, čo im umožní vyhnúť sa prekážkam alebo sledovať vedúcu osobu. Keďže výpočet vzdialenosti je jednoduchý, používa sa len malý výpočtový výkon.

En.VL53L1X web.jpg
TOF1.jpg
Obr. 3: ToF VL53L1X
  • Rozloženie pinov a ich vlastnosti
Pinout.jpg
Pin description.jpg
Obr. 4: Pinout ToF VL53L1X
  • základné informácie o senzore:


111.jpg
Obr. 5: VL53L1X Informácie
  • Minimálna meracia vzdialenosť je 4cm. Senzor vie merať aj pod touto hodnotou avšak vzdialenosť nebude presná.
  • Senzor dokáže pracovať v 3 základných meracích módoch :

Vzdialenosti.jpg

  • Režim Long dokáže merať objekty až do vzdialenosti 4m, avšak táto vzdialenosť je vo veľkej miere ovplyvňovaná okolitým svetlom.
  • Režim Short je odolnejší voči okolitému svetlu, ale jeho maximálna vzdialenosť je zvyčajne obmedzená na 1,3 m.


Literatúra:

Analýza

Aby sme boli schopný vôbec získať nejaké informácie zo senzora ToF, musíme poznať princíp fungovania I2C zbernice. I2C je dvojvodičová obojsmerná sériová zbernica, vytvorená firmou PHILIPS SEMICONDUCTORS, určená pre komunikáciu jednočipových procesorov s podriadenými obvodmi (SLAVE). Využíva 2 vodiče SDA a SLC

SDA – slúži pre prenos sériových dát.

SLC – slúži pre prenos hodinového signálu (takty).

Obe linky musia byť pripojené na kladný pól napájacieho napätia prostredníctvom tzv. pull-up rezistorov (jedná sa vlastne o výstup typu otvorený kolektor). Tým je zabezpečená práca liniek SDA a SLC v obidvoch smeroch.

Prenos bitov – V priebehu jedného hodinového cyklu SLC je prenesený práve jeden dátový bit (obr. 6). Dáta privedené na linku SDA musia zostať nemenné po celú dobu taktovania kladného impulzu hodín SLC. Pri SLC=1 sú totiž zmeny SDA chápané ako riadiaci signál.


  • Data transfer protocol senzora VL53L1X :

Data protocol.jpg

Obr. 6: Data Protocol
  • Adresa senzora 0x52:

Device address.jpg

Obr. 7: Adresa senzora
  • Schéma zapojenia senzora a jeho vývodov:

Senzor1111.jpg

Obr. 8: Celková schéma zapojenia


  • Výstup zo senzora je hodnota vzdialenosti v [mm]

Popis riešenia

Po naštudovaní I2C zbernice sme zapojili ToF senzor podľa obrázku č.9 . Kedže senzor už obsahoval na svojej doske pull up rezistory pre SDA a SCL, mohli sme s pokojom na duši prepojiť tieto piny medzi mikrokontrolérom arduino UNO PLUS a senzorom VL53X1L. Napájanie samotného senzora je v rozpätí medzi 2,5V až 3,5 V, práve preto sme aj používali Arduino UNO PLUS kde sa dá prestaviť 5V logika na 3V3 logiku. Pri bližšom skúmaní sme zistili že senzor má na svojej DPS aj napätoví regulátor na 3V3, čo znamená, že sme mohli použiť aj klasické Arduino UNO. Po zapojení snimača sme už mohli získavať hodnotu zo senzora v mm. Ďalej túto hodnotu sme posielali cez sériovú komunikáciu do PC, kde pomocou programu Processing sme vizualizovali túto hodnotu.

Schéma zapojenia snímača

Zapojenie moje 1.jpg
Obr. 9: Prepojenie Arduina a ToF senzora


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. Diagram vyvjovy tof.png

Obr. 10: Diagram zapojenia

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

  • Pre zostrojenie identického merača vzdialenosti stačí pozapájať senzor s arduinom podľa priloženej schémy zapojenia a nahrať kódy do arduina a do programu Processing, po spustení tlačidla Play v Processingu by sa Vám malo otvoriť okienko s obdlžníkom a meranou vzdialenosťou.
  • Výstupom celého nášho projektu je zmeraná vzdialenosť objektu od senzora, ktorú následne vizualizujeme pomocou bieleho obdlžničku, ktorý sa pohybuje zľava doprava na základe zmeranej vzdialenosti. Taktiež vypisujeme aj zmeranú hodnotu nad týmto obdlžničkom.

Vystup senzor ToF.JPG

Obr. 11: Kontrola meranej vzdialenosti polokrajčírskym metrom z Hornbachu

Vystup procesing.png

Obr. 12: Vizualizácia nameranej vzdialenosti



Späť na zoznam projektov...