This shows you the differences between two versions of the page.
| et:projects:soccer_robot [2010/10/31 18:06] – mikk.leini | et:projects:soccer_robot [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Jalgpallirobot ====== | ||
| + | ===== Taust ===== | ||
| + | |||
| + | Järgnev õpetus on koostatud TTÜ avatud ülikooli ja MTÜ TTÜ Robotiklubi koostöös eesmärgiga aidata Robotexil osalevaid või seda plaanivaid võistkondi. | ||
| + | |||
| + | Robotex on eesti suurim ja populaarseim võistlus, mis leiab aset igal aastal novembris või detsembris Tallinnas. Võistlusel on ette antud lähteülesanne, | ||
| + | |||
| + | Käesolev juhend sisaldab täielikku dokumentatsiooni ja praktilisi näpunäiteid ühe Robotex 2010 reeglitele vastava roboti ehitamiseks. Robot on oma ülesehituselt ja võimetelt ette nähtud juuniorite klassis osalemiseks, | ||
| + | |||
| + | Juhendi baasil loodud platvormi eesmärgiks on olla lihtne ning odav esimene katsetus robotite ehitamise vallas. Sellest lähtuvalt kasutatakse laialt saadaolevaid konstruktsioonimaterjale ning elektroonikakomponente. Roboti baaskomponentideks on valitud Kodulabori komplektis sisalduvad moodulid. Kuna kõiki komponente kodulaborites siiski ei leidu, lisanduvad mõningad spetsiifilised osad. Tänu moodularhitektuurile võib iga soovija robotit muuta vastavalt oma äranägemisele. | ||
| + | |||
| + | ===== Kontseptsioon ===== | ||
| + | |||
| + | Kuna ilma pilditöötluseta ja kallite laserkaugumõõdikuteta on pallide leidmine väljakult tehniliselt üsna keerukas, tuleb minna lihtsama vastupanu teed ja kaugelt avastamise asemel palle aktiivselt ringi sõites otsida. Selleks on roboti algoritmis ette nähtud väljakul edasi-tagasi sõitmine ja pallide juhuslik avastamine. | ||
| + | |||
| + | ~~CL~~ | ||
| + | [{{ : | ||
| + | ~~CL~~ | ||
| + | |||
| + | Robot kasutab pallide leidmiseks ultraheli kaugusandurit. Andur on asetatud mõõtma kaugust roboti parema külje peale. Pallide otsimiseks sõidab robot väljaku keskel ühe värava juures teise juurde ja mõõdab pidevalt temast paremale jäävate objektide kaugust. Kui roboti ja seina vahele jääb pall siis kauguse näit väheneb ja robot võtab hoo maha, et vaikselt liikudes pallist mööduda nii, et kaugusanduri näit jälle suureneks. Sedasi saab robot üpris täpselt palli kõrvale sõita. | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Edasi on põhimõtteliselt lihtne - robotil tuleks keerata 90 kraadi paremale ja sõita pallini, kuid paraku ei ole palli kõrvale seisma jäämine ja pööre nii täpne, et robot saaks kätte poole meetri kaugusel oleva palli. Selleks on pärast palli avastamist kaks varianti: kohe palli püüdma minek või selle lähemalt otsimine. Kui pall asub robotist kuni 30 cm kaugusel pöörab robot kohe palli poole ja üritab selle kätte saada nii nagu on näidatud ka järgneval skeemil: | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Kui pall asub kaugemal kui 30 cm siis robot sõidab esmalt edasi veel 10 cm, siis pöördub 90 kraadi paremale ja hakkab otse seina suunas sõites ultrahelianduriga otsima palli mis peaks robotist taaskord paremat kätt olema. Nii kui ultraheliandur näeb lähedal olevat objekti, sõidab robot natuke edasi, pöördub teist korda 90 kraadi paremale ja saab palli üsna nina alt kätte. Seda kauge palli leidmise algoritmi iseloomustab järgnev skeem: | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Robot saab pallianduri abil aru kas ta on palli kätte saanud või mitte. Palli püüdmiseks on roboti ninas V-kujuline lehter ja selle kohal pöörlev kummist rull mis paneb lehtrisse sattunud palli pöörlema roboti suunas. Palli pööritamine takistab selle minema veeremist roboti liikumise ajal. | ||
| + | |||
| + | Pärast palli kättesaamist hakkab robot otsima vastase väravat kuhu pall toimetada. Värava leidmiseks on väravate kohal infrapuna (IR) majakad mis kiirgavad väljaku suunas RC5 protokolliga signaale, ehk põhimõtteliselt on saatjad justkui telekapuldid. Värava leidmiseks on robotil kahe kanaliga RC5 vastuvõtja millel on kahe infrapuna detektori vahel sein. Kui vastuvõtja on suunatud majaka suunas, kiirgab majakas mõlemasse detektorisse; | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Roboti ees on ~8 cm kõrgusel infrapuna kaugusandur, | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Löögimehhanism pallide kaugel väravasse löömiseks puudub, kuna see on tehniliselt keerukas ja otseselt pole seda vaja. Pärast palli vastase väravasse lükkamist hakkab robot palle otsima oma värava suunas liikudes. | ||
| + | |||
| + | ===== Dokumentatsioon ===== | ||
| + | |||
| + | ==== Komponentide nimekiri ==== | ||
| + | |||
| + | ^ Komponent | ||
| + | | Veermik | ||
| + | | Alusplaat | ||
| + | | Haarats | ||
| + | | Mootor | ||
| + | | Rull | Palli keerutamiseks | ||
| + | | Kummirõngas | ||
| + | | Kodulabori Kontrollermoodul | ||
| + | | Kodulabori Mootorite moodul | ||
| + | | Kodulabori Andurite moodul | ||
| + | | Kodulabori Kommunikatsioonimoodul | RC5 vastuvõtjaga suhtlemiseks | ||
| + | | Ultraheli kaugusandur | ||
| + | | Infrapuna kaugusandur | ||
| + | | Kooder | ||
| + | | Palliandur | ||
| + | | M3x6 polt | Komponentide kinnitamiseks | ||
| + | | M3x10 polt | Koodrite kinnitamiseks | ||
| + | | Mutter | ||
| + | | Seib | Komponentide kinnitamiseks | ||
| + | |||
| + | ==== Konstruktsioon==== | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Jalgpalliroboti keskseks osaks on Pololu RP5 lintidega veermik sellele kinnitatava alusplaadiga. Alusplaadi külge kinnitatakse omakorda rullimehhanism, | ||
| + | |||
| + | ===Veermik=== | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Alusplatvormina kasutatakse Pololu RP5 lintidega veermikku. Veermikuga on kaasas kaks alalisvoolumootorit, | ||
| + | |||
| + | ===Alusplaat=== | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Alusplaat seob omavahel jalgpalliroboti kõiki detaile. | ||
| + | |||
| + | ~~CL~~ | ||
| + | |||
| + | ===Rullimehhanism=== | ||
| + | |||
| + | [{{ : | ||
| + | Rullimehhanism koosneb haaratsist, rullist, rulli kummirõngastest, | ||
| + | |||
| + | ~~CL~~ | ||
| + | |||
| + | ==Haarats== | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Haarats seob omavahel rullimehhanismi kõiki komponente. Haaratsi külge kinnitatakse alalisvoolumootor, | ||
| + | |||
| + | ~~CL~~ | ||
| + | |||
| + | ==Rull== | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Rulli tööpõhimõte seisneb palli sellisel viisil pöörlema panemises, et see kogu aeg roboti poole veereks . Rulli diameeter on 20 mm ja laius 50 mm. Rulli ühte otsa on puuritud auk mootori võlli jaoks ning sellega risti on puuritud ja keermestatud teine auk, mille kaudu poldi abil rull võlli külge fikseeritakse. | ||
| + | |||
| + | ==Kummirõngad== | ||
| + | |||
| + | Rullile | ||
| + | |||
| + | ~~CL~~ | ||
| + | |||
| + | ===Andurite kinnitus=== | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Infrapuna kaugusanduri ning RC5 vastuvõtja kinnitamiseks on lihtne U-kujulise profiiliga kinnitus. | ||
| + | |||
| + | ~~CL~~ | ||
| + | |||
| + | ===Kodulabori moodulid=== | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Patareihoidiku väljavõtmise võimaldamiseks on Kodulabori moodulid paigaldatud alusplaadile puksidega. Alusplaadil on moodulite kinnitamiseks puuritud vastavad augud. | ||
| + | |||
| + | ~~CL~~ | ||
| + | |||
| + | ==== Elekter ==== | ||
| + | |||
| + | === Kodulabori moodulid === | ||
| + | Roboti ehitamiseks kasutatakse Kodulabori täiskomplekti, | ||
| + | * AVR ATmega128 arendusplaat (kontroller) | ||
| + | * Kasutajaliides ehk sisend-väljundmoodul (nupud, valgusdioodid, | ||
| + | * Mootorite moodul | ||
| + | * Andurite moodul | ||
| + | |||
| + | Moodulite pikema kirjelduse koos pistikute piikide täpse kirjeldusega leiab leheküljelt | ||
| + | |||
| + | | ||
| + | |||
| + | Järgneval pildil on toodud lihtsustatud ülevaade andurite jms ühendamisest. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | === Toiteahel === | ||
| + | Robotil vajab toitepinget nii kontrolleri moodul kui ka mootorite moodul. Mõlemad kasutavad energiaallikana sama akupatareid. Kasutatakse kaheks hargnevat juhet. MOotorite mooduli toitepistiku ühendamise õpetus on lehel | ||
| + | |||
| + | | ||
| + | |||
| + | NB! Standardse akupatarei fikseeritud pinge tõttu peab kontrolleri plaadil lühistama dioodsilla. Silla funktsioon plaadil on pöörata toitepinge polaarsus alati ühte pidi. See tähendab, et silda kasutades pole toitepinge polaarsus tähtis. Paraku jääb sillal u 1,5V pingelangu, mis on lubamatult palju. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Lühistades silla on toitepinge õige polaarsus tähtis! Pistiku keskmine piik on positiivne ja välime äär negatiivne. | ||
| + | |||
| + | === Koodrid === | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Roboti veermikul on mõlema lindi ülekandes 2 aukudega hammasratast. Asetades optokatkesti niimoodi hammasratta kohale, et see jääb optokatkesti pilu vahele saab optokatkestiga registreerida hammasrattas olevaid auke. Kui optokatkesti vahele jääb auk, siis optokatkesti ühes otsas oleva valgusdioodi valgus kiirgab teises otsas oleva fototransistori peale ja viimane hakkab voolu juhtima. Lugedes pöörlevas hammasrattas olevaid auke saab selle info põhjal välja arvutada läbi teepikkuse. Originaalis on mõlemas veermiku hammasrattas üks auk, kuid sinna tuleb sümmeetriliselt juurde puurida 2 auku, et koodri täpsust parandada. Sedasi saab lindi läbitud teepikkust mõõta ligikaudu 1 cm täpsusega. | ||
| + | |||
| + | Koodrid on ühendatud Kodulabori Mootorite mooduli " | ||
| + | |||
| + | === 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. | ||
| + | |||
| + | Vastuvõtumoodulile on paigutatud kaks signaali vastuvõtjat/ | ||
| + | |||
| + | 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: | ||
| + | |||
| + | **Vastuvõtja indeksiga 0 (vasakpoolne)** | ||
| + | |||
| + | ^ Kanal ^ Kaheksandiksüsteemis(HEX) | ||
| + | | 1 | 0x01 | 0b00000001 | | ||
| + | | 2 | 0x02 | 0b00000010 | | ||
| + | | 3 | 0x03 | 0b00000011 | | ||
| + | | 4 | 0x04 | 0b00000100 | | ||
| + | |||
| + | **Vastuvõtja indeksiga 1 (parempoolne)** | ||
| + | ^ Kanal ^ Kaheksandiksüsteemis(HEX) | ||
| + | | 1 | 0x11 | 0b00010001 | | ||
| + | | 2 | 0x12 | 0b00010010 | | ||
| + | | 3 | 0x13 | 0b00010011 | | ||
| + | | 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 === | ||
| + | |||
| + | Palli tuvastamiseks rulliku all kasutatakse infrapuna peegeldusandurit. Saatajalt peegeldunud kiirgus jõuab vastuvõtjasse ja selle kiirguse intensiivsuse järgi saab määrata objekti kauguse. | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Kuna võistlusel on alati palju välklampe, kaameraid, valgusteid jms infrapunakiirguse allikaid, | ||
| + | |||
| + | Pallianduri skeem on näidatud pildil. U1 on Hamamatsu S4282-51 andur. Kondensaator C1 silub toitepinge kõikumist. Kuna IP-diood võtab üsna palju voolu, siis selle sisse-välja lülitamise hetketel muutub voolutugevus anduri juhtmetes. Juhtmete induktiivsuse tõttu ei saa muutus toimuda hetkeliselt ja kondensaator täidab lühiajalise energiaallika osa. Kondensaatori parameetrid pole kriitilised. Peaasi, et nimipinge ületab 5V ja mahtuvus 1uF või rohkem. | ||
| + | |||
| + | Takisti R1 määrab anduri tundlikkuse. Ilma takistita oleks anduri reageermiskaugus u 5cm (sõltub ka IP-dioodi valikust). Takisti valimine käib katse-eksituse meetodil (vahemik 0 - 30 oomi). | ||
| + | [{{ : | ||
| + | |||
| + | Dioodi valimisel tuleb lähtuda S4282-51 | ||
| + | |||
| + | Pistik JP1: | ||
| + | - Signaal, madal kui andur tuvastab palli | ||
| + | - Toide +5V | ||
| + | - Maa (0V) | ||
| + | |||
| + | |||
| + | ==== 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 algoritm asub samas failis olevas suures olekutabelis. | ||
| + | |||
| + | Programm on üles ehitatud tavapärase olekumasina eeskujul, kuid 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. | ||
| + | |||
| + | 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> | ||
| + | // | ||
| + | // Main program. | ||
| + | // | ||
| + | int main(void) | ||
| + | { | ||
| + | unsigned char i; | ||
| + | unsigned short timer; | ||
| + | unsigned short encoder_left; | ||
| + | unsigned short encoder_right; | ||
| + | unsigned short buttons; | ||
| + | unsigned short infrared; | ||
| + | unsigned short ultrasonic; | ||
| + | unsigned short ball; | ||
| + | signed char own_goal; | ||
| + | signed char target_goal; | ||
| + | |||
| + | // Initial state | ||
| + | unsigned short state = 1; | ||
| + | |||
| + | // LCD counter | ||
| + | unsigned short lcdcount = 0; | ||
| + | |||
| + | // 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 0: | ||
| + | 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, | ||
| + | // | ||
| + | |||
| + | // Decide state | ||
| + | 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 = logic_list[i].output_state & 0x7FFF; | ||
| + | } | ||
| + | |||
| + | // Set timer | ||
| + | if (logic_list[i].output_timer) | ||
| + | { | ||
| + | timeout_start(logic_list[i].output_timer & 0x7FFF); | ||
| + | } | ||
| + | |||
| + | // Drive ? | ||
| + | if (logic_list[i].output_drive) | ||
| + | { | ||
| + | chassis_tank_drive((signed char)((logic_list[i].output_drive >> 8) & 0xFF), | ||
| + | | ||
| + | } | ||
| + | |||
| + | // 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; | ||
| + | |||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Montaaž ===== | ||
| + | |||
| + | {{: | ||
| + | |||
| + | **Esimese sammuna** kinnitatakse alusplaadile koodrid. Selleks läheb vaja: | ||
| + | * 4 M3x10 polti | ||
| + | * 8 mutrit | ||
| + | Kõigepealt kinnitatakse poldid mutritega alusplaadi külge, seejärel paigutatakse koodrid poltidele ning kinnitatakse need mutritega. Sel viisil tagatakse, et optokatkesti on piisavalt lähedal hammasrattale ja suudab registreerida hammasrattas olevaid auke. | ||
| + | |||
| + | [{{: | ||
| + | ~~CL~~ | ||
| + | Koodrite täpsuse parandamiseks on hammasrattale sümmeetriliselt juurde puuritud 2 auku. | ||
| + | ~~CL~~ | ||
| + | [{{: | ||
| + | ~~CL~~ | ||
| + | |||
| + | **Teise sammuna** kinnitatakse alusplaadi külge ultraheli kaugusandur. Selleks läheb vaja: | ||
| + | * 2 10 mm kõrgust puksi (M3 keere). | ||
| + | * 2 M3 polti (väikse peaga) | ||
| + | * 2 mutrit | ||
| + | [{{: | ||
| + | ~~CL~~ | ||
| + | **Kolmandana** pannakse kokku rullimehhanism. Rullimehhanismi kokkupanekuks on vaja: | ||
| + | * 6 M3x6 polti, 2 mootori kinnitamiseks haaratsi külge, 2 hinge kinnitamiseks haaratsi külge, 2 hinge kinnitamiseks alusplaadi külge. | ||
| + | * 4 seibi, 2 mootori kinnitamisel ja 2 hinge kinnitamisel haaratsi külge. | ||
| + | * 4 mutrit | ||
| + | * kahepoolne teip | ||
| + | ~~CL~~ | ||
| + | Esmalt kinnitatakse hing haaratsi külge. Haaratsi ja hinge vahel kasutatakse seibe, tagades sel viisil hinge vaba liikumise. Hilisem kinnitamine on raskendatud, | ||
| + | [{{: | ||
| + | ~~CL~~ | ||
| + | Järgmise sammuna kinnitatakse haaratsi külge mootor (3b). Peale seda kinnitatakse kahepoolse teibi abil haaratsi külge optiline palliandur (3c). | ||
| + | ~~CL~~ | ||
| + | [{{: | ||
| + | [{{: | ||
| + | ~~CL~~ | ||
| + | Nüüd kinnitatakse mootorivõlli otsa rull, mis fikseeritakse võllile poldiga (3d). Seejärel pannakse rullile peale kummirõngad (3e). Rullimehhanism on nüüd kokku pandud. | ||
| + | ~~CL~~ | ||
| + | [{{: | ||
| + | [{{: | ||
| + | ~~CL~~ | ||
| + | Lõpuks kinnitatakse rullimehhanism alusplaadi külge. | ||
| + | ~~CL~~ | ||
| + | [{{: | ||
| + | ~~CL~~ | ||
| + | **Neljanda sammuna** paigaldatakse alusplaadi külge andurite kinnitus koos infrapuna kaugusanduriga ja puksid, millele Kodulabori moodulid paigaldatakse. RC5 vastuvõtja paigaldatakse alles peale alusplaadi kinnitamist veermiku külge, kuna enneaegsel paigaldamisel saab ligipääs kruvikeerajaga raskendatud olema. | ||
| + | Kinnituse ja pukside paigaldamiseks läheb vaja: | ||
| + | * 2 M3x6 polti, andurite kinnituse paigaldamiseks | ||
| + | * 4 20 mm kõrgust puksi (M3 keere). | ||
| + | * 6 mutrit. | ||
| + | [{{: | ||
| + | [{{: | ||
| + | ~~CL~~ | ||
| + | **Viies samm** on alusplaadi kinnitamine veermikule ja RC5 vastuvõtja paigaldamine andurite kinnitusele. Selleks läheb vaja: | ||
| + | * 4 M3x6 polti. | ||
| + | * Kahepoolne teip. | ||
| + | ~~CL~~ | ||
| + | [{{: | ||
| + | [{{: | ||
| + | ~~CL~~ | ||
| + | **Kuuendana** kinnitatakse puksidele Kodulabori moodulid. Kinnitamiseks on vaja: | ||
| + | * 4 M3x6 polti. | ||
| + | ~~CL~~ | ||
| + | [{{: | ||
| + | ~~CL~~ | ||
| + | **Seitsmenda** sammuna ühendatakse roboti elektroonikaosade vahel kõik juhtmed. Alustada võiks toite harukaablist mis jagab Kontrollermoodulisse minema toite kaheks millest teine pistik tuleb ühendada Mootoite mooduliga. | ||
| + | [{{: | ||
| + | ~~CL~~ | ||
| + | RC5 vastuvõtja tuleb ühendada Kommunikatsioonimooduli välisesses EXT_UART pesasse: | ||
| + | [{{: | ||
| + | ~~CL~~ | ||
| + | Roomiku kaks mootorit tuleb ühendada Mootoritemooduli DC3 ja DC4 pesadesse. Koodrid lähevad sinnasamasse kõrvale ENC1 ja ENC2 pesadesse: | ||
| + | [{{: | ||
| + | ~~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: | ||
| + | [{{: | ||
| + | [{{: | ||
| + | ~~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~~ | ||
| + | [{{ : | ||
| + | |||
| + | ===== Video ===== | ||
| + | |||
| + | {{youtube> | ||
| + | |||
| + | ===== Soovitused ===== | ||
| + | |||
| + | * 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 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 ===== | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | * {{: | ||
| + | * {{: | ||
| + | * {{: | ||
| + | * {{: | ||
| + | * {{: | ||
| + | * {{: | ||
| + | ~~CL~~ | ||
| + | © TTÜ, MTÜ TTÜ Robotiklubi | ||
| + | |||
| + | ~~DISCUSSION~~ | ||