This shows you the differences between two versions of the page.
| et:projects:soccer_robot [2010/08/02 06:39] – tarmoprillop | et:projects:soccer_robot [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 170: | Line 170: | ||
| [{{ : | [{{ : | ||
| - | Robotexil on väravate kohale paigutatud infrapuna signaali saatjad, mis edastavad | + | Robotexil on väravate kohale paigutatud infrapuna signaali saatjad, mis edastavad |
| Vastuvõtumoodulile on paigutatud kaks signaali vastuvõtjat/ | Vastuvõtumoodulile on paigutatud kaks signaali vastuvõtjat/ | ||
| - | Vastuvõtja saadab välja UART pakette, milles sisaldub infrapunavastuvõtja indeks ning vastuvõetud kanal. Väljasaadetavate UART pakettide | + | Vastuvõtja saadab |
| - | tabelites: | + | |
| - | [{{ : | + | |
| - | Vastuvõtja indeksiga 0 | + | **Vastuvõtja indeksiga 0 (vasakpoolne)** |
| - | ^ Kanal ^ Kaheksandiksüsteemis (HEX) ^ Kahendsüsteemis(BIN) | + | |
| + | ^ Kanal ^ Kaheksandiksüsteemis(HEX) | ||
| | 1 | 0x01 | 0b00000001 | | | 1 | 0x01 | 0b00000001 | | ||
| | 2 | 0x02 | 0b00000010 | | | 2 | 0x02 | 0b00000010 | | ||
| | 3 | 0x03 | 0b00000011 | | | 3 | 0x03 | 0b00000011 | | ||
| - | | 3 | 0x04 | 0b00000100 | | + | | 4 | 0x04 | 0b00000100 | |
| - | Vastuvõtja indeksiga 1 | + | **Vastuvõtja indeksiga 1 (parempoolne)** |
| - | ^ Kanal ^ Kaheksandiksüsteemis (HEX) | + | ^ Kanal ^ Kaheksandiksüsteemis(HEX) |
| | 1 | 0x11 | 0b00010001 | | | 1 | 0x11 | 0b00010001 | | ||
| | 2 | 0x12 | 0b00010010 | | | 2 | 0x12 | 0b00010010 | | ||
| | 3 | 0x13 | 0b00010011 | | | 3 | 0x13 | 0b00010011 | | ||
| - | | 3 | 0x14 | 0b00010100 | | + | | 4 | 0x14 | 0b00010100 | |
| + | |||
| + | RC5 vastuvõtja skeemi ja trükkplaadi pildid. Skeemi ja trükplaadi failid, tarkvara ning komponentide nimistu paiknevad lehekülje alumises osas, alajaotuses " | ||
| + | | ||
| === Palliandur === | === Palliandur === | ||
| Line 215: | Line 217: | ||
| ==== Programm ==== | ==== Programm ==== | ||
| - | Roboti tarkvara on kirjutatud AVR Studios C keeles. Tarkvara kasutab kodulabori teeki ja AVR-GCC kompilaatorit mis tuleb kaasa WinAVR-iga. Programm on jagatud funktsioonide järgi mitmeks failiks - näiteks on sõitmise funktsioonide ja andurite näitude lugemiseks erinevad failid. Põhifailis asub //main// funktsioon mis käivitab kõik juhtimis- ja tagasiside protsessid | + | Roboti tarkvara on kirjutatud AVR Studios C keeles. Tarkvara kasutab kodulabori teeki ja AVR-GCC kompilaatorit mis tuleb kaasa WinAVR-iga. Programm on jagatud funktsioonide järgi mitmeks failiks - näiteks on sõitmise funktsioonide ja andurite näitude lugemiseks erinevad failid. Põhifailis asub //main// funktsioon mis käivitab kõik juhtimis- ja tagasiside protsessid. Roboti |
| - | Programm on üles ehitatud | + | Programm on üles ehitatud |
| - | Järgnevalt on toodu roboti //main// funktsioon kus käivitatakse kõik katkestustel toimuvad protsessid ja alustatakse algoritmi täitmist. Selleks, et robotit saaks peatada toimub tsüklites ja pausi funktsioonides (mis on samuti tsüklid) programmi töötamist näitava muutuja kontroll. Nii kui katkestuses töötav programmiosa tuvastab stopp-nupu vajutamise, nullitakse ka töötamist näitav muutuja ja algoritm hüppab //goto// käsuga uuesti algusesse. // | + | Tabeli struktuur on järgmine: |
| + | * Sisendid | ||
| + | * Olek | ||
| + | * Taimer | ||
| + | * Vasak enkooder | ||
| + | * Parem enkooder | ||
| + | * Nupud | ||
| + | * Infrapuna kaugusandur | ||
| + | * Ultraheli kaugusandur | ||
| + | * Palliandur | ||
| + | * Oma värava suund | ||
| + | * Vastase värava suund | ||
| + | * Väljundid | ||
| + | * Uus olek | ||
| + | * Taimer | ||
| + | * Platvorm | ||
| + | * Pallihoidmise rullik | ||
| + | * 7-segmendiline indikaator | ||
| + | * Punane LED | ||
| + | * Ultraheli kaugusanduri väärtuse meelde jätmise lipuke | ||
| + | |||
| + | |||
| + | Tabeli ridade pikkuse vähendamiseks ning määramata sisendite/ | ||
| + | |||
| + | ^ Käsklus ^ Seletus ^ | ||
| + | | EQ(n) | Sisend peab olema n-ga võrdne | | ||
| + | | NE(n) | Sisend ei tohi olla n-ga võrdne | | ||
| + | | GT(n) | Sisend peab olema suurem n-st | | ||
| + | | LT(n) | Sisend peab olema väiksem n-st | | ||
| + | | BM(n) | Kontrollitakse n-ndat bitti sisendis | | ||
| + | | CSM(n) | Sisendi väärtus peab olema suurem või võrdne n ja eelmise meelde jäetud ultraheliandurist saadud kauguse summaga | | ||
| + | | CSB(n) | Sisendi väärtus peab olema suurem või võrdne n ja eelmise meelde jäetud ultraheliandurist saadud kauguse vahega | | ||
| + | ||| | ||
| + | | DRV(l, r) | Seab vasaku mootori kiiruseks l ja parema mootori kiiruseks r. Arvud -100...100, kus 0 on peatatud olek ning negatiivne arv tähistab sama kiirust vastassuunas. | | ||
| + | | STA(n) | Seab uue oleku n | | ||
| + | | TMR(n) | Seab taimeri uueks väärtuseks n | | ||
| + | | ROL(0/1) | Lülitab pallihoidmise rulliku välja/ | ||
| + | | LED(0/1) | Lülitab LED'i välja/ | ||
| + | | SEG(0-9) | Seab 7-segmendilise indikaatori näidatava väärtuse 0-9 | | ||
| + | |||
| + | <code c> | ||
| + | // | ||
| + | // Input-output logic list | ||
| + | // This table does all the " | ||
| + | // | ||
| + | logic_step logic_list[] = | ||
| + | { | ||
| + | // INPUT | ||
| + | // STATE | ||
| + | { EQ( 1), 0, | ||
| + | { | ||
| + | // --- Drive to the center ------------------------------------------------------------------------------------------------------------------------------------------ | ||
| + | { EQ( 2), 0, | ||
| + | { EQ( 3), 0, | ||
| + | { EQ( 4), 0, | ||
| + | { EQ( 5), 0, GT(18), | ||
| + | // --- Start searching ---------------------------------------------------------------------------------------------------------------------------------------------- | ||
| + | { EQ( 10), 0, | ||
| + | { EQ( 11), 0, | ||
| + | { EQ( 11), 0, | ||
| + | { EQ( 11), 0, | ||
| + | // --- Precise search ----------------------------------------------------------------------------------------------------------------------------------------------- | ||
| + | { EQ( 20), 0, | ||
| + | { EQ( 21), 0, | ||
| + | { EQ( 21), 0, | ||
| + | { EQ( 21), EQ( | ||
| + | { EQ( 21), EQ( | ||
| + | { EQ( 21), LT(4500), | ||
| + | { EQ( 22), 0, | ||
| + | { EQ( 23), 0, | ||
| + | { EQ( 24), 0, CSB(750), | ||
| + | { EQ( 25), 0, GT(18), | ||
| + | // --- Turn to ball ------------------------------------------------------------------------------------------------------------------------------------------------- | ||
| + | { EQ( 30), 0, | ||
| + | { EQ( 31), 0, | ||
| + | { EQ( 31), 0, GT(MTS(150)), | ||
| + | { EQ( 32), 0, GT(18), | ||
| + | { EQ( 33), 0, | ||
| + | { EQ( 33), 0, | ||
| + | { EQ( 34), 0, GT(MTS( 50)), GT(MTS( 50)), | ||
| + | { EQ( 35), 0, GT(18), | ||
| + | { EQ( 36), 0, | ||
| + | { EQ( 36), 0, | ||
| + | { EQ( 40), 0, | ||
| + | { EQ( 41), 0, GT(MTS(700)), | ||
| + | { EQ( 42), 0, GT(18), | ||
| + | { EQ( 45), 0, | ||
| + | { EQ( 45), 0, | ||
| + | { EQ( 46), 0, GT(18), | ||
| + | { EQ( 47), 0, GT(18), | ||
| + | { EQ( 48), 0, CSB(800), | ||
| + | { EQ( 49), 0, GT(18), | ||
| + | // --- Locate the goal ---------------------------------------------------------------------------------------------------------------------------------------------- | ||
| + | { EQ( 90), 0, | ||
| + | { EQ( 91), 0, GT(MTS( 50)), GT(MTS( 50)), | ||
| + | { EQ( 92), 0, | ||
| + | { EQ( 92), 0, | ||
| + | { EQ( 92), EQ( | ||
| + | // --- Score the goal ----------------------------------------------------------------------------------------------------------------------------------------------- | ||
| + | { EQ( 95), 0, | ||
| + | { EQ( 96), 0, | ||
| + | // --- Turn around -------------------------------------------------------------------------------------------------------------------------------------------------- | ||
| + | { EQ(100), | ||
| + | { EQ(101), | ||
| + | }; | ||
| + | </ | ||
| + | |||
| + | Järgnevalt on toodud | ||
| + | |||
| + | Enne tabeli ridade kontrollimist loetakse puhvritest kõigi andurite väärtused ning uuendatakse ka LCD ekraanil olevat infot. Et vähendada ekraani uuendamisega kaasnevat viidet on uuendamine jagatud kuue tsükli vahel, millest igas tsüklis uuendatakse erineva anduri väärtust ekraanil. | ||
| <code c> | <code c> | ||
| Line 227: | Line 338: | ||
| int main(void) | int main(void) | ||
| { | { | ||
| - | | + | unsigned char i; |
| - | unsigned short wall_distance; | + | unsigned short timer; |
| - | | + | unsigned short encoder_left; |
| - | bool goal_to_search = false; | + | unsigned short encoder_right; |
| - | bool goal_timeout_activated = false; | + | unsigned short buttons; |
| + | unsigned short infrared; | ||
| + | unsigned short ultrasonic; | ||
| + | unsigned short ball; | ||
| + | signed char own_goal; | ||
| + | signed char target_goal; | ||
| - | // Initialize hardware. | + | // Initial state |
| - | | + | unsigned short state = 1; |
| - | | + | // LCD counter |
| - | while (true) | + | unsigned short lcdcount = 0; |
| - | { | + | |
| - | start: | + | // Initialize hardware. |
| + | init(); | ||
| - | | + | // Loop forever |
| - | | + | while (true) |
| + | { | ||
| + | // Read sensor values | ||
| + | chassis_get_steps(& | ||
| + | timer | ||
| + | buttons | ||
| + | infrared | ||
| + | ultrasonic | ||
| + | ball | ||
| + | own_goal | ||
| + | target_goal = beacon_locate_opponent_goal(); | ||
| + | |||
| + | // Display ultrasonic distance. | ||
| + | switch (lcdcount % 6) | ||
| + | { | ||
| + | case | ||
| + | lcd_alpha_write_stringf_to(0, | ||
| + | break; | ||
| + | case 1: | ||
| + | lcd_alpha_write_stringf_to(0, | ||
| + | break; | ||
| + | case 2: | ||
| + | lcd_alpha_write_stringf_to(6, | ||
| + | break; | ||
| + | case 3: | ||
| + | lcd_alpha_write_stringf_to(6, | ||
| + | break; | ||
| + | case 4: | ||
| + | lcd_alpha_write_stringf_to(12, | ||
| + | break; | ||
| + | case 5: | ||
| + | lcd_alpha_write_stringf_to(12, | ||
| + | break; | ||
| + | } | ||
| + | lcdcount++; | ||
| - | | + | pin_set_to(led_green, |
| - | chassis_stop(); | + | //pin_toggle(led_green); |
| - | | + | |
| - | | + | // Decide state |
| - | // Clear LEDs. | + | for (i = 0; i < NUM_LOGIC_LIST_ITEMS; |
| - | | + | { |
| - | | + | // Check input conditions match |
| + | if (input_check_value(logic_list[i].input_state, | ||
| + | input_check_value(logic_list[i].input_timer, | ||
| + | input_check_value(logic_list[i].input_encoder_left, | ||
| + | input_check_value(logic_list[i].input_encoder_right, | ||
| + | input_check_value(logic_list[i].input_buttons, | ||
| + | input_check_value(logic_list[i].input_infrared, | ||
| + | input_check_value(logic_list[i].input_ultrasonic, | ||
| + | input_check_value(logic_list[i].input_ball_sensor, | ||
| + | input_check_value(logic_list[i].input_own_goal, | ||
| + | input_check_value(logic_list[i].input_opponent_goal, | ||
| + | { | ||
| - | | + | // Set new state ? |
| - | | + | if (logic_list[i].output_state) |
| - | | + | { |
| + | state | ||
| + | } | ||
| - | | + | // Set timer |
| - | | + | if (logic_list[i].output_timer) |
| - | | + | { |
| - | | + | timeout_start(logic_list[i].output_timer & 0x7FFF); |
| - | | + | } |
| - | work_step_wait(); | + | |
| - | chassis_step_drive(100, | + | |
| - | work_step_wait(); | + | |
| - | chassis_step_drive(-100, | + | |
| - | work_step_wait(); | + | |
| - | chassis_stop(); | + | // Drive ? |
| - | | + | if |
| + | { | ||
| + | chassis_tank_drive((signed char)((logic_list[i].output_drive >> 8) & 0xFF), | ||
| + | | ||
| + | } | ||
| - | search: | + | // Use roller ? |
| + | if (logic_list[i].output_roller) | ||
| + | { | ||
| + | chassis_use_roller(logic_list[i].output_roller & 0x01); | ||
| + | } | ||
| - | | + | // Use red LED ? |
| - | | + | if (logic_list[i].output_led_red) |
| + | { | ||
| + | pin_set_to(led_red, | ||
| + | } | ||
| - | | + | // Use 7-segment display |
| - | | + | if (logic_list[i].output_segment) |
| + | { | ||
| + | segment_display_write(logic_list[i].output_segment & 0xFF); | ||
| + | } | ||
| - | | + | // Remember current ultrasonic reading |
| - | | + | if (logic_list[i].remember_usonic) |
| + | { | ||
| + | usonic_memory = ultrasonic; | ||
| + | } | ||
| + | |||
| + | // Got match | ||
| + | break; | ||
| - | // Wait until any object close enough. | + | } |
| - | while (true) | + | } |
| - | { | + | } |
| - | WORK_CHECK; | + | |
| - | + | ||
| - | // Stumbled upon a random ball ? | + | |
| - | if (sensors_is_ball()) | + | |
| - | { | + | |
| - | goal_to_search = false; | + | |
| - | chassis_use_roller(1); | + | |
| - | chassis_step_drive(90, | + | |
| - | work_step_wait(); | + | |
| - | goto search_goal; | + | |
| - | | + | |
| - | + | ||
| - | // Something on the right ? | + | |
| - | if (sensors_ultrasonic_distance() < 600) | + | |
| - | { | + | |
| - | goto precise_search; | + | |
| - | | + | |
| - | + | ||
| - | // Something in front ? | + | |
| - | if (sensors_infrared_distance() < 200) | + | |
| - | { | + | |
| - | goal_to_search = !goal_to_search; | + | |
| - | goto turn_around; | + | |
| - | } | + | |
| - | + | ||
| - | chassis_drive(90, | + | |
| - | } | + | |
| - | + | ||
| - | precise_search: | + | |
| - | + | ||
| - | // Display mode | + | |
| - | segment_display_write(2); | + | |
| - | + | ||
| - | // Drive slowly for 3s. | + | |
| - | chassis_drive(50, | + | |
| - | timeout_start(5000); | + | |
| - | ball_distance = 10000; | + | |
| - | + | ||
| - | // Drive until distance begins to increase. | + | |
| - | while (true) | + | |
| - | { | + | |
| - | WORK_CHECK; | + | |
| - | + | ||
| - | // Something in front ? | + | |
| - | if (sensors_infrared_distance() < 200) | + | |
| - | { | + | |
| - | goal_to_search = !goal_to_search; | + | |
| - | goto turn_around; | + | |
| - | } | + | |
| - | + | ||
| - | // Timeout ? | + | |
| - | if (timeout_done()) | + | |
| - | { | + | |
| - | if(sensors_ultrasonic_distance() < 600) | + | |
| - | { | + | |
| - | wall_distance = sensors_ultrasonic_distance(); | + | |
| - | chassis_step_drive(0, | + | |
| - | work_step_wait(); | + | |
| - | chassis_step_drive(90, | + | |
| - | work_step_wait(); | + | |
| - | chassis_step_drive(0, | + | |
| - | work_step_wait(); | + | |
| - | } | + | |
| - | else | + | |
| - | goto search; | + | |
| - | } | + | |
| - | + | ||
| - | // Remember closest distance. | + | |
| - | ball_distance = min(ball_distance, | + | |
| - | + | ||
| - | // Robot passed the ball ? | + | |
| - | if (sensors_ultrasonic_distance() > 600 && timeout_get_counter() > 500) | + | |
| - | { | + | |
| - | goto turn_to_ball; | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | turn_to_ball: | + | |
| - | + | ||
| - | // Light LED. | + | |
| - | pin_clear(led_yellow); | + | |
| - | + | ||
| - | // Ball close enough or far away ? | + | |
| - | if (ball_distance < 300) | + | |
| - | { | + | |
| - | // Display mode | + | |
| - | segment_display_write(3); | + | |
| - | + | ||
| - | // Stop. | + | |
| - | chassis_stop(); | + | |
| - | work_delay(300); | + | |
| - | + | ||
| - | // Turn chassis to the right 90 degrees. | + | |
| - | chassis_step_drive(-100, | + | |
| - | work_step_wait(); | + | |
| - | + | ||
| - | // Start roller. | + | |
| - | chassis_use_roller(1); | + | |
| - | + | ||
| - | // Approach ball | + | |
| - | chassis_step_drive(90, | + | |
| - | + | ||
| - | while (!chassis_is_step_drive_complete() && !sensors_is_ball()) | + | |
| - | { | + | |
| - | WORK_CHECK; | + | |
| - | } | + | |
| - | + | ||
| - | // Got the ball ? | + | |
| - | if (sensors_is_ball()) | + | |
| - | { | + | |
| - | chassis_step_drive(90, | + | |
| - | work_step_wait(); | + | |
| - | chassis_stop(); | + | |
| - | work_delay(300); | + | |
| - | goto search_goal; | + | |
| - | } | + | |
| - | // Drive back | + | |
| - | else | + | |
| - | { | + | |
| - | chassis_step_drive(-90, | + | |
| - | work_step_wait(); | + | |
| - | chassis_step_drive(0, | + | |
| - | work_step_wait(); | + | |
| - | goto search; | + | |
| - | } | + | |
| - | } | + | |
| - | // Ball far away ? | + | |
| - | else | + | |
| - | { | + | |
| - | // Display mode | + | |
| - | segment_display_write(4); | + | |
| - | + | ||
| - | // Drive bit more | + | |
| - | chassis_step_drive(90, | + | |
| - | work_step_wait(); | + | |
| - | + | ||
| - | // Turn chassis to the right 90 degrees. | + | |
| - | chassis_step_drive(0, | + | |
| - | work_step_wait(); | + | |
| - | + | ||
| - | // Start driving towards the border. | + | |
| - | chassis_drive(75, | + | |
| - | + | ||
| - | // Stumbled upon a random ball ? | + | |
| - | if (sensors_is_ball()) | + | |
| - | { | + | |
| - | goal_to_search = false; | + | |
| - | chassis_use_roller(1); | + | |
| - | chassis_step_drive(90, | + | |
| - | work_step_wait(); | + | |
| - | goto search_goal; | + | |
| - | } | + | |
| - | + | ||
| - | // Drive until something close enough. | + | |
| - | while (true) | + | |
| - | { | + | |
| - | WORK_CHECK; | + | |
| - | + | ||
| - | // See the ball ? | + | |
| - | if (sensors_ultrasonic_distance() < 300) | + | |
| - | { | + | |
| - | ball_distance = sensors_ultrasonic_distance(); | + | |
| - | // Drive bit more | + | |
| - | chassis_step_drive(75, | + | |
| - | work_step_wait(); | + | |
| - | + | ||
| - | chassis_stop(); | + | |
| - | work_delay(300); | + | |
| - | + | ||
| - | // Turn chassis to the right 90 degrees. | + | |
| - | chassis_step_drive(-100, | + | |
| - | work_step_wait(); | + | |
| - | + | ||
| - | // Start roller. | + | |
| - | chassis_use_roller(1); | + | |
| - | + | ||
| - | // Approach ball | + | |
| - | chassis_step_drive(90, | + | |
| - | + | ||
| - | while (!chassis_is_step_drive_complete() && !sensors_is_ball()) | + | |
| - | { | + | |
| - | WORK_CHECK; | + | |
| - | } | + | |
| - | + | ||
| - | // Got the ball ? | + | |
| - | if (sensors_is_ball()) | + | |
| - | { | + | |
| - | chassis_step_drive(90, | + | |
| - | work_step_wait(); | + | |
| - | chassis_stop(); | + | |
| - | work_delay(300); | + | |
| - | goto search_goal; | + | |
| - | } | + | |
| - | else | + | |
| - | { | + | |
| - | // Go back to search | + | |
| - | wall_distance = sensors_ultrasonic_distance(); | + | |
| - | chassis_step_drive(0, | + | |
| - | work_step_wait(); | + | |
| - | if(wall_distance > 800) | + | |
| - | { | + | |
| - | chassis_step_drive(90, | + | |
| - | work_step_wait(); | + | |
| - | } | + | |
| - | chassis_step_drive(0, | + | |
| - | work_step_wait(); | + | |
| - | goto search; | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | // Too close to wall ? | + | |
| - | if (sensors_infrared_distance() < 150) | + | |
| - | { | + | |
| - | // Reverse drive back to the center and turn left to resume searching | + | |
| - | chassis_stop(); | + | |
| - | work_delay(300); | + | |
| - | chassis_step_drive(0, | + | |
| - | work_step_wait(); | + | |
| - | chassis_step_drive(90, | + | |
| - | work_step_wait(); | + | |
| - | chassis_step_drive(0, | + | |
| - | work_step_wait(); | + | |
| - | goto search; | + | |
| - | } | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | search_goal: | + | |
| - | + | ||
| - | // Display mode | + | |
| - | segment_display_write(5); | + | |
| - | goal_timeout_activated = false; | + | |
| - | + | ||
| - | // Search for goal. | + | |
| - | while (true) | + | |
| - | { | + | |
| - | WORK_CHECK; | + | |
| - | + | ||
| - | // Locate opponent goal. | + | |
| - | dir = beacon_smart_locate_opponent_goal(); | + | |
| - | + | ||
| - | // Got direction ? | + | |
| - | if (dir != -128) | + | |
| - | { | + | |
| - | // Goal on left ? | + | |
| - | if (dir < 0) | + | |
| - | { | + | |
| - | pin_set(led_yellow); | + | |
| - | chassis_drive(0, | + | |
| - | } | + | |
| - | // Goal on right ? | + | |
| - | else if (dir > 0) | + | |
| - | { | + | |
| - | pin_set(led_yellow); | + | |
| - | chassis_drive(0, | + | |
| - | } | + | |
| - | // Goal straight ahead ? | + | |
| - | else | + | |
| - | { | + | |
| - | pin_clear(led_yellow); | + | |
| - | chassis_drive(100, | + | |
| - | // Start timeout | + | |
| - | if(!goal_timeout_activated) | + | |
| - | { | + | |
| - | timeout_start(1000); | + | |
| - | goal_timeout_activated = true; | + | |
| - | } | + | |
| - | } | + | |
| - | } | + | |
| - | // Can't see goal ? | + | |
| - | else | + | |
| - | { | + | |
| - | chassis_drive(0, | + | |
| - | } | + | |
| - | // We're headed straight for goal | + | |
| - | if(goal_timeout_activated && timeout_done() && dir == 0) | + | |
| - | { | + | |
| - | goal_timeout_activated = false; | + | |
| - | goto score_goal; | + | |
| - | } | + | |
| - | // Something' | + | |
| - | if(sensors_infrared_distance() < 250) | + | |
| - | { | + | |
| - | chassis_step_drive(-70, | + | |
| - | work_step_wait(); | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | + | ||
| - | score_goal: | + | |
| - | + | ||
| - | // Display mode | + | |
| - | segment_display_write(6); | + | |
| - | + | ||
| - | chassis_drive(90, | + | |
| - | + | ||
| - | // Reached the goal ? | + | |
| - | while (sensors_infrared_distance() > 300) | + | |
| - | { | + | |
| - | WORK_CHECK; | + | |
| - | } | + | |
| - | + | ||
| - | //if (!pin_get_value(button_mode)) | + | |
| - | if (sensors_infrared_distance() < 300) | + | |
| - | { | + | |
| - | chassis_use_roller(0); | + | |
| - | goal_to_search = true; | + | |
| - | pin_set(led_yellow); | + | |
| - | goto turn_around; | + | |
| - | } | + | |
| - | + | ||
| - | turn_around: | + | |
| - | + | ||
| - | // Display mode | + | |
| - | segment_display_write(7); | + | |
| - | + | ||
| - | chassis_step_drive(0, | + | |
| - | work_step_wait(); | + | |
| - | chassis_stop(); | + | |
| - | work_delay(300); | + | |
| - | + | ||
| - | goto search; | + | |
| - | | + | |
| } | } | ||
| </ | </ | ||
| - | |||
| ===== Montaaž ===== | ===== Montaaž ===== | ||
| Line 715: | Line 569: | ||
| * {{: | * {{: | ||
| - | * {{: | + | * {{: |
| + | * {{: | ||
| + | * {{: | ||
| + | * {{: | ||
| + | * {{: | ||
| ~~CL~~ | ~~CL~~ | ||
| © TTÜ, MTÜ TTÜ Robotiklubi | © TTÜ, MTÜ TTÜ Robotiklubi | ||
| ~~DISCUSSION~~ | ~~DISCUSSION~~ | ||