====== Orienteeruja ====== Lihtne labürindis orienteeruja, mis baseerub Robootika Kodulaboril ja RP05 lintidega robotplatvormil. {{:projects:rp05:rp05_maze.jpg|}} ===== Versioon 1 - Lihtne lahendus ===== {{:projects:rp05:robot_v1.hex|Kompileeritud HEX}} {{:et:projects:saaremaa.jpg?500|}} // // 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, 1); lcd_gfx_write_string("Robot_v1"); // 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, "%d cm ", distance); } // Mõõtmisel tekkis viga ? else { // Vea tekst sprintf(text, "Viga "); } // Teksti kuvamine LCD teise rea alguses lcd_gfx_goto_char_xy(2, 2); lcd_gfx_write_string(text); // Kauguse kontorllimine // Kui nuppu on vajutatud ja distants on alla teatud väärtuse siis keerame paremale if (lipp&&(distance<25)) { dcmotor_drive(0, 1); // 0 mootor edasi dcmotor_drive(1,-1); // 1 mootor tagasi sprintf(text,"paremale "); // kirjutame kontrolliks text massiivi paremale _delay_ms(300); // ootame keeramist, ooteaja pikkus valitakse katseliselt distance = ultrasonic_measure_srf05(pin_trigger); // Kordame mõõtmist // Kui distants oli endiselt alla teatud väärtuse keerame otsa ringi, ehk algsest asendist vasakule if ( distance<25) { dcmotor_drive(0,-1); // 0 mootor tagasi dcmotor_drive(1, 1); // 1 mootor edasi sprintf(text,"vasakulse"); // kirjutame text massiivi vasakule _delay_ms(600); // ootame keeramist, ooteaja pikkus valitakse katseliselt distance = ultrasonic_measure_srf05(pin_trigger); // Kordame mõõtmist // Kui distants on endiselt alla teatud väärtuse jääme seisma if(distance<25) { dcmotor_drive(0, 0); dcmotor_drive(1, 0); sprintf(text,"sein"); } } } // Kui takistust pole sõidame otse edasi else if(lipp) { dcmotor_drive(0,1); dcmotor_drive(1,1); sprintf(text, "otse"); } // Kui nupp 0 on alla vajutatud jääme seisma else { sprintf(text,"seisab"); dcmotor_drive(0,0); dcmotor_drive(1,0); } // Teksti kuvamine LCD teise rea alguses lcd_gfx_goto_char_xy(3, 3); lcd_gfx_write_string(text); sprintf(text, "lipp %d", lipp); lcd_gfx_goto_char_xy(2, 4); lcd_gfx_write_string(text); // Väike paus _delay_ms(50); } } ===== Versioon 2 - Targem lahendus ===== {{:projects:rp05:robot_v3.hex|Kompileeritud HEX}} // // 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,-40,110,-40 }; // 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, 1); lcd_gfx_write_string("Robot_v3"); // 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, "%d cm ", distance); } // Mõõtmisel tekkis viga ? else { // Vea tekst sprintf(text, "Viga "); } // Teksti kuvamine LCD teise rea alguses lcd_gfx_goto_char_xy(2, 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, positsioon[i]); // 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>25) suund[i] = 1; // 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, 1); // 0 mootor otse dcmotor_drive(1, 1); // 1 mootor otse // Eelnev sõltub sellest kuidas mootorid on ühendatud sprintf(text,"otse"); // Kirjutame text massiivi 'otse' hilisemaks kontrolliks. } // Kontrollime mälust, kas parem suund on takistuseta else if(suund[0]) { dcmotor_drive(0,-1); // 0 mootor tagasi dcmotor_drive(1, 1); // 1 mootor edasi sprintf(text,"parem"); // Kirjutame text massiivi parem _delay_ms(300); // Ootame keeramist, pausi pikkus määrata katseliselt } // Kontrollime mälust, kas vasak suund on takistuseta else if(suund[2]) { dcmotor_drive(0, 1); // 0 mootor edasi dcmotor_drive(1,-1); // 1 mootor tagasi sprintf(text,"vasak"); // Kirjutame text massiivi vasak _delay_ms(300); // Ootame keeramist } // Kui ükski suund pole vaba jäävad mootorid seisma else { dcmotor_drive(0, 0); dcmotor_drive(1, 0); sprintf(text,"sein"); } } } // Kui 0 nupp on vajutatud siis jätab mootorid seisma else { sprintf(text,"seisab"); dcmotor_drive(0,0); dcmotor_drive(1,0); } // Teksti kuvamine LCD-le lcd_gfx_goto_char_xy(2, 3); lcd_gfx_write_string(text); sprintf(text, "suund %d,%d,%d,%d", suund[0],suund[1],suund[2],suund[3]); lcd_gfx_goto_char_xy(2, 4); lcd_gfx_write_string(text); // Väike paus _delay_ms(50); } }