Toto je starší verze dokumentu!
Navrhněte zařízení pro měření vzdálenosti s modulem HC-SR04. Implementujte korekci 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ů.
Ultrazvukový modul 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.
Obr.1 Modul HC-SR04
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 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.
Obr.2 Modul BOSCH BMP180
Jako řídící obvod byl použit vývojový kit 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.
Obr. Vývojový kit FRDM-KL25Z
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)
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.
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 } }
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 }
Na následujícím videu je vidět ukázka funkce proměření vzdálenosti.
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í.
— Jaroslav Kvasnička 2016/11/25 19:30