Differences

This shows you the differences between two versions of the page.

Link to this comparison view

et:projects:soccer_robot [2010/08/01 21:46] mikk.leiniet:projects:soccer_robot [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 170: Line 170:
 [{{  :images:projects:soccer_robot:ir_rx_iso.png?200|RC5 vastuvõtja}}] [{{  :images:projects:soccer_robot:ir_rx_iso.png?200|RC5 vastuvõtja}}]
  
-Robotexil on väravate kohale paigutatud infrapuna signaali saatjad, mis edastavad PHILIPS’i RC5 protokolli abil kanaleid 1 kuni 4. Nende signaalide vastuvõtmiseks on tehtud eraldiseisev moodul. Vastuvõtumoodul ühendatakse kodulabori kommunikatsioonimooduliga kaabliga, mille ühendusskeem on välja toodud plokkskeemis. Samas on välja toodud info vastuvõtja olulisemate komponentide kohta.+Robotexil on väravate kohale paigutatud infrapuna signaali saatjad, mis edastavad Philips’i RC5 protokolli abil kanaleid 1 kuni 4. Nende signaalide vastuvõtmiseks on tehtud eraldiseisev moodul. Vastuvõtumoodul ühendatakse kodulabori kommunikatsioonimooduliga kaabliga, mille ühendusskeem on välja toodud plokkskeemis. Samas on välja toodud info vastuvõtja olulisemate komponentide kohta.
  
 Vastuvõtumoodulile on paigutatud kaks signaali vastuvõtjat/demoduleerijat. Tänu sellele on võimalik paika panna roboti asend väravate suhtes.  Vastuvõtumoodulile on paigutatud kaks signaali vastuvõtjat/demoduleerijat. Tänu sellele on võimalik paika panna roboti asend väravate suhtes. 
  
-Vastuvõtja saadab välja UART pakette, milles sisaldub infrapunavastuvõtja indeks ning vastuvõetud kanal. Väljasaadetavate UART pakettide kirjeldused on välja toodud allpol olevates  +Vastuvõtja saadab 4800 bps kiirusel välja 1-baidiseid UART sõnumeid, milles sisaldub infrapunavastuvõtja indeks ning vastuvõetud kanal. Väljasaadetavate UART sõnumite kirjeldused on välja toodud allpool olevates tabelites:
-tabelites +
-[{{  :images:projects:soccer_robot:rc5_plokkskeem.png?200|RC5 vastuvõtja plokkskeem}}]+
  
-Vastuvõtja indeksiga 0 +**Vastuvõtja indeksiga 0 (vasakpoolne)**  [{{  :images:projects:soccer_robot:rc5_plokkskeem.png?150|RC5 vastuvõtja plokkskeem}}] 
-^ Kanal     ^ Kaheksandiksüsteemis (HEX)       ^ Kahendsüsteemis(BIN)          ^+ 
 +^ Kanal     ^ Kaheksandiksüsteemis(HEX)       ^ Kahendsüsteemis(BIN)          ^
 | 1   | 0x01     | 0b00000001 | | 1   | 0x01     | 0b00000001 |
 | 2   | 0x02     | 0b00000010 | | 2   | 0x02     | 0b00000010 |
 | 3   | 0x03     | 0b00000011 | | 3   | 0x03     | 0b00000011 |
-  | 0x04     | 0b00000100 |+  | 0x04     | 0b00000100 |
  
-Vastuvõtja indeksiga 1 +**Vastuvõtja indeksiga 1 (parempoolne)** 
-^ Kanal     ^ Kaheksandiksüsteemis (HEX)       ^ Kahendsüsteemis(BIN)          ^+^ Kanal     ^ Kaheksandiksüsteemis(HEX)      ^ Kahendsüsteemis(BIN)          ^
 | 1   | 0x11     | 0b00010001 | | 1   | 0x11     | 0b00010001 |
 | 2   | 0x12     | 0b00010010 | | 2   | 0x12     | 0b00010010 |
 | 3   | 0x13     | 0b00010011 | | 3   | 0x13     | 0b00010011 |
-  | 0x14     | 0b00010100 |+  | 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 "Failid"
 + [{{:images:projects:soccer_robot:rc5_vastuvotja_skeem.png?200|RC5 vastuvõtja skeem}}][{{:images:projects:soccer_robot:rc5_vastuvotja_plaat.png?200|RC5 vastuvõtja trükkplaat}}]
  
 === 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 ja kus asub ka roboti algoritm.+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 algoritm asub samas failis olevas suures olekutabelis.
  
-Programm on üles ehitatud võimalikult lihtsal kujul. Kui hea praktika kohasel on soovitatav teha juhtalgoritmid olekumasina põhjal, siis siin tulnuks olekuid ja olekute vahelisi siirdeid nii palju, et programmikood oleks liiga segaseks läinud. Seepärast on kogu algoritm kirjutatud järjestikuse koodijadana. Selleks, et algoritmis saaks kiirelt ja mugavalt lugeda andurite näite, juhtida mootoreid ja kuvada infot, on kõik muud protsessid toimima pandud katkestuste pealt. Katkestuste pealt töötades ei sega mõõtmis- ja juhtimisprotsessid algoritmi tööd ja vastupidi - need toimuvad paralleelselt. +Programm on üles ehitatud tavapärase olekumasina eeskujulkuid et kood liiga pikaks ei läheks ning kogu algoritm ühes kohas koos oleks, kasutatakse sisendite kontrolliks ja väljundite juhtimiseks ühtset suurt tabelit. Selleks, et algoritmis saaks kiirelt ja mugavalt lugeda andurite näite, juhtida mootoreid ja kuvada infot, on kõik muud protsessid toimima pandud katkestuste pealt. Katkestuste pealt töötades ei sega mõõtmis- ja juhtimisprotsessid algoritmi tööd ja vastupidi - need toimuvad paralleelselt.
  
-Järgnevalt on toodu roboti //main// funktsioon kus käivitatakse kõik katkestustel toimuvad protsessid ja alustatakse algoritmi täitmistSellekset 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 vajutamisenullitakse ka töötamist näitav muutuja ja algoritm hüppab //goto// käsuga uuesti algusesse//goto// on jällegi üpris harv nähtusaga siinkohal on see üpris asjakohane käsk.+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/väljundite võimaldamiseks kasutatakse tabelis makrokäsklusi. Järgnevalt on kasutatavad käsklused lahti seletatud. 
 + 
 +^ 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/sisse | 
 +| LED(0/1) | Lülitab LED'i välja/sisse | 
 +| SEG(0-9) | Seab 7-segmendilise indikaatori näidatava väärtuse 0-9 | 
 + 
 +<code c> 
 +// 
 +// Input-output logic list 
 +// This table does all the "thinking" 
 +//  
 +logic_step logic_list[] = 
 +
 +//    INPUT                                                                                         OUTPUT 
 +//    STATE     TIMER          CODEL          CODER  BUTTN     IRRED     USONI  BALLS    OWN   OPPO     STATE      TIMER        CHASSIS  ROLLER  SEGMNT  LEDRED  US M+ 
 +  { EQ(  1),        0,             0,             0, BM(1),        0,        0,     0,     0,     0, STA(  2),         0,              0,      0,      0, LED(1),    0 },  // Start command 
 +  {       0,        0,             0,             0, BM(4),        0,        0,     0,     0,     0, STA(  1),         0, DRV(   0,   0), ROL(0), SEG(0), LED(0),    0 },  // Stop command 
 +  // --- Drive to the center ------------------------------------------------------------------------------------------------------------------------------------------ 
 +  { EQ(  2),        0,             0,             0,     0,        0,        0,     0,     0,     0, STA(  3),         0, DRV(-100, 100),      0,      0,      0, true }, 
 +  { EQ(  3),        0,             0,        GT(18),     0,        0,        0,     0,     0,     0, STA(  4),         0, DRV( 100, 100),      0,      0,      0,    0 },   
 +  { EQ(  4),        0,     CSB(1000),     CSB(1000),     0,        0,        0,     0,     0,     0, STA(  5),         0, DRV( 100,-100),      0,      0,      0,    0 }, 
 +  { EQ(  5),        0,        GT(18),             0,     0,        0,        0,     0,     0,     0, STA( 10),         0, DRV(   0,   0),      0,      0,      0,    0 }, 
 +  // --- Start searching ---------------------------------------------------------------------------------------------------------------------------------------------- 
 +  { EQ( 10),        0,             0,             0,     0,        0,        0,     0,     0,     0, STA( 11),         0, DRV( 100, 100), ROL(0), SEG(1),      0,    0 }, 
 +  { EQ( 11),        0,             0,             0,     0,        0,        0, EQ(1),     0,     0, STA( 90),         0,              0,      0,      0,      0,    0 },  // Found a random ball 
 +  { EQ( 11),        0,             0,             0,     0,        0, LT( 600),     0,     0,     0, STA( 20),         0, DRV(   0,   0),      0,      0,      0,    0 },  // Sudden closer distance on the right, investigate 
 +  { EQ( 11),        0,             0,             0,     0, LT( 200),        0,     0,     0,     0, STA(100),         0, DRV(   0,   0),      0,      0,      0,    0 },  // Something's in the way, turn around 
 +  // --- Precise search ----------------------------------------------------------------------------------------------------------------------------------------------- 
 +  { EQ( 20),        0,             0,             0,     0,        0,        0,     0,     0,     0, STA( 21), TMR(5000), DRV(  50,  50),      0, SEG(2),      0,    0 }, 
 +  { EQ( 21),        0,             0,             0,     0,        0,        0, EQ(1),     0,     0, STA( 90),         0,              0,      0,      0,      0,    0 },  // Found a random ball 
 +  { EQ( 21),        0,             0,             0,     0, LT( 200),        0,     0,     0,     0, STA(100),         0, DRV(   0,   0),      0,      0,      0,    0 },  // Something's in the way, turn around 
 +  { EQ( 21), EQ(   0),             0,             0,     0,        0, LT( 600),     0,     0,     0, STA( 22),         0, DRV(   0,   0),      0,      0,      0,    0 },  // Suspected ball seems to be a wall instead 
 +  { EQ( 21), EQ(   0),             0,             0,     0,        0, GT( 599),     0,     0,     0, STA( 10),         0,              0,      0,      0,      0,    0 },  // Didn't recognize a ball, return to search 
 +  { EQ( 21), LT(4500),             0,             0,     0,        0, GT( 599),     0,     0,     0, STA( 30),         0, DRV(   0,   0),      0,      0,      0, true },  // Identified a ball, go get it  
 +  { EQ( 22),        0,             0,             0,     0,        0,        0,     0,     0,     0, STA( 23),         0, DRV(-100, 100),      0,      0,      0, true },  // Try to get away from the wall 
 +  { EQ( 23),        0,             0,        GT(18),     0,        0,        0,     0,     0,     0, STA( 24),         0, DRV( 100, 100),      0,      0,      0,    0 }, 
 +  { EQ( 24),        0,      CSB(750),      CSB(750),     0,        0,        0,     0,     0,     0, STA( 25),         0, DRV( 100,-100),      0,      0,      0,    0 }, 
 +  { EQ( 25),        0,        GT(18),             0,     0,        0,        0,     0,     0,     0, STA( 10),         0, DRV(   0,   0),      0,      0,      0,    0 },  // Resume search 
 +  // --- Turn to ball ------------------------------------------------------------------------------------------------------------------------------------------------- 
 +  { EQ( 30),        0,             0,             0,     0,        0,        0,     0,     0,     0, STA( 31),         0, DRV( 100, 100), ROL(1), SEG(3),      0,    0 }, 
 +  { EQ( 31),        0,             0,             0,     0,        0,        0, EQ(1),     0,     0, STA( 90),         0,              0,      0,      0,      0,    0 },  // Found a random ball 
 +  { EQ( 31),        0,  GT(MTS(150)),  GT(MTS(150)),     0,        0,        0,     0,     0,     0, STA( 32),         0, DRV( 100,-100),      0,      0,      0,    0 },  // Turn right 
 +  { EQ( 32),        0,        GT(18),             0,     0,        0,        0,     0,     0,     0, STA( 33),         0, DRV(  75,  75),      0,      0,      0,    0 },  // Start driving towards the wall 
 +  { EQ( 33),        0,             0,             0,     0, LT( 150),        0,     0,     0,     0, STA( 40),         0, DRV(-100, 100), ROL(0),      0,      0,    0 },  // Wall too close, turn around and get back to the center 
 +  { EQ( 33),        0,             0,             0,     0,        0, LT( 300),     0,     0,     0, STA( 34),         0, DRV( 100, 100),      0,      0,      0, true },  // Spotted the ball 
 +  { EQ( 34),        0,  GT(MTS( 50)),  GT(MTS( 50)),     0,        0,        0,     0,     0,     0, STA( 35),         0, DRV( 100,-100),      0,      0,      0,    0 },  // Turn towards the ball 
 +  { EQ( 35),        0,        GT(18),             0,     0,        0,        0,     0,     0,     0, STA( 36),         0, DRV(  90,  90),      0,      0,      0,    0 }, 
 +  { EQ( 36),        0,       CSM(50),       CSM(50),     0,        0,        0, EQ(1),     0,     0, STA( 90),         0,              0,      0,      0,      0,    0 },  // Caught the ball 
 +  { EQ( 36),        0,       CSM(50),       CSM(50),     0,        0,        0, EQ(0),     0,     0, STA( 45),         0, DRV(   0,   0),      0,      0,      0,    0 },  // Didn't get the ball 
 +  { EQ( 40),        0,             0,        GT(34),     0,        0,        0,     0,     0,     0, STA( 41),         0, DRV( 100, 100),      0,      0,      0,    0 }, 
 +  { EQ( 41),        0,  GT(MTS(700)),  GT(MTS(700)),     0,        0,        0,     0,     0,     0, STA( 42),         0, DRV( 100,-100),      0,      0,      0,    0 }, 
 +  { EQ( 42),        0,        GT(18),             0,     0,        0,        0,     0,     0,     0, STA( 10),         0, DRV(   0,   0),      0,      0,      0,    0 },  // Resume search 
 +  { EQ( 45),        0,             0,             0,     0,        0, LT( 801),     0,     0,     0, STA( 46),         0, DRV( 100,-100),      0,      0,      0,    0 },  // Drive back to the center 
 +  { EQ( 45),        0,             0,             0,     0,        0, GT( 800),     0,     0,     0, STA( 47),         0, DRV( 100,-100),      0,      0,      0, true }, 
 +  { EQ( 46),        0,        GT(18),             0,     0,        0,        0,     0,     0,     0, STA( 49),         0, DRV( 100,-100),      0,      0,      0,    0 }, 
 +  { EQ( 47),        0,        GT(18),             0,     0,        0,        0,     0,     0,     0, STA( 48),         0, DRV( 100, 100),      0,      0,      0,    0 }, 
 +  { EQ( 48),        0,      CSB(800),      CSB(800),     0,        0,        0,     0,     0,     0, STA( 46),         0, DRV( 100,-100),      0,      0,      0,    0 }, 
 +  { EQ( 49),        0,        GT(18),             0,     0,        0,        0,     0,     0,     0, STA( 10),         0, DRV(   0,   0),      0,      0,      0,    0 },  // Return to search 
 +  // --- Locate the goal ---------------------------------------------------------------------------------------------------------------------------------------------- 
 +  { EQ( 90),        0,             0,             0,     0,        0,        0,     0,     0,     0, STA( 91),         0, DRV(  50,  50), ROL(1), SEG(4),      0,    0 }, 
 +  { EQ( 91),        0,  GT(MTS( 50)),  GT(MTS( 50)),     0,        0,        0,     0,     0,     0, STA( 92), TMR(1000), DRV( -70,  70),      0,      0,      0,    0 }, 
 +  { EQ( 92),        0,             0,             0,     0,        0,        0,     0,     0, LT(0),        0,         0, DRV( -70,  70),      0,      0,      0,    0 },  // Goal to the left 
 +  { EQ( 92),        0,             0,             0,     0,        0,        0,     0,     0, GT(0),        0,         0, DRV(  70, -70),      0,      0,      0,    0 },  // Goal to the right 
 +  { EQ( 92), EQ(   0),             0,             0,     0,        0,        0,     0,     0, EQ(0), STA( 95),         0, DRV( 100, 100),      0,      0,      0,    0 },  // Goal straight ahead 
 +  // --- Score the goal ----------------------------------------------------------------------------------------------------------------------------------------------- 
 +  { EQ( 95),        0,             0,             0,     0,        0,        0,     0,     0,     0, STA( 96),         0, DRV( 100, 100),      0, SEG(5),      0,    0 }, 
 +  { EQ( 96),        0,             0,             0,     0, LT( 300),        0,     0,     0,     0, STA(100),         0, DRV(   0,   0), ROL(0),      0,      0,    0 },  // Goal scored, turn around 
 +  // --- Turn around -------------------------------------------------------------------------------------------------------------------------------------------------- 
 +  { EQ(100),        0,             0,             0,     0,        0,        0,     0,     0,     0, STA(101),         0, DRV(-100, 100),      0, SEG(6),      0,    0 }, 
 +  { EQ(101),        0,        GT(34),             0,     0,        0,        0,     0,     0,     0, STA( 10),         0, DRV(   0,   0),      0,      0,      0,    0 } 
 +}; 
 +</code> 
 + 
 +Järgnevalt on toodud roboti //main// funktsioon kus käivitatakse kõik katkestustel toimuvad protsessid ja täidetakse põhialgoritmi vastavalt olekutabelist loetud väärtusteleSelles 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äärtussiis täidetakse samas reas kirjeldatud väljundite väärtusedNäiteks roboti käivitamiseks nupust on tabeli alguses ridamille ainsateks sisendtingimusteks on see, et robot on peatatud ning vastavat nuppu on vajutatud. Kui need tingimused on täidetud, määratakse olekuks "2" ning robot hakkab palliotsimisprotsessiga pihta. 
 + 
 +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 short ball_distance+ unsigned char i; 
