This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| et:projects:explorer [2011/12/01 09:18] – eemaldatud raivo.sell | et:projects:explorer [2020/07/20 09:00] (current) – created - external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Orienteeruja ====== | ||
| + | Lihtne labürindis orienteeruja, | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ===== Versioon 1 - Lihtne lahendus ===== | ||
| + | |||
| + | {{: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | <code c> | ||
| + | // | ||
| + | // Roboti näidisprogramm v1. | ||
| + | // | ||
| + | |||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // | ||
| + | // Ultraheli anduri ja multiplekseri viigud | ||
| + | // | ||
| + | pin multiplekser = PIN(G,0); | ||
| + | pin pin_trigger = PIN(F, 2); | ||
| + | |||
| + | // Nuppude viigud | ||
| + | pin buttons[3] = { PIN(C, 2), PIN(C, 1), PIN(C, 0) }; | ||
| + | |||
| + | // | ||
| + | // Põhiprogramm | ||
| + | // | ||
| + | int main(void) | ||
| + | { | ||
| + | unsigned short distance; | ||
| + | char text[16]; | ||
| + | bool lipp = 0; | ||
| + | // Multiplekseri seadistamine | ||
| + | pin_setup_output(multiplekser); | ||
| + | pin_set(multiplekser); | ||
| + | // Nuppude seadistamine sisendiks | ||
| + | for (int i = 0; i < 3; i++) pin_setup_input(buttons[i]); | ||
| + | // Mootorite seadistamine | ||
| + | dcmotor_init(0); | ||
| + | dcmotor_init(1); | ||
| + | // LCD ekraani algseadistamine | ||
| + | lcd_gfx_init(); | ||
| + | // Ekraani puhastamine | ||
| + | lcd_gfx_clear(); | ||
| + | // Taustavalgustuse tööle lülitamine | ||
| + | lcd_gfx_backlight(true); | ||
| + | // Programmi nime kuvamine | ||
| + | lcd_gfx_goto_char_xy(1, | ||
| + | lcd_gfx_write_string(" | ||
| + | // Väike paus | ||
| + | _delay_ms(100); | ||
| + | // Lõputu tsükkel | ||
| + | while (true) | ||
| + | { | ||
| + | // Mõõtmine | ||
| + | distance = ultrasonic_measure_srf05(pin_trigger); | ||
| + | // Kontrollime nuppu ja salvestame nupuvajutuse | ||
| + | if(!pin_get_value(buttons[0])) lipp = 0; // Vajutades 0 nuppu läheb lipp madalaks | ||
| + | if(!pin_get_value(buttons[1])) lipp = 1; // Vajutades 1 nuppu läheb lipp kõrgeks | ||
| + | // 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_gfx_goto_char_xy(2, | ||
| + | lcd_gfx_write_string(text); | ||
| + | |||
| + | // Kauguse kontorllimine | ||
| + | // Kui nuppu on vajutatud ja distants on alla teatud väärtuse siis keerame paremale | ||
| + | if (lipp&& | ||
| + | { | ||
| + | dcmotor_drive(0, | ||
| + | dcmotor_drive(1, | ||
| + | sprintf(text," | ||
| + | _delay_ms(300); | ||
| + | distance = ultrasonic_measure_srf05(pin_trigger); | ||
| + | // Kui distants oli endiselt alla teatud väärtuse keerame otsa ringi, ehk algsest asendist vasakule | ||
| + | if ( distance< | ||
| + | { | ||
| + | dcmotor_drive(0, | ||
| + | dcmotor_drive(1, | ||
| + | sprintf(text," | ||
| + | _delay_ms(600); | ||
| + | distance = ultrasonic_measure_srf05(pin_trigger); | ||
| + | // Kui distants on endiselt alla teatud väärtuse jääme seisma | ||
| + | if(distance< | ||
| + | { | ||
| + | dcmotor_drive(0, | ||
| + | dcmotor_drive(1, | ||
| + | sprintf(text," | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | // Kui takistust pole sõidame otse edasi | ||
| + | else if(lipp) | ||
| + | { | ||
| + | dcmotor_drive(0, | ||
| + | dcmotor_drive(1, | ||
| + | sprintf(text, | ||
| + | } | ||
| + | // Kui nupp 0 on alla vajutatud jääme seisma | ||
| + | else | ||
| + | { | ||
| + | sprintf(text," | ||
| + | dcmotor_drive(0, | ||
| + | dcmotor_drive(1, | ||
| + | } | ||
| + | // Teksti kuvamine LCD teise rea alguses | ||
| + | lcd_gfx_goto_char_xy(3, | ||
| + | lcd_gfx_write_string(text); | ||
| + | |||
| + | sprintf(text, | ||
| + | lcd_gfx_goto_char_xy(2, | ||
| + | lcd_gfx_write_string(text); | ||
| + | |||
| + | // Väike paus | ||
| + | _delay_ms(50); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Versioon 2 - Targem lahendus ===== | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | <code c> | ||
| + | // | ||
| + | // Roboti näidisprogramm v3. | ||
| + | // | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // | ||
| + | // Ultraheli anduri ja multiplekseri viigud | ||
| + | // | ||
| + | pin multiplekser = PIN(G,0); | ||
| + | pin pin_trigger = PIN(F, 0); | ||
| + | // Nuppude viigud | ||
| + | pin buttons[3] = { PIN(C, 2), PIN(C, 1), PIN(C, 0) }; | ||
| + | // | ||
| + | // Põhiprogramm | ||
| + | // | ||
| + | int main(void) | ||
| + | { | ||
| + | unsigned short distance; | ||
| + | char text[16]; | ||
| + | bool lipp = 0; | ||
| + | // Loome servo positsioonide massiivi, kus on eelnevalt kindlaks tehtud ääred ja keskasend | ||
| + | // { parem äär, keskasend, vasak äär, keskasend} | ||
| + | // NB! asendieid võivad olla nihkes, ning vastavalt servo paigaldusele valesti. | ||
| + | int positsioon[4] = {-178, | ||
| + | // Loome suundade mälumassiivi kuhu hiljem hakkame tõeväärtusi kirjutama | ||
| + | // 0 - sel suunal on takistus , 1 - takistus puudub | ||
| + | int suund[4] = { 0, 0, 0, 0}; | ||
| + | // Multiplekseri seadistamine | ||
| + | pin_setup_output(multiplekser); | ||
| + | pin_set(multiplekser); | ||
| + | // Nuppude seadistamine sisendiks | ||
| + | for (int i = 0; i < 3; i++) pin_setup_input(buttons[i]); | ||
| + | // Mootorite seadistamine | ||
| + | dcmotor_init(0); | ||
| + | dcmotor_init(1); | ||
| + | // Servo seadistamine | ||
| + | servomotor_init(0); | ||
| + | // LCD ekraani algseadistamine | ||
| + | lcd_gfx_init(); | ||
| + | // Ekraani puhastamine | ||
| + | lcd_gfx_clear(); | ||
| + | // Taustavalgustuse tööle lülitamine | ||
| + | lcd_gfx_backlight(true); | ||
| + | // Programmi nime kuvamine | ||
| + | lcd_gfx_goto_char_xy(1, | ||
| + | lcd_gfx_write_string(" | ||
| + | // Väike paus | ||
| + | _delay_ms(100); | ||
| + | // Lõputu tsükkel | ||
| + | while (true) | ||
| + | { | ||
| + | // Mõõtmine | ||
| + | distance = ultrasonic_measure_srf05(pin_trigger); | ||
| + | // Kontrollime nuppu ja salvestame nupuvajutuse | ||
| + | if(!pin_get_value(buttons[0])) lipp = 0; // Vajutades 0 nuppu läheb lipp madalaks | ||
| + | if(!pin_get_value(buttons[1])) lipp = 1; // Vajutades 1 nuppu läheb lipp kõrgeks | ||
| + | // 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_gfx_goto_char_xy(2, | ||
| + | lcd_gfx_write_string(text); | ||
| + | // Kontrollime kas sisselülitamise nuppu on vajutatud | ||
| + | if(lipp) | ||
| + | { | ||
| + | // Kordustsüklis hakkame positsiooni ja suuna massiive kontrollima | ||
| + | for(int i = 0; i<4;i++) | ||
| + | { | ||
| + | // Liigutame servomootorit positsiooni massiivist võetud väärtuse võrra | ||
| + | servomotor_position(0, | ||
| + | // Ootame servo liikumist | ||
| + | _delay_ms(250); | ||
| + | // Salvestame ultraheli kauguse näidu | ||
| + | distance = ultrasonic_measure_srf05(pin_trigger); | ||
| + | // Tingimusel et antud suund oli vaba kirjutame suuna massiivile vastavasse lahtrisse 1. | ||
| + | // Distantsi kaugus määrata katseliselt. | ||
| + | if(distance> | ||
| + | // Kui sel suunal oli takistus kirjutame sinna 0 | ||
| + | else suund[i] = 0; | ||
| + | // Kontrollime mälust, kas otse olevad suunad on vabad | ||
| + | if (suund[1] | suund[3]) | ||
| + | { | ||
| + | dcmotor_drive(0, | ||
| + | dcmotor_drive(1, | ||
| + | | ||
| + | sprintf(text," | ||
| + | } | ||
| + | // Kontrollime mälust, kas parem suund on takistuseta | ||
| + | else if(suund[0]) | ||
| + | { | ||
| + | dcmotor_drive(0, | ||
| + | dcmotor_drive(1, | ||
| + | sprintf(text," | ||
| + | _delay_ms(300); | ||
| + | } | ||
| + | // Kontrollime mälust, kas vasak suund on takistuseta | ||
| + | else if(suund[2]) | ||
| + | { | ||
| + | dcmotor_drive(0, | ||
| + | dcmotor_drive(1, | ||
| + | sprintf(text," | ||
| + | _delay_ms(300); | ||
| + | } | ||
| + | // Kui ükski suund pole vaba jäävad mootorid seisma | ||
| + | else | ||
| + | { | ||
| + | dcmotor_drive(0, | ||
| + | dcmotor_drive(1, | ||
| + | sprintf(text," | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | // Kui 0 nupp on vajutatud siis jätab mootorid seisma | ||
| + | else | ||
| + | { | ||
| + | sprintf(text," | ||
| + | dcmotor_drive(0, | ||
| + | dcmotor_drive(1, | ||
| + | } | ||
| + | // Teksti kuvamine LCD-le | ||
| + | lcd_gfx_goto_char_xy(2, | ||
| + | lcd_gfx_write_string(text); | ||
| + | sprintf(text, | ||
| + | lcd_gfx_goto_char_xy(2, | ||
| + | lcd_gfx_write_string(text); | ||
| + | // Väike paus | ||
| + | _delay_ms(50); | ||
| + | } | ||
| + | } | ||
| + | </ | ||