This shows you the differences between two versions of the page.
| et:projects:soccer_robot [2010/08/01 21:10] – mikk.leini | 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 |
| - | === Riistvara seadistamine === | + | 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 roboti //main// funktsioon kus käivitatakse kõik katkestustel toimuvad protsessid ja täidetakse põhialgoritmi vastavalt olekutabelist loetud väärtustele. Selles funktsioonis asub lõputu tsükkel, mis kontrollib igal läbimisel kõigis tabeli ridades olevaid sisendeid. Kui mõne tabelirea kõigis määratud sisendites on vastav väärtus, siis täidetakse samas reas kirjeldatud väljundite väärtused. Näiteks roboti käivitamiseks nupust on tabeli alguses rida, mille ainsateks sisendtingimusteks on see, et robot on peatatud ning vastavat nuppu on vajutatud. Kui need tingimused on täidetud, määratakse olekuks " | ||
| + | |||
| + | 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 686: | Line 540: | ||
| [{{: | [{{: | ||
| ~~CL~~ | ~~CL~~ | ||
| - | [{{: | + | Edasi tuleks ühendada ultraheli- ja infrapuna kaugusandurid ning palliandur. Infrapuna kaugusanduri ja pallianduri jaoks on tarbis servode pikenduskaablit. Täpsemalt on pesad näidatud piltidel: |
| - | [{{: | + | [{{: |
| - | [{{:images: | + | [{{: |
| - | [{{: | + | ~~CL~~ |
| - | [{{: | + | Viimasena on jäänud ühendada LCD kus kuvatakse programmi töö ajal kõiki andurite näitusid: |
| - | {{: | + | [{{: |
| - | [{{: | + | ~~CL~~ |
| + | **Kaheksas** ja viimane etapp on robotisse akude või patareide laadimine ning selle tööle panek. Akud käivad spetsiaalsesse alusplatvormiga kaasatulevasse rakisesse. Ühendades toitekaabli ja akuploki läheb robot tööle ja sinna saab peale laadida programmi. | ||
| + | [{{: | ||
| + | [{{: | ||
| + | ~~CL~~ | ||
| + | [{{ : | ||
| - | ==== Programmeerimine | + | ===== Video ===== |
| - | + | ||
| - | ==== Video ==== | + | |
| {{youtube> | {{youtube> | ||
| Line 702: | Line 559: | ||
| ===== Soovitused ===== | ===== Soovitused ===== | ||
| - | * Rull teha võimalikult lai, et paremini palle kätte saada. | + | * Rull teha võimalikult lai, et paremini palle kätte saada. Samas tuleb siis ka palliandur ümber teha nii, et LED ja vastuvõtja on haaratsi otses suunatud üksteise vastu ja nad jälgivad kas nende vahele satub pall. |
| * Alusplaadi, rullimehhanismi haaratsi ja andurite kinnituse tegemiseks on soovitatav kasutada materjali, mille painutamisega ei oleks probleeme ning mille puhul ei oleks ohtu, et see painutamisel murdub või paindekohast praguneb. Prototüübi valmistamisel kasutatati 1 mm paksust alumiiniumi, | * Alusplaadi, rullimehhanismi haaratsi ja andurite kinnituse tegemiseks on soovitatav kasutada materjali, mille painutamisega ei oleks probleeme ning mille puhul ei oleks ohtu, et see painutamisel murdub või paindekohast praguneb. Prototüübi valmistamisel kasutatati 1 mm paksust alumiiniumi, | ||
| * Alusplaadi, rullimehhanismi haarasti ja andurite kinnituse tegemiseks on soovitatav kasutada CNC-tööpinki. Sellega tagatakse detailide valmistamisel võimalikult väike eksimisvõimalus (nt avade puurimisel). | * Alusplaadi, rullimehhanismi haarasti ja andurite kinnituse tegemiseks on soovitatav kasutada CNC-tööpinki. Sellega tagatakse detailide valmistamisel võimalikult väike eksimisvõimalus (nt avade puurimisel). | ||
| + | * Programmi kirjutada meetod vastase robotist möödumiseks. Samas eeldab see rohkem andureid, näiteks peegeldusandurit allpool väljaku taset oleva väravapõhja tuvastamiseks. | ||
| ===== Failid ===== | ===== Failid ===== | ||
| Line 712: | Line 569: | ||
| * {{: | * {{: | ||
| - | * Elektriskeemid FIXME | + | * {{: |
| - | * {{: | + | * {{: |
| + | * {{: | ||
| + | * {{: | ||
| + | * {{: | ||
| + | ~~CL~~ | ||
| + | © TTÜ, MTÜ TTÜ Robotiklubi | ||
| ~~DISCUSSION~~ | ~~DISCUSSION~~ | ||