====== Balanseerija ====== ===== Meeskond ===== * Priit Suurküla * Siim Sülla * Holger Kruusla * Martin Parker ==== Ülesanne ==== * Robot toetub maapinnale ainult kahe rattaga * Robot on autonoomne * Robot suudab püsti seista ja sõita mööda joont ==== Ideelahendus ==== Meie Roboti ideelahenduse leidmine koosnes kahest osast. Esiteks visuaalse lahenduse leidmine, et robot näeks atraktiivne ja ilus välja ning ühtlasi oleks lihtsalt koostatav. Teiseks ja ühtlasi ka olulisemaks oli leida meile sobiv roboti tööpõhimõte. Selleks oli kolm võimalust: Güroskoobi, Infrapuna-, või Ultraheli kaugusandurite kasutamine. ***Disain ja mehaanika** See oli üks esimestest asjadest, mille me reaalselt (3D mudelina) valmis saime. Kokku valmis 2 mudelit, seega polnud sobiva lahenduse valik ülemäära keeruline. Alljärgnevatel piltidel meie Disainilahendused. {{:et:projects:tudengid11:balansseerija:i_lahendus.jpg?280x260}} {{:et:projects:tudengid11:balansseerija:ii_lahendus.jpg?280x260}} Oma projekti realiseerimiseks valisime teise disaini variandi (parempoolne lahendus). Valik osutus selliseks mitmetel kaalutlustel. Suurimaks kasuteguriks oli sellise variandi lihtsus. Kogu roboti kere koosneb kaheksast detailist, mis kõik valmistatakse CNC pingil. Sellega seoses jäävad ära eisimese lahenduse puhul vajalikuks osutunud treimis, keermelõikus, mõõtmis, ning saagimis tööd, mida teise variandi puhul teeb meie eest CNC pink. Esimese variandi suureks puuduseks oli ka Ultraheli andurite paigutamine, kuna andurite „vaateväli“ on üsna lai siis peavad andurid asetsema roboti kerest teatud kaugusel ning kindla nurga all, et kere ei hakkaks andurite tööd segama. ***Balanseerimise tööpõhimõte.** | ^ Plussid ^ Miinused ^ ^ Güroskoop| Hästi realiseeritav, annab võrreldes teistega palju tagasisidet.| Programmeerimine on mõnevõrra keerulisen ning peab kasutama rohkem matemaatikat.| ^ Ultraheli andurid| Annavad usaldatavat tagasisidet erinevatelt pindadelt (eri värvid ja materjalid)|Reageerimisaeg on võrreldes IR anduritega aeglasem | ^ Infrapuna andurid| Mõõtmise sagedus suurem kui ultraheli anduritel.| Keskkonnast tingitud suured mõõtevead (eri värvustelt peegeldab tagasi erinevalt)| Kuna kõik variandid on omamoodi huvitavad ning kõigil neist on oma valupunktid ,mida lahendada, siis oli otsustamine päris keeruline. Kuna güroskoobid on suhteliselt kallid ja roboti programmeerimine güroskoopi kasutades on võrreldes teistega mõnevõrra keerulisem otsustasime sellest lahendusest loobuda. Järgi jäid kaugusandurid. Lähema uurimise käigus selgus, et infrapuna andurid ei peegelda kõigilt pindadelt ühetaoliselt tagasi ja annavad seetõttu häiringuid ning tuli meil ka neist loobuda, sest joon mida mööda robot peab sõitma on musta värvi ning võib hakata IR andurite tööd häirima. Ultraheli andureid uurides selgus, et sellise lahendusega on valmistatud balanseerivaid roboteid. Kuna kodulabori komplekti kuulub samuti ultraheliandur, siis otsustasime, et neid kasutades saame roboti prototüübi kiiresti valmis ning sellega seoses jääb meil rohkem aega katsetusteks ja koodi kirjutamiseks. Kõike eelnevat arvesse võttes otsustasime, et põhjalikumalt hakkame arendama teist disainilahendust koos ultraheli anduritega, mis tagavad roboti balansseerimise. **Lahendus** * Kasutame kahte ultraheliandurit roboti asendi määramiseks maapinna suhtes * Roboti ajuks on ATMega128 mikrokontroller * Kahte ratast veavad kaks DC mootorit ====Mehaanika==== Roboti projekteerimisel lähtusime sellest, et see oleks huvitava välimusega ning, et seda oleks võimalikult lihtne kokku panna (lahti võtta). Roboti kere koosneb kahest identsest küljest, mille sisse on lõigatud tapiavad ja freesitud mootorite kinnitus avad. Kahe külje vahele paigutuvad horisontaalplaadid moodulite ning patareide jaoks. Nende asetus on paigutatud nii, et oleks lihtne moodulplaatidele ligi pääseda (paigaldada progammaatori juhet, andurite ja mootorite juhtmeid jne). Kuna tapid lähevad avadesse ainult ühte moodi ning horisontaalplaate on kõigest kolm erinevat siis on kere kokku panemine hämmastavalt lihtne. (juhul kui moodulid ning andurid on eelnevalt plaatidele monteeritud). Roboti ratasteks kasutame tavalisi lego rattaid (http://www.peeron.com/inv/parts/2903), mis on meie roboti tarvis vastavalt modifitseeritud. Rataste tsentrisse on puuritud suuremad augud,mis on ka keermestatud. Alloleval pildil ratas koos kinnitusega (ratas kinnitub mootori võllile kahe kruvi abil). {{:et:projects:tudengid11:balansseerija:ratas.jpg?210x210}} Ratta kinnnitamiseks mootori võllile on treitud nn Rattakinnitus võll, mille ühte otsa on puuritud auk, mis ühtib mootori võlli läbimõõduga ning samasse otsa ka kaks võlli teljega risti asetsevat auku, mis hiljem keermestatakse M3 keermega ning, mille eesmärgiks on pingu tekitamine mootori võllile, et ratas kindlalt kinni püsiks. Võlli teises otsas on M8 keere ratta ning mutri kinnituseks. Lihtsustatud Rattakinnituse detailijoonis ja Kinnituse prototüübi valmis lahendus. {{:et:projects:tudengid11:balansseerija:kinni_detailijoonis.jpg?360x300}} {{:et:projects:tudengid11:balansseerija:kinnitus.jpg?360x220}} Roboti kere selgrooks on küljed, nende külge kinnituvad praktiliselt kõik teised kere detailid: mootorid ning horisontaalplaadid moodulite, akude ja ultraheliandurite kinnituseks. Motorite kinnituseks on külje siseküljele freesitud mootori diameetriga võrdne süvend ning puuritud augud vastavalt mootori tüübi kinnitusele (antud juhul lahendatud süvend alumiinium plaadiga kuhu puuritud mootori kinnitamiseks 2 auku ning 1 auk mootori võlli tarvis). Järgnevat on kujutatud lihtsustatud külje detailijoonis, kuhu on märgitud tapiavade paigutus ning nende suurused. Kontuurjoonte raadiused on märkimata kuna antud juhul on kontuuri põhiline eesmärk huvitava disaini loomine ( tähtis on tapiavade paigutus, suurus ning omavahelised kaugused). {{:et:projects:tudengid11:balansseerija:kuljejoonis.jpg?500x550}} Roboti prototüübi valmis küljelahendus. {{:et:projects:tudengid11:balansseerija:kulg.jpg?500x550}} Järgmised võtmedetailid roboti kere juures on rohelised horisontaalplaadid, mis annavad robotile soovitud jäikuse ning tugevuse. Horisontaalplaate on meie roboti juures kolme erinevat tüüpi. Üks alusplaat, mille eesmärgiks on suurema jäikuse tekitamine. Kolm identset plaati, millest kahele kinnituvad kontrolleri- ning mootorite moodul ning ühele patareid. Kaks identset plaati ultraheli andurite kinnitamiseks. Kõik horisontaalplaadid kinnituvad külgedele tappide ning kruvidega (soovi korral võib jätta kruviaugud tegemata ning kinnitada plaadid liimiga kuna praktika näitas ,et tapid hoiavad ise juba robotit üsna hästi koos). Alusplaadi detailijoonis. {{:et:projects:tudengid11:balansseerija:alusplaat.jpg?600x450}} Moodulite plaadi detailijoonis. {{:et:projects:tudengid11:balansseerija:moodulite.jpg?450x350}} Andurite kinnitusplaadi detailijoonis. {{:et:projects:tudengid11:balansseerija:andurplaat.jpg?600x450}} Moodulite kinnitamiseks Horisontaalplaatidele puuritakse plaatidesse augud (vastavalt moodulplaatide kinnitus aukudele) ning keermestatakse need augud. Moodulid kinnitatakse kruvidega, mooduli ning horisontaali vahele asetatakse ka puksid, mille kõrguseks on 3-5 mm ning avad puksides vastavalt kinnituskruvide läbimõõdule. Robot kasutab 8x 1.5v patareid mille hoidmiseks on kaks patarei pesa , kumbki mahutab neli patareid. Kuna patareipesadel puuduvad kinnitamiseks mõeldud avad siis nende kinnnitamiseks oleme esialgu mõelnud kasutada kahepoolset teipi. Ultraheliandurid kinnituvad horisontaalplaatidele analoogselt mooduplaatidega. Andurite ning plaadi vahele asetatakse puksid ning kruvitakse andurid plaadi külge. Kuna tegemist on kahel rattal sõitva robotiga siis on vältimatu ,et robot aegajalt „ninuli“ kukub. Kukkumisest tekkivate vigastuste vältimiseks kinnitasime ultraheliandurite juurde vedrud „bumperid“ ,mis roboti kukkumisel summutavad suurema põrutuse. Vedru on kinnitatud horisontaalplaadile pleki tüki abil (vedru nurka on võimailik korrigeerida pleki tükki paenutades). Kuna vedru kinnitamine pleki tüki külge oli komplitseeritud, siis tuli selleks üsna palju vaeva näha. Esmalt tuli „vedru „ peene juhtme abil pleki külge punuda ning kinnituse tugevamaks muutmiseks jootsime sinna ka tina. Vedrude ning ultraheliandurite kinnitus on järgneval pildil. {{:et:projects:tudengid11:balansseerija:vedru.jpg?200x300}} ====Elektroonika==== Üldine elektroonika plokkskeem {{ :et:projects:tudengid11:balansseerija:el_skeem.png?400 | Plokkskeem }} Jooneandurite elektriskeem {{http://img840.imageshack.us/img840/480/jooneandurid.png?600}} Info kuvamiseks ja välimuse atraktiivsemaks muutmiseks on roboti peale (Patareide pesade peal) kinnitatud visuaalne väljundplaat mis koosneb viiest rohelisest ledist, mida on võimalik programmerida meile vajaliku infot kuvama. Plaat on kinnitatud kahepoolse teibiga. Visuaalse väljundplaadi pilt {{:et:projects:tudengid11:balansseerija:valjundplaat.jpg?550x250}} Visuaalse väljundplaadi elektriskeem {{:et:projects:tudengid11:balansseerija:valjund-plaat.png?550x300}} ====Juhtalgoritm==== {{ :et:projects:tudengid11:balansseerija:juhtalgoritm.png }} ==Lähtekood== // Standardteegid #include // isetehtud teekide lisamine #include "Mootor.h" #include "Sensors.h" // Definitsioonid #define ENK 181 // esimene normaal kaugus #define TNK 177 // tagumine normaal kaugus #define VIGA 40 // jäme mõõteviga #define NUPP_PORT PINC #define NUPP1_PIN PC6 // Ultraheli anduri viigud pin pin_trigger_e = PIN(G, 1); pin pin_echo_e = PIN(G, 0); pin pin_trigger_t = PIN(C, 1); pin pin_echo_t = PIN(C, 0); short esimene,tagumine,esimene_v[5],tagumine_v[5]; void Filter(short lugem, short kaugus) { // võrdleb tegelikuga ja otsustab mida sellega teha if((lugem > kaugus + VIGA)||(lugem < kaugus - VIGA)) { if(kaugus == ENK) esimene = esimene_v[4]; else tagumine = tagumine_v[4]; } else // nihutab tulemusi { if(kaugus == ENK) { for(int j=0;j<4;j++) { esimene_v[j] = esimene_v[j+1]; } esimene_v[4] = lugem; } else { for(int j=0;j<4;j++) { tagumine_v[j] = tagumine_v[j+1]; } tagumine_v[4] = lugem; } } } // ------------------------------------------------------------- // Põhifunktsioon Main // ------------------------------------------------------------- pin test[5] = {PIN(C,3), PIN(C,5), PIN(C,7), PIN(C,2), PIN(C,4)}; int main(void) { // PORTC defineerimine DDRC = (1< 400) integral_p = 400; if(integral_p < -400) integral_p = -400; derivative_p = error_p - previous_error_p; // Vasak integral_v += error_v; if(integral_v > 400) integral_v = 400; if(integral_v < -400) integral_v = -400; derivative_v = error_v - previous_error_v; // Momentide arvutamine M_p = Kp*(error_p) + Ki*integral_p/10 + Kd*derivative_p; M_v = Kp*(error_v) + Ki*integral_v/10 + Kd*derivative_v; speed_p = max_speed*M_p/400-100; speed_v = max_speed*M_v/400-100; previous_error_p = error_p; previous_error_v = error_v; if(speed_p <= 0) { speed_p = -speed_p; suund_p = EDASI; } else { suund_p = TAGASI; } if(speed_v <= 0) { speed_v = -speed_v; suund_v = EDASI; } else { suund_v = TAGASI; } p_error=jooneasukoht(PAREM); i_error+=p_error; d_error=p_error-lerror; lerror=p_error; J=(Kpj*p_error+Kij*i_error+Kdj*d_error)/100; if(J>100)J=100; if(J<-100)J=-100; speed_v = (speed_v*(100-J)/100); speed_p = (speed_p*(100+J)/100); if(speed_p > max_speed) { speed_p = max_speed; } if(speed_v > max_speed) { speed_v = max_speed; } Motors(PAREM,speed_p,suund_p); Motors(VASAK,speed_v,suund_v); } } Siin on ülejäänud lähtekood -> {{:et:projects:tudengid11:balansseerija:source_code.rar|AVR Studio projekt}} ====Valmislahendus==== Pärast 9 nädalat tööd on valmis robot balanseeriv joonejälgija. Järgnevalt on näha meie roboti prototüüp ja kõik tähtsamad detailid ning nende kinnitused komplektselt. Ühtlasi on antud pildi järgi võimlaik teostada roboti kokku monteerimine ilma koostejooniseta. {{:et:projects:tudengid11:balansseerija:valmis.jpg?550x550}} ====Majanduskalkulatsioonid==== Eesmärk oli kasutada ära võimalult palju olemasolevaid komponente ja materjale. Hinnad ei ole hetkel täpsed, kuna paljusid komponente ei pidanud me ise ostma. ==Komponentide tabel== ^ Komponent ^ Nimetus ^ Kogus ^ Hind € ^ Maksumus € ^ | Põhikontroller | ATmega128 arendusplaat | 1 | 65 | 65 | | Mootorikontroller | L293D moodulplaat | 1 | 15 | 15 | | Mootorid | 12V 0.05Nm, 14000rpm | 2 | 10 | 20 | | Reduktorid | Faulhaber 16/7, 43:1 | 2 | 10 | 20 | | Ultraheli andurid | SRF04 | 2 | 15 | 30 | | Jooneandurid | QRD1114 | 5 | 2,5 | 12,5 | | Akud, patareid | AA Patarei | 8 | 0,5 | 4 | | Rattad | Lego, D = 80mm | 2 | 3 | 6 | | Kere materjalid | Plastik 5mm, POM, 1x1m | 1 | 50 | 50 | | Sisend-väljundplaat | LED ja Mikrolüliti | 5 + 1 | 0,3 | 1,8 | | Makettplaat | 100x160mm | 1 | 6,4 | 6,4 | | Juhtmed, kaablid | montaazijuhe | 3m | 0,2 | 0,6 | ^ Kokku ^ ^ ^ ^ 231,3 ^ Lisaks tuleks CNC freespingi ja muude töövahendite kasutamise hind. ====Projektijuhtimine==== Ülesanded said üsna alguses ära jaotatud ning samuti oli osaliselt olemas ajakava, sest aine nõudis teatud ajaks vastavat roboti valmidust. | ^ Ülesanne ^ ^ Siim | Roboti tasakaal andurite seisukohalt | ^ Priit | Mehaanika projekteerimine | ^ Holger | Joonejärgimine, infrapuna andurid | ^ Martin | Roboti tasakaal mootorite seisukohalt| Koostöö oli hea ning saime roboti üsna kiiresti valmis ning jäi päris palju aega programmeerimiseks. == Nädalaaruanded == - Nädal - {{:et:projects:tudengid11:balansseerija:aruanne_001.pdf|Nädal 1}} - Nädal - {{:et:projects:tudengid11:balansseerija:nadala_aruanne_nr2.pdf|Nädal 2}} - Nädal - {{:et:projects:tudengid11:balansseerija:nadala_aruanne_nr3.pdf|Nädal 3}} ====Kokkuvõte==== Üldiselt õnnestus meil antud ülesande täitmine üsnagi edukalt. Robot suudab iseseisvalt end tasakaalustada ning ka algtasemel joont järgida. Saime mehaanika üsnagi lihtsalt projekteeritud ja koostatud, elektroonika oli enamjaolt olemas tuli ainult moodulid ja komponendid omavahel sobitada. Kõige rohkem aega võttis programmeerimine ja testimine. Üks põhjus miks meil korraliku tasakaalu saavutamine kaua aega võttis oli lihtsate algoritmide kasutamine, nimelt ei kasutanud me alguses eriti matemaatikat vaid pigem võrdlustehnikat. Palju parema tulemuse saavutasime siis kui võtsime kasutusele PID regulaatori. Seega soovitan teistel kohe sellest alustada. Üks suurimaid puudusi sellel robotil on kiiruse mõõtmise võimaluse puudumine. Soovitan kindlasti kasutada sellise ülesande täitmisel kas koodritega või Halli anduritega mootoreid. Võib kasutada ka muid piisavalt töökindlaid mooduseid kiiruse määramiseks. ====Viited ja kasutatud materjal==== - [[http://www.atmel.com/dyn/resources/prod_documents/doc2467.pdf|ATmega128 datasheet]] - [[http://www.geology.smu.edu/~dpa-www/robo/nbot/|nBot balansseerija]] - [[http://home.roboticlab.eu/et/examples|Roboticlabi praktilised näited]] ====Lisad==== Video roboti toimimisest - [[http://www.youtube.com/watch?v=OvwDmx-TnVQ|PID demo]]