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/10/09 09:53] – 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: [HW] [[et: | + | //Vajalikud teadmised: [HW] [[et: |
+ | [AVR] [[et: | ||
+ | [LIB] [[et: | ||
+ | [LIB] [[et: | ||
===== Teooria ===== | ===== Teooria ===== | ||
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 ATmega2561 kontrolleri näitel, 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 funktsioon 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. | 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 ATmega2561 kontrolleri näitel, 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 funktsioon 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. | ||
Line 27: | Line 29: | ||
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 44: | Line 46: | ||
while (timer3_get_value() < 18) {} | while (timer3_get_value() < 18) {} | ||
- | // Päästiku | + | // Päästiku |
pin_clear(triggerecho); | pin_clear(triggerecho); | ||
Line 53: | 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 66: | 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 83: | Line 85: | ||
[{{ : | [{{ : | ||
*/ | */ | ||
- | 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> | ||
Line 96: | Line 98: | ||
// Ultraheli SRF05 anduri signaali viik | // Ultraheli SRF05 anduri signaali viik | ||
// Kodulabor II | // Kodulabor II | ||
- | // pin pin_trigger_echo = PIN(F, 2); | + | //pin pin_trigger_echo = PIN(F, 2); |
// Kodulabor III | // Kodulabor III | ||
Line 124: | 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 | ||
{ | { |