-    unsigned short wall_distance+ unsigned short timer
-    signed char dir+ 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 
-    init();+ unsigned short state = 1;
  
-    // Endless loop. + // LCD counter 
-    while (true) + unsigned short lcdcount = 0;
-    {+
  
-start:+  // Initialize hardware. 
 + init();
  
-        // Display mode + // Loop forever 
-        segment_display_write(0);+ while (true) 
 + {  
 + // Read sensor values 
 + chassis_get_steps(&encoder_left, &encoder_right); 
 + timer       = timeout_get_counter();    
 + buttons     = sensors_buttons(); 
 + infrared    = sensors_infrared_distance(); 
 + ultrasonic  = sensors_ultrasonic_distance(); 
 + ball        = sensors_is_ball(); 
 + own_goal    = beacon_locate_own_goal(); 
 + target_goal = beacon_locate_opponent_goal(); 
 +  
 + // Display ultrasonic distance. 
 + switch (lcdcount % 6) 
 +
 + case 0
 + lcd_alpha_write_stringf_to(0,  0, "U%04d ", ultrasonic)
 + break; 
 + case 1: 
 + lcd_alpha_write_stringf_to(0,  1, "I%04d ", infrared); 
 + break; 
 + case 2: 
 + lcd_alpha_write_stringf_to(6,  0, "M%03d ", own_goal); 
 + break; 
 + case 3: 
 + lcd_alpha_write_stringf_to(6,  1, "O%03d ", target_goal); 
 + break; 
 + case 4: 
 + lcd_alpha_write_stringf_to(12, 0, "L%03d ", encoder_left); 
 + break; 
 + case 5: 
 + lcd_alpha_write_stringf_to(12, 1, "R%03d ", encoder_right); 
 + break; 
 +
 + lcdcount++;
  
-        // Stop motors.        + pin_set_to(led_green, !ball); 
-        chassis_stop(); + //pin_toggle(led_green); 
-        chassis_use_roller(0)+  
-        + // Decide state 
-        // Clear LEDs+ for (i = 0; i < NUM_LOGIC_LIST_ITEMS; i++) 
-        pin_set(led_red); + { 
-        pin_set(led_yellow)      + // Check input conditions match 
 + if (input_check_value(logic_list[i].input_state,         state) && 
 + input_check_value(logic_list[i].input_timer,         timer&& 
 + input_check_value(logic_list[i].input_encoder_left,  encoder_left&& 
 + input_check_value(logic_list[i].input_encoder_right, encoder_right) && 
 + input_check_value(logic_list[i].input_buttons,       buttons) && 
 + input_check_value(logic_list[i].input_infrared,      infrared) && 
 + input_check_value(logic_list[i].input_ultrasonic,    ultrasonic) && 
 + input_check_value(logic_list[i].input_ball_sensor,   ball) && 
 + input_check_value(logic_list[i].input_own_goal,      own_goal) && 
 + input_check_value(logic_list[i].input_opponent_goal, target_goal)) 
 + {
  
-        // Wait until start button pressed. + // Set new state ? 
-        while (pin_get_value(button_start)); + if (logic_list[i].output_state
-        working true      +
 + state logic_list[i].output_state & 0x7FFF; 
 + }
  
-        // Drive to the center + // Set timer 
-        wall_distance = sensors_ultrasonic_distance(); + if (logic_list[i].output_timer
-        chassis_step_drive(100, 0, MM_TO_STEPS(50)); + { 
-        work_step_wait(); + timeout_start(logic_list[i].output_timer & 0x7FFF); 
-        chassis_step_drive(100, -100, 20); + }
-        work_step_wait(); +
-        chassis_step_drive(100, 0, MM_TO_STEPS(1000 - wall_distance)); +
-        work_step_wait(); +
-        chassis_step_drive(-100, 100, 21); +
-        work_step_wait();+
  
-        chassis_stop(); + // Drive ? 
-        work_delay(300);+ if (logic_list[i].output_drive
 +
 + chassis_tank_drive((signed char)((logic_list[i].output_drive >> 8) & 0xFF), 
 +                    (signed char)( logic_list[i].output_drive       & 0xFF)); 
 + }
  
-search:+ // Use roller ? 
 + if (logic_list[i].output_roller) 
 +
 + chassis_use_roller(logic_list[i].output_roller & 0x01); 
 + }
  
-        // Display mode + // Use red LED ? 
-        segment_display_write(1);+ if (logic_list[i].output_led_red) 
 +
 + pin_set_to(led_red, !(logic_list[i].output_led_red & 0x01)); 
 + }
  
-        // Stop the roller + // Use 7-segment display 
-        chassis_use_roller(0);+ if (logic_list[i].output_segment) 
 +
 + segment_display_write(logic_list[i].output_segment & 0xFF); 
 + }
  
-        // Search by driving. + // Remember current ultrasonic reading 
-        chassis_drive(90, 0);+ 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, 0, MM_TO_STEPS(50)); +
-                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, 0); +
-        } +
- +
-precise_search: +
- +
-        // Display mode +
-        segment_display_write(2); +
- +
-        // Drive slowly for 3s. +
-        chassis_drive(50, 0); +
-        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, -100, 10); +
-                    work_step_wait(); +
-                    chassis_step_drive(90, 0, MM_TO_STEPS(750 - wall_distance)); +
-                    work_step_wait(); +
-                    chassis_step_drive(0, 100, 10); +
-                    work_step_wait(); +
-                } +
-                else +
-                    goto search; +
-            } +
- +
-            // Remember closest distance. +
-            ball_distance = min(ball_distance, sensors_ultrasonic_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, 100, 19); +
-            work_step_wait();        +
- +
-            // Start roller. +
-            chassis_use_roller(1); +
- +
-            // Approach ball +
-            chassis_step_drive(90, 0, MM_TO_STEPS(ball_distance + 150)); +
- +
-            while (!chassis_is_step_drive_complete() && !sensors_is_ball()) +
-            { +
-                WORK_CHECK;                +
-            }            +
- +
-            // Got the ball ? +
-            if (sensors_is_ball()) +
-            { +
-                chassis_step_drive(90, 0, MM_TO_STEPS(50)); +
-                work_step_wait(); +
-                chassis_stop(); +
-                work_delay(300); +
-                goto search_goal; +
-            } +
-            // Drive back +
-            else +
-            { +
-                chassis_step_drive(-90, 0, MM_TO_STEPS(ball_distance + 50)); +
-                work_step_wait(); +
-                chassis_step_drive(0, -100, 10); +
-                work_step_wait(); +
-                goto search; +
-            } +
-        } +
-        // Ball far away ? +
-        else +
-        { +
-            // Display mode +
-            segment_display_write(4); +
- +
-            // Drive bit more +
-            chassis_step_drive(90, 0, MM_TO_STEPS(150)); +
-            work_step_wait();    +
- +
-            // Turn chassis to the right 90 degrees. +
-            chassis_step_drive(0, 100, 10); +
-            work_step_wait();    +
- +
-            // Start driving towards the border. +
-            chassis_drive(75, 0);        +
- +
-            // Stumbled upon a random ball ? +
-            if (sensors_is_ball()) +
-            { +
-                goal_to_search = false; +
-                chassis_use_roller(1); +
-                chassis_step_drive(90, 0, MM_TO_STEPS(50)); +
-                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, 0, MM_TO_STEPS(50)); +
-                    work_step_wait(); +
- +
-                    chassis_stop(); +
-                    work_delay(300); +
- +
-                    // Turn chassis to the right 90 degrees. +
-                    chassis_step_drive(-100, 100, 18); +
-                    work_step_wait();        +
- +
-                    // Start roller. +
-                    chassis_use_roller(1); +
- +
-                    // Approach ball +
-                    chassis_step_drive(90, 0, MM_TO_STEPS(ball_distance + 50)); +
- +
-                    while (!chassis_is_step_drive_complete() && !sensors_is_ball()) +
-                    { +
-                        WORK_CHECK;                +
-                    } +
- +
-                    // Got the ball ? +
-                    if (sensors_is_ball()) +
-                    { +
-                        chassis_step_drive(90, 0, MM_TO_STEPS(50)); +
-                        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, 100, 10); +
-                        work_step_wait(); +
-                        if(wall_distance > 800) +
-                        { +
-                            chassis_step_drive(90, 0, MM_TO_STEPS(wall_distance - 800)); +
-                            work_step_wait(); +
-                        } +
-                        chassis_step_drive(0, 100, 10); +
-                        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, 100, 20); +
-                    work_step_wait(); +
-                    chassis_step_drive(90, 0, MM_TO_STEPS(700)); +
-                    work_step_wait(); +
-                    chassis_step_drive(0, 100, 10); +
-                    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, -70); +
-                } +
-                // Goal on right ? +
-                else if (dir > 0) +
-                { +
-                    pin_set(led_yellow); +
-                    chassis_drive(0, 70); +
-                } +
-                // Goal straight ahead ? +
-                else +
-                { +
-                    pin_clear(led_yellow); +
-                    chassis_drive(100, 0); +
-                    // Start timeout +
-                    if(!goal_timeout_activated) +
-                    { +
-                        timeout_start(1000); +
-                        goal_timeout_activated = true; +
-                    } +
-                } +
-            } +
-            // Can't see goal ? +
-            else +
-            { +
-                chassis_drive(0, -70); +
-            } +
-            // We're headed straight for goal +
-            if(goal_timeout_activated && timeout_done() && dir == 0) +
-            { +
-                goal_timeout_activated = false; +
-                goto score_goal; +
-            } +
-            // Something's in front of us +
-            if(sensors_infrared_distance() < 250) +
-            { +
-                chassis_step_drive(-70, 0, MM_TO_STEPS(200)); +
-                work_step_wait(); +
-            } +
-        } +
- +
- +
-score_goal: +
- +
-        // Display mode +
-        segment_display_write(6); +
- +
-        chassis_drive(90, 0); +
- +
-        // 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, 100, 20); +
-        work_step_wait(); +
-        chassis_stop(); +
-        work_delay(300); +
-    +
-        goto search; +
-    }+
 } }
 </code> </code>
- 
  
 ===== Montaaž ===== ===== Montaaž =====
Line 715: Line 569:
  
   * {{:images:projects:soccer_robot:joonised_mudel.rar|Mudelid ja joonised}}   * {{:images:projects:soccer_robot:joonised_mudel.rar|Mudelid ja joonised}}
-  * {{:images:projects:soccer_robot:soccer_robot_software.zip|Programm}} +  * {{:images:projects:soccer_robot:soccer_robot_software.zip|Funktsioonidega programm}} 
 +  * {{:images:projects:soccer_robot:soccer_robot_table_based.zip|Tabelitega programm}} 
 +  * {{:images:projects:soccer_robot:skeem.zip|RC5 vastuvõtja skeemi ja trükkplaadi joonised}} 
 +  * {{:images:projects:soccer_robot:tarkvara.zip|RC5 vastuvõtja tarkvara}} 
 +  * {{:images:projects:soccer_robot:rc5_komponendid.rar| RC5 vastuvõtja komponentide nimistu}}
 ~~CL~~ ~~CL~~
 © TTÜ, MTÜ TTÜ Robotiklubi © TTÜ, MTÜ TTÜ Robotiklubi
  
 ~~DISCUSSION~~ ~~DISCUSSION~~
et/projects/soccer_robot.1280699202.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0