This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| et:projects:explorer [2011/05/23 15:19] – tekitatud raivo.sell | et:projects:explorer [2020/07/20 09:00] (current) – created - external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 2: | Line 2: | ||
| Lihtne labürindis orienteeruja, | Lihtne labürindis orienteeruja, | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ===== Versioon 1 - Lihtne lahendus ===== | ||
| + | |||
| + | {{: | ||
| {{: | {{: | ||
| Line 7: | Line 13: | ||
| <code c> | <code c> | ||
| // | // | ||
| - | + | // Roboti näidisprogramm | |
| - | // Roboti näidisprogramm | + | |
| // | // | ||
| Line 18: | Line 22: | ||
| #include < | #include < | ||
| #include < | #include < | ||
| - | + | ||
| // | // | ||
| // Ultraheli anduri ja multiplekseri viigud | // Ultraheli anduri ja multiplekseri viigud | ||
| - | |||
| // | // | ||
| - | |||
| pin multiplekser = PIN(G,0); | pin multiplekser = PIN(G,0); | ||
| - | + | pin pin_trigger = PIN(F, | |
| - | pin pin_trigger = PIN(F, | + | |
| - | + | ||
| // Nuppude viigud | // Nuppude viigud | ||
| - | |||
| - | |||
| - | |||
| pin buttons[3] = { PIN(C, 2), PIN(C, 1), PIN(C, 0) }; | pin buttons[3] = { PIN(C, 2), PIN(C, 1), PIN(C, 0) }; | ||
| - | |||
| - | |||
| // | // | ||
| - | |||
| // Põhiprogramm | // Põhiprogramm | ||
| - | |||
| // | // | ||
| - | |||
| int main(void) | int main(void) | ||
| - | |||
| { | { | ||
| - | |||
| unsigned short distance; | unsigned short distance; | ||
| - | |||
| char text[16]; | char text[16]; | ||
| - | + | bool lipp = 0; | |
| - | + | ||
| // Multiplekseri seadistamine | // Multiplekseri seadistamine | ||
| - | |||
| pin_setup_output(multiplekser); | pin_setup_output(multiplekser); | ||
| - | |||
| pin_set(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); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| - | // Nuppude seadistamine sisendiks | + | ===== 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]); | for (int i = 0; i < 3; i++) pin_setup_input(buttons[i]); | ||
| - | |||
| - | |||
| - | |||
| // Mootorite seadistamine | // Mootorite seadistamine | ||
| - | |||
| dcmotor_init(0); | dcmotor_init(0); | ||
| - | |||
| dcmotor_init(1); | dcmotor_init(1); | ||
| - | |||
| - | |||
| - | |||
| // Servo seadistamine | // Servo seadistamine | ||
| - | |||
| - | |||
| - | |||
| servomotor_init(0); | servomotor_init(0); | ||
| - | |||
| - | |||
| - | |||
| // LCD ekraani algseadistamine | // LCD ekraani algseadistamine | ||
| - | |||
| lcd_gfx_init(); | lcd_gfx_init(); | ||
| - | |||
| - | |||
| - | |||
| // Ekraani puhastamine | // Ekraani puhastamine | ||
| - | |||
| lcd_gfx_clear(); | lcd_gfx_clear(); | ||
| - | |||
| - | |||
| - | |||
| // Taustavalgustuse tööle lülitamine | // Taustavalgustuse tööle lülitamine | ||
| - | |||
| lcd_gfx_backlight(true); | lcd_gfx_backlight(true); | ||
| - | |||
| - | |||
| - | |||
| // Programmi nime kuvamine | // Programmi nime kuvamine | ||
| - | |||
| lcd_gfx_goto_char_xy(1, | lcd_gfx_goto_char_xy(1, | ||
| - | + | lcd_gfx_write_string(" | |
| - | lcd_gfx_write_string(" | + | |
| - | + | ||
| - | + | ||
| // Väike paus | // Väike paus | ||
| - | |||
| _delay_ms(100); | _delay_ms(100); | ||
| - | |||
| - | |||
| - | |||
| // Lõputu tsükkel | // Lõputu tsükkel | ||
| - | |||
| while (true) | 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< | ||
| + | { | ||
| + | // 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); | ||
| + | } | ||
| } | } | ||
| </ | </ | ||