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.
- 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
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.