This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:projects:tudengid11:balanseerija [2011/03/29 11:40] – a073128 | et:projects:tudengid11:balanseerija [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Balanseerija ====== | ====== Balanseerija ====== | ||
| + | |||
| ===== Meeskond ===== | ===== Meeskond ===== | ||
| Line 6: | Line 7: | ||
| * Holger Kruusla | * Holger Kruusla | ||
| * Martin Parker | * Martin Parker | ||
| - | |||
| - | ==== Nädalaaruanded ==== | ||
| - | |||
| - | - Nädal - {{: | ||
| - | - Nädal - {{: | ||
| - | - Nädal - {{: | ||
| ==== Ülesanne ==== | ==== Ülesanne ==== | ||
| Line 20: | Line 15: | ||
| ==== Ideelahendus ==== | ==== 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, | 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, | ||
| - | | + | |
| See oli üks esimestest asjadest, mille me reaalselt (3D mudelina) valmis saime. Kokku valmis 2 mudelit, seega polnud sobiva lahenduse valik ülemäära keeruline. | See oli üks esimestest asjadest, mille me reaalselt (3D mudelina) valmis saime. Kokku valmis 2 mudelit, seega polnud sobiva lahenduse valik ülemäära keeruline. | ||
| - | {{: | + | {{: |
| + | |||
| + | Oma projekti realiseerimiseks valisime | ||
| + | ***Balanseerimise tööpõhimõte.** | ||
| + | |||
| + | | ^ Plussid | ||
| + | ^ Güroskoop| Hästi realiseeritav, | ||
| + | ^ 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. | ||
| + | |||
| + | Kõike eelnevat arvesse võttes otsustasime, | ||
| + | |||
| + | **Lahendus** | ||
| - | ==== Lahendus ==== | ||
| * Kasutame kahte ultraheliandurit roboti asendi määramiseks maapinna suhtes | * Kasutame kahte ultraheliandurit roboti asendi määramiseks maapinna suhtes | ||
| * Roboti ajuks on ATMega128 mikrokontroller | * Roboti ajuks on ATMega128 mikrokontroller | ||
| * Kahte ratast veavad kaks DC mootorit | * Kahte ratast veavad kaks DC mootorit | ||
| - | ===Jooneandurite elektriskeem=== | ||
| - | {{ http:// | ||
| - | ===Visuaalse väljundplaadi elektriskeem=== | + | ====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:// | ||
| + | |||
| + | {{: | ||
| + | |||
| + | 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 | ||
| + | |||
| + | {{: | ||
| + | {{: | ||
| + | |||
| + | 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, | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Roboti prototüübi valmis küljelahendus. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Järgmised võtmedetailid roboti kere juures on rohelised horisontaalplaadid, | ||
| + | |||
| + | Alusplaadi detailijoonis. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Moodulite plaadi detailijoonis. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Andurite kinnitusplaadi detailijoonis. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | 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 | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ====Elektroonika==== | ||
| + | |||
| + | Üldine elektroonika plokkskeem | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Jooneandurite elektriskeem | ||
| + | |||
| + | {{http:// | ||
| + | |||
| + | 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 | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Visuaalse väljundplaadi elektriskeem | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | |||
| + | ====Juhtalgoritm==== | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | ==Lähtekood== | ||
| + | |||
| + | <code c> | ||
| + | |||
| + | // Standardteegid | ||
| + | #include < | ||
| + | |||
| + | // isetehtud teekide lisamine | ||
| + | #include " | ||
| + | #include " | ||
| + | |||
| + | // 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 pin_trigger_t = PIN(C, 1); | ||
| + | pin pin_echo_t | ||
| + | |||
| + | short esimene, | ||
| + | |||
| + | 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; | ||
| + | { | ||
| + | esimene_v[j] = esimene_v[j+1]; | ||
| + | } | ||
| + | esimene_v[4] = lugem; | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | for(int j=0; | ||
| + | { | ||
| + | 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, | ||
| + | |||
| + | int main(void) | ||
| + | { | ||
| + | // PORTC defineerimine | ||
| + | DDRC = (1<< | ||
| + | |||
| + | short k = 0; // andurite abimuutuja kordamööda mõõtmisel | ||
| + | short suund_p, suund_v, uh_vahe; | ||
| + | short Kp, Ki, Kd; | ||
| + | short error_p, previous_error_p, | ||
| + | short error_v, previous_error_v, | ||
| + | long speed_v, speed_p, M_p, M_v; | ||
| + | short p_error=0, | ||
| + | long Kpj, | ||
| + | |||
| + | suund_p = EDASI; | ||
| + | suund_v = EDASI; | ||
| + | |||
| + | // PWM ja adc initsialiseerimine | ||
| + | init_adc(); | ||
| + | adc_compare(); | ||
| + | pwm_init(); | ||
| + | |||
| + | // esimeste lugemite sisestamine | ||
| + | for(int j=0; | ||
| + | { | ||
| + | esimene_v[j] = ENK; | ||
| + | tagumine_v[j] = TNK; | ||
| + | } | ||
| + | |||
| + | // Joonejälgimise PID | ||
| + | Kpj=80; | ||
| + | Kdj=0; | ||
| + | Kij=0; | ||
| + | |||
| + | // PID kordajad | ||
| + | Kp = 18; | ||
| + | Ki = 10; // lõppvalemis jagatud 10-ga | ||
| + | Kd = 2; | ||
| + | |||
| + | integral_p = 0; | ||
| + | derivative_p = 0; | ||
| + | error_p = 0; | ||
| + | previous_error_p = error_p; | ||
| + | M_p = 0; | ||
| + | |||
| + | integral_v = 0; | ||
| + | derivative_v = 0; | ||
| + | error_v = 0; | ||
| + | previous_error_v = error_v; | ||
| + | M_v = 0; | ||
| + | |||
| + | while(1) | ||
| + | { | ||
| + | // Ultraheli andurite lugemine | ||
| + | if(k==0) | ||
| + | { | ||
| + | |||
| + | esimene = ultrasonic_measure1(pin_trigger_e, | ||
| + | // Filtreerib ja parandab | ||
| + | Filter(esimene, | ||
| + | k++; | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | tagumine = ultrasonic_measure1(pin_trigger_t, | ||
| + | // Filtreerib ja parandab | ||
| + | Filter(tagumine, | ||
| + | k=0; | ||
| + | } | ||
| + | uh_vahe = ((TNK-tagumine_v[4]) - (ENK-esimene_v[4])) ; | ||
| + | |||
| + | // Edasiliikumiseks vajaliku nurgahälbe tekitamine | ||
| + | if((uh_vahe==1)||(uh_vahe==2)||(uh_vahe==3)||(uh_vahe==4)) uh_vahe = 0; | ||
| + | |||
| + | // jooneandurite lugemine | ||
| + | sensor = read_sensors(); | ||
| + | |||
| + | // Vigade määramine | ||
| + | error_p = uh_vahe/ | ||
| + | error_v = uh_vahe/ | ||
| + | |||
| + | // Parem | ||
| + | integral_p += error_p; | ||
| + | if(integral_p > 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/ | ||
| + | M_v = Kp*(error_v) + Ki*integral_v/ | ||
| + | |||
| + | speed_p = max_speed*M_p/ | ||
| + | speed_v = max_speed*M_v/ | ||
| + | |||
| + | 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)/ | ||
| + | if(J> | ||
| + | if(J< | ||
| + | speed_v = (speed_v*(100-J)/ | ||
| + | speed_p = (speed_p*(100+J)/ | ||
| + | |||
| + | if(speed_p > max_speed) | ||
| + | { | ||
| + | speed_p = max_speed; | ||
| + | } | ||
| + | if(speed_v > max_speed) | ||
| + | { | ||
| + | speed_v = max_speed; | ||
| + | } | ||
| + | Motors(PAREM, | ||
| + | Motors(VASAK, | ||
| + | |||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Siin on ülejäänud lähtekood -> {{: | ||
| + | |||
| + | ====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. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ====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 | ||
| + | | Põhikontroller | ||
| + | | Mootorikontroller | ||
| + | | Mootorid | ||
| + | | Reduktorid | ||
| + | | Ultraheli andurid | ||
| + | | Jooneandurid | ||
| + | | Akud, patareid | ||
| + | | Rattad | ||
| + | | Kere materjalid | ||
| + | | Sisend-väljundplaat | LED ja Mikrolüliti | ||
| + | | Makettplaat | ||
| + | | Juhtmed, kaablid | ||
| + | ^ Kokku | ||
| + | |||
| + | 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 | ||
| + | ^ Martin | ||
| + | |||
| + | Koostöö oli hea ning saime roboti üsna kiiresti valmis ning jäi päris palju aega programmeerimiseks. | ||
| + | |||
| + | == Nädalaaruanded == | ||
| + | |||
| + | - Nädal - {{: | ||
| + | - Nädal - {{: | ||
| + | - Nädal - {{: | ||
| + | |||
| + | ====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:// | ||
| + | - [[http:// | ||
| + | - [[http:// | ||
| + | |||
| + | ====Lisad==== | ||
| + | Video roboti toimimisest - [[http:// | ||