This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:examples:sensor:ultrasonic_distance_srf04 [2012/11/09 15:14] – raivo.sell | et:examples:sensor:ultrasonic_distance_srf04 [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | < | ||
| + | ====== Ultraheli kaugusmõõdik SRF04 ====== | ||
| + | //Vajalikud teadmised: [HW] [[et: | ||
| + | |||
| + | ===== Teooria ===== | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Ultraheli kaugusmõõdik määrab objekti(de) kaugust, mõõtes helilaine objektilt tagasipeegeldumise aega. Helilaine sagedus asub ultraheli sageduse piirkonnas, mis tagab kontsentreerituma helilaine suuna, sest kõrgema sagedusega heli hajub keskkonnas vähem. Tüüpiline ultraheli kaugusmõõdik koosneb kahest membraanist, | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Ultraheli kaugusmõõdikutel on igapäevaelus mitmeid rakendusi. Neid kasutatakse mõõdulintide asendajatena kauguse mõõtmise seadmetes, näiteks ehitusel. Tänapäeva autod on varustatud tagurdamisel takistusest hoiatavate ultraheliandurite ja hoiatussignaaliga. Peale kauguse mõõtmise võivad nad lihtsalt registreerida objekti olemasolu mõõtepiirkonnas, | ||
| + | |||
| + | ===== Praktika ===== | ||
| + | |||
| + | Kodulabori Andurite mooduli komplektis on Devantech SRF04 või SRF05 ultraheli kaugusmõõdik. SRF04/SRF05 on ainult andur, mis otseselt kauguse infot ei väljasta. Anduril on peale toiteviikude veel päästiku ja kaja viik. Päästiku viiku kõrgeks seades genereerib andur 8-perioodilise 40 kHz ultraheli laine. Sel hetkel läheb kõrgeks kaja viik ja jääb kõrgeks niikauaks, kuni peegeldunud helilaine on andurini jõudnud. Seega põhimõtteliselt näitab kaja signaal aega, mille jooksul heli levib objektini ja tagasi. Mõõtes seda aega, korrutades seda heli levimise kiirusega ja jagades kahega, saab leida objekti kauguse. Päästiku, helilaine kiirguri ja kaja signaale ajas iseloomustab kõrvalolev graafik. | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Devantech-i ultrahelianduri AVR-iga kasutamiseks tuleb selle päästiku ja kaja viigud ühendada mõnede AVR-i viikudega. Aja mõõtmiseks on sobiv kasutada 16-bitist taimerit, näiteks //timer3//. Järgnevalt on toodud funktsioon, mis teostab kogu mõõtmisprotseduuri - genereerib päästiku signaali, käivitab taimeri, mõõdab kajasignaali pikkust ja teisendab selle kauguseks sentimeetrites. Funktsioon on blokeeruv ehk protsessor on sellega hõivatud senikaua, kuni mõõtetulemus on käes või mõõtmine venib lubatust pikemaks. Mida kiiremini kaja saabub, seda kiiremini saab mõõtetulemuse. Kui kaja ei saabugi, ootab funksioon seda ~36 ms ja tagastab seejärel 0. Oluline on mõõtmiste vahele jätta mõnikümmend millisekundit pausi, et eelmisel mõõtmisel tekitatud helilaine jõuaks sumbuda ega rikuks uut mõõtmist. Kui kasutatakse samaaegselt mitut ultraheli andurit, tuleb samuti jälgida, et helilained ei kattuks. | ||
| + | |||
| + | <code c> | ||
| + | #define ULTRASONIC_SPEED_OF_SOUND 33000 // cm/s | ||
| + | |||
| + | // | ||
| + | // Ultraheli kaugusanduriga mõõtmine | ||
| + | // | ||
| + | unsigned short ultrasonic_measure_srf04(pin trigger, pin echo) | ||
| + | { | ||
| + | // Viikude seadistus | ||
| + | pin_setup_output(trigger); | ||
| + | pin_setup_input_with_pullup(echo); | ||
| + | |||
| + | // Taimer 3 normaalrežiimi | ||
| + | // perioodiga F_CPU / 8 | ||
| + | timer3_init_normal(TIMER3_PRESCALE_8); | ||
| + | |||
| + | // Päästiku viik kõrgeks | ||
| + | pin_set(trigger); | ||
| + | |||
| + | // Taimeri nullimine | ||
| + | timer3_overflow_flag_clear(); | ||
| + | timer3_set_value(0); | ||
| + | |||
| + | // ~10 us ootamine | ||
| + | while (timer3_get_value() < 18) {} | ||
| + | |||
| + | // Päästiku viik madalaks | ||
| + | pin_clear(trigger); | ||
| + | |||
| + | // Kaja signaali alguse ootamine | ||
| + | while (!pin_get_value(echo)) | ||
| + | { | ||
| + | // Liiga kaua oodatud ? | ||
| + | if (timer3_overflow_flag_is_set()) | ||
| + | { | ||
| + | return 0; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Taimeri nullimine | ||
| + | timer3_set_value(0); | ||
| + | |||
| + | // Kaja signaali lõpu ootamine | ||
| + | while (pin_get_value(echo)) | ||
| + | { | ||
| + | // Liiga kaua oodatud ? | ||
| + | if (timer3_overflow_flag_is_set()) | ||
| + | { | ||
| + | return 0; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Mõõdetud aja kauguseks teisendamine | ||
| + | // | ||
| + | return (unsigned long)timer3_get_value() * | ||
| + | ULTRASONIC_SPEED_OF_SOUND / (F_CPU / 4); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Toodud funktsioon jätab päästiku ja kaja viigu kasutaja valida, nii et andurit saab ühendada sinna, kus on sobivam või kus on ruumi. Lisaks võimaldab viikude valiku vabadus funktsiooni kasutada ka mujal kui Kodulabori komplektis. Toodud funktsioon kuulub ka Kodulabori teeki, nii et seda ei pea oma programmi eraldi kirjutama. Peab aga arvestama, et Kodulabori teegis on see funktsioon jäigalt seotud Kodulabori Kontrollermooduli taktsagedusega 14,7456 Mhz ja muude taktsageduste puhul annaks funktsioon vale tulemuse. Muu taktsageduse korral tuleb see funktsioon ise oma programmmi kirjutada. Järgnevalt esitatud programmikood demonstreerib SRF04/SRF05 ultrahelianduri kasutamist Kodulabori teegiga. | ||
| + | |||
| + | <code c> | ||
| + | // | ||
| + | // Kodulabori ultraheli kaugusanduri näidisprogramm. | ||
| + | // Kauguse mõõtmise funktsioon on blokeeruv. | ||
| + | // | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // | ||
| + | // Ultraheli anduri viigud | ||
| + | // | ||
| + | pin pin_trigger = PIN(G, 1); | ||
| + | pin pin_echo | ||
| + | |||
| + | // | ||
| + | // Põhiprogramm | ||
| + | // | ||
| + | int main(void) | ||
| + | { | ||
| + | unsigned short distance; | ||
| + | char text[16]; | ||
| + | |||
| + | // LCD ekraani seadistamine | ||
| + | lcd_alpha_init(LCD_ALPHA_DISP_ON); | ||
| + | |||
| + | // LCD ekraani puhastamine | ||
| + | lcd_alpha_clear(); | ||
| + | |||
| + | // Programmi nimi | ||
| + | lcd_alpha_write_string(" | ||
| + | |||
| + | // Väike paus | ||
| + | sw_delay_ms(100); | ||
| + | |||
| + | // Lõputu tsükkel | ||
| + | while (true) | ||
| + | { | ||
| + | // Mõõtmine | ||
| + | distance = ultrasonic_measure_srf04(pin_trigger, | ||
| + | |||
| + | // Mõõtmine õnnestus ? | ||
| + | if (distance > 0) | ||
| + | { | ||
| + | // Kauguse tekstiks teisendamine | ||
| + | sprintf(text, | ||
| + | } | ||
| + | // Mõõtmisel tekkis viga ? | ||
| + | else | ||
| + | { | ||
| + | // Vea tekst | ||
| + | sprintf(text, | ||
| + | } | ||
| + | |||
| + | // Teksti kuvamine LCD teise rea alguses | ||
| + | lcd_alpha_goto_xy(0, | ||
| + | lcd_alpha_write_string(text); | ||
| + | |||
| + | // Väike paus | ||
| + | sw_delay_ms(500); | ||
| + | } | ||
| + | } | ||
| + | </ | ||