This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
et:examples:sensor:ultrasonic_distance [2014/09/30 12:37] – raivo.sell | et:examples:sensor:ultrasonic_distance [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ~~PB~~ | ||
====== Ultraheli kaugusmõõdik ====== | ====== Ultraheli kaugusmõõdik ====== | ||
- | //Vajalikud teadmised: | + | //Vajalikud teadmised: [HW] [[et: |
+ | [AVR] [[et: | ||
+ | [LIB] [[et: | ||
+ | [LIB] [[et: | ||
===== Teooria ===== | ===== 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õõ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, | 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, | ||
Line 17: | Line 19: | ||
===== Praktika ===== | ===== Praktika ===== | ||
- | Kodulabori | + | Robootika |
- | [{{ : | + | 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 |
- | ~~CL~~ | + | |
- | + | ||
- | 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 | + | |
- | ~~CL~~ | + | |
<code c> | <code c> | ||
#define ULTRASONIC_SPEED_OF_SOUND 33000 // cm/s | #define ULTRASONIC_SPEED_OF_SOUND 33000 // cm/s | ||
- | // | ||
// Ultraheli kaugusanduriga mõõtmine | // Ultraheli kaugusanduriga mõõtmine | ||
- | // | ||
unsigned short ultrasonic_measure_srf05(pin triggerecho) | unsigned short ultrasonic_measure_srf05(pin triggerecho) | ||
{ | { | ||
- | // Viikude | + | // Viikude |
pin_setup_output(triggerecho); | pin_setup_output(triggerecho); | ||
- | // Taimer 3 normaalrežiimi | + | // Taimer 3 normaalrežiimi |
// perioodiga F_CPU / 8 | // perioodiga F_CPU / 8 | ||
timer3_init_normal(TIMER3_PRESCALE_8); | timer3_init_normal(TIMER3_PRESCALE_8); | ||
- | // Päästiku | + | // Päästiku |
pin_set(triggerecho); | pin_set(triggerecho); | ||
Line 50: | Line 46: | ||
while (timer3_get_value() < 18) {} | while (timer3_get_value() < 18) {} | ||
- | // Päästiku | + | // Päästiku |
pin_clear(triggerecho); | pin_clear(triggerecho); | ||
Line 59: | Line 55: | ||
while (!pin_get_value(triggerecho)) | while (!pin_get_value(triggerecho)) | ||
{ | { | ||
- | // Liiga kaua oodatud ? | + | // Liiga kaua oodatud? |
if (timer3_overflow_flag_is_set()) | if (timer3_overflow_flag_is_set()) | ||
{ | { | ||
Line 72: | Line 68: | ||
while (pin_get_value(triggerecho)) | while (pin_get_value(triggerecho)) | ||
{ | { | ||
- | // Liiga kaua oodatud ? | + | // Liiga kaua oodatud? |
if (timer3_overflow_flag_is_set()) | if (timer3_overflow_flag_is_set()) | ||
{ | { | ||
Line 80: | Line 76: | ||
// Mõõdetud aja kauguseks teisendamine | // Mõõdetud aja kauguseks teisendamine | ||
- | // | + | // kaugus = aeg * (1 / (F_CPU / 8)) * heli kiirus / 2 |
return (unsigned long)timer3_get_value() * | return (unsigned long)timer3_get_value() * | ||
ULTRASONIC_SPEED_OF_SOUND / (F_CPU / 4); | ULTRASONIC_SPEED_OF_SOUND / (F_CPU / 4); | ||
Line 86: | Line 82: | ||
</ | </ | ||
+ | /* | ||
[{{ : | [{{ : | ||
- | + | */ | |
- | Toodud funktsioon jätab päästiku / kaja viigu kasutaja valida, nii et andurit saab ühendada sinna, kus on sobivam või kus on ruumi. Lisaks võimaldab viige 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 ja muude taktsageduste puhul annaks funktsioon vale tulemuse. Muu taktsageduse korral tuleb see funktsioon ise oma programmmi | + | Toodud funktsioon jätab päästiku / kaja viigu kasutaja valida, nii et andurit saab ühendada sinna, kus on sobivam või kus on ruumi. Lisaks võimaldab viige 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 ja muude taktsageduste puhul annaks funktsioon vale tulemuse. Muu taktsageduse korral tuleb see funktsioon ise oma programmi |
<code c> | <code c> | ||
- | // | + | // Kodulabori ultraheli kaugusanduri näidisprogramm |
- | // Kodulabori ultraheli kaugusanduri näidisprogramm. | + | // Kauguse mõõtmise funktsioon on blokeeruv |
- | // Kauguse mõõtmise funktsioon on blokeeruv. | + | |
- | // | + | |
#include < | #include < | ||
#include < | #include < | ||
Line 102: | Line 96: | ||
#include < | #include < | ||
- | // | + | // Ultraheli SRF05 anduri signaali viik |
- | // Ultraheli anduri viigud | + | // Kodulabor II |
- | // | + | //pin pin_trigger_echo = PIN(F, 2); |
- | // Robootika Kodulabor II | + | // Kodulabor III |
- | // pin pin_trigger_echo = PIN(F, 2); | + | |
- | + | ||
- | // Robootika | + | |
pin pin_trigger_echo = PIN(B, 2); | pin pin_trigger_echo = PIN(B, 2); | ||
- | |||
- | // | ||
// Põhiprogramm | // Põhiprogramm | ||
- | // | ||
int main(void) | int main(void) | ||
{ | { | ||
Line 121: | Line 109: | ||
char text[16]; | char text[16]; | ||
- | // Robootika | + | // Kodulabor II Andurimooduli |
/* | /* | ||
pin ex_sensors = PIN(G, 0); | pin ex_sensors = PIN(G, 0); | ||
Line 130: | Line 118: | ||
// LCD ekraani seadistamine | // LCD ekraani seadistamine | ||
lcd_gfx_init(); | lcd_gfx_init(); | ||
- | |||
- | // LCD ekraani puhastamine | ||
lcd_gfx_clear(); | lcd_gfx_clear(); | ||
- | |||
- | // Programmi nimi | ||
lcd_gfx_goto_char_xy(1, | lcd_gfx_goto_char_xy(1, | ||
lcd_gfx_write_string(" | lcd_gfx_write_string(" | ||
Line 142: | Line 126: | ||
// Lõputu tsükkel | // Lõputu tsükkel | ||
- | while (true) | + | while (1) |
{ | { | ||
// Mõõtmine | // Mõõtmine | ||
distance = ultrasonic_measure_srf05(pin_trigger_echo); | distance = ultrasonic_measure_srf05(pin_trigger_echo); | ||
- | // Mõõtmine õnnestus ? | + | // Mõõtmine õnnestus? |
if (distance > 0) | if (distance > 0) | ||
{ | { | ||
// Kauguse tekstiks teisendamine | // Kauguse tekstiks teisendamine | ||
- | sprintf(text, | + | sprintf(text, |
} | } | ||
- | // Mõõtmisel tekkis viga ? | + | // Mõõtmisel tekkis viga? |
else | else | ||
{ | { | ||
Line 171: | Line 155: | ||
Veendumaks, et ultraheli andur ka tegelikult tööle hakkab, tuleks kontrollida, | Veendumaks, et ultraheli andur ka tegelikult tööle hakkab, tuleks kontrollida, | ||
+ | /* | ||
Kui kasutate vanemat tüüpi ultraheli andurit SRF04 ja alfabeetilist LCDd siis analoogiline näide asub siin: | Kui kasutate vanemat tüüpi ultraheli andurit SRF04 ja alfabeetilist LCDd siis analoogiline näide asub siin: | ||
http:// | http:// | ||
+ | */ |