====== Ultrazvukové měření vzdálenosti ====== ===== Zadání ===== Navrhněte zařízení pro měření vzdálenosti s modulem [[https://cdn.sparkfun.com/datasheets/Sensors/Proximity/HCSR04.pdf|HC-SR04]]. Implementujte korekci [[https://cs.wikipedia.org/wiki/Rychlost_zvuku|rychlosti zvuku]] v závoslosti na teplotě okolí s využitím vnitřního teplotního čidla mikrokontroléru. Dle potřeby doplňte číslicovou filtraci výsledků. ---- ===== Hardware ===== ==== HC-SR04 ==== Ultrazvukový modul [[https://cdn.sparkfun.com/datasheets/Sensors/Proximity/HCSR04.pdf|HC-SR04]] umožňuje bezkontaktní měření vzdálenosti v rozsahu 2cm - 400cm s přesností dosahující 3mm. Modul obsahuje ultrazvukový vysílač, přijímač a řídící obvod. Spuštění měření se provádí převedením 10us řídícího pulzu. Modul automaticky vyšle osm 40kHz pulzů a následně detekuje odražené pulzy. Po detekci modul předá informaci o délce trvání návratu vyslaných pulzů v podobě vysoké úrovně o stejné délce trvání jako návrat pulzů na výstup. Z doby trvání a z rychlosti zvuku poté vypočítáme výslednou vzdálenost. {{ :2016:hcsr04.jpg?400 |https://microcontrollerelectronics.com/distance-sensing/}} Obr.1 Modul HC-SR04 ==== BOSCH BMP180 ==== Protože na použité vývojové desce chybí senzor teploty byl použit senzor externí. Pro tento účel byl použit modul se senzorem [[https://www.bosch-sensortec.com/bst/products/all_products/bmp180|BOSCH BMP180]]. Tento modul dokáže měřit jak teplotu, tak i barometrický tlak. Měření barometrického tlaku se dá využít například k měření vertikálního stoupání. Naměřené údaje o teplotě a barometrickém tlaku jsou poté posílány přes I2C sběrnici. Tento modul dosahuje přesnosti až na 1°C. {{ :2016:boschbmp180.jpg?200 |http://www.chinalctech.com/index.php?_m=mod_product&_a=view&p_id=686}} Obr.2 Modul BOSCH BMP180 ==== FRDM-KL25Z ==== Jako řídící obvod byl použit vývojový kit [[http://www.nxp.com/products/software-and-tools/hardware-development-tools/freedom-development-boards/freedom-development-platform-for-kinetis-kl14-kl15-kl24-kl25-mcus:FRDM-KL25Z?fsrch=1&sr=1&pageNum=1|FRDM-KL25Z]] od firmy NXP, na kterém je osazen 32-bitový mikrokontrolér Kinetis MKL25Z128 od firmy Freescale Semiconductor. Takt tohoto mikrokontroléru je 48 MHz. Tento mikrokontrolér je také použit pro komunikaci s počítačem. {{ :2016:xfrdm-kl25z_headers2.png.pagespeed.ic.altgnczqq9_1_.jpg?800 |https://developer.mbed.org/platforms/KL25Z/}} Obr. Vývojový kit FRDM-KL25Z ---- ===== Zapojení ===== Moduly byly pomocí vodičů připojeny k vývojové desce, včetně napájecích vodičů. Není tedy potřeba externí napájení. Toto zapojení bylo zvoleno kvůli využití hardwarové podpory komunikačního rozhraní I2C. Zapojení komunikačních vodičů je následující: **HC-SR04 <=> FRDM-KL25Z**\\ TRIG --------- PTA13 (PWM)\\ ECHO -------- PTD5 (PWM)\\ **BOSCH BMP180 <=> FRDM-KL25Z**\\ SCL --------------------- PTE1 (SLC I2C1)\\ SDA --------------------- PTE0 (SDA I2C1)\\ ---- ===== Software ===== Program byl napsán ve vývojovém prostředí https://developer.mbed.org/. Toto prostředí bylo použito, protože je zde několik dostupných knihoven pro každý použitý modul. ==== Funkce main ==== Ve funkci main dochází napřed k inicializaci proměnných potřebných. Poté dochází v nekonečné smyčce k postupnému čtené dat z obou modulů a následného výpočtu vzdálenosti a filtraci. Naměřená data se posílají skrz rozhraní USB do počítače. int main(void) { BMP180 bmp180(PIN_SDA,PIN_SCL); bmp180.Initialize(); HCSR04 distance_sensor(TRIG_PIN, ECHO_PIN); float pressure; float temp; float echo_time_us; float distance; float dis_filter = 0.1; float v; float lamda = 0.9; while(1) { bmp180.ReadData(&temp,&pressure); //čtení teploty a tlaku echo_time_us = (float)distance_sensor.echo_duration(); //zjištění doby návratu pulzů v us v = 331.57+(0.607*temp); //výpočet rychlosti zvuku distance = ((0.001*echo_time_us)*v)/2; //výpočet vzdálenosti dis_filter = lamda*dis_filter+((1-lamda)*distance); //filtrace naměřených hodnot serial.printf("Vzdalenost: %8.2f mm \r\n", dis_filter); //odeslání do PC } } ==== Funkce echo_duration ==== Tato funkce slouží k obsluze modulu HC-SR04. Jelikož tento modul obsahuje vlastní řídící obvod je potřeba pouze přivést na vstup startovací pulz o délce 10us a poté změřit výstupní pulz. To lze udělat za použití vnitřního časovače. long HCSR04::echo_duration() { timer.reset(); //resetování timeru z předchozího měření trig=0; // nulování Trig pinu wait_us(2); // wait trig=1; // nastavení Trig pinu wait_us(10); trig=0; // nulování Trig pinu while(!echo); // čekání na start výstupního pulzu timer.start(); //spusť timer while(echo); //čekej dokud neskončí výstupní pulz timer.stop(); //zastav timer return timer.read_us(); //vrať hodnotu timeru } ---- ===== Ukázkové video ===== Na následujícím videu je vidět ukázka funkce proměření vzdálenosti. {{ youtube>T5ICxR6A-3w?medium }} ---- ===== Závěr ===== Cílem projektu bylo realizovat ultrazvukové měření vzdálenosti s pomocí vývojového kitu FRDM-KL25Z, modulu pro ultrazvukové měření vzdálenosti HC-SR04 a teplotního čidla BOSCH BMP180. Všechny body zadání se podařilo splnit a měření vzdálenosti ultrazvukem s korekcí rychlosti šíření zvuku pomocí teploty je plně funkční. Dalšími možnostmi rozvoje projektu jsou například napsaní obslužné aplikace pro počítač, či přidání zobrazovacího displeje. Zařízení by se tak obešlo bez použití PC. --- //[[xkvasn07@stud.feec.vutbr.cz|Jaroslav Kvasnička]] 2016/11/25 20:29//