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
- 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.
- Obr. 1: Arduino UNO PLUS
- ATMEGA328P-AU
- AMS1117-3.3 : 3.3V voltage regulator
- NCP1117ST50T3G : 5V voltage regulator
- FT232RL : USB to UART convertor
- Arduino interface
- ICSP interface
- MICRO USB connector
- Power output header
- FT232 pins
- DC input : 7V ~ 12V
- Reset button
- Power indicator
- Serial port Rx/Tx indicator
- User LED
- 500mA fast self-recovery fuse
- Power configuration
- Bootloader selection switch
- Rozloženie pinov
- 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.
- Obr. 3: ToF VL53L1X
- Rozloženie pinov a ich vlastnosti
- Obr. 4: Pinout ToF VL53L1X
- základné informácie o senzore:
- Obr. 5: VL53L1X Informácie
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. 2). 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 :
- Obr. 6: Data Protocol
- Adresa senzora 0x52:
- Obr. 7: Adresa senzora
- Schéma zapojenia senzora a jeho vývodov:
- 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 aurduino 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
- 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.
- 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 obdĺžničku, ktorý sa pohybuje zľava doprava na základe zmeranej vzdialenosti. Taktiež vypisujeme aj zmeranú hodnotu nad týmto obdlžníčkom.