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 13:43] – 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 86: | Line 81: | ||
| ====Elektroonika==== | ====Elektroonika==== | ||
| - | Üldine elektroonika | + | Üldine elektroonika |
| + | |||
| + | {{ : | ||
| Jooneandurite elektriskeem | Jooneandurite elektriskeem | ||
| Line 101: | Line 98: | ||
| {{: | {{: | ||
| + | |||
| + | |||
| + | |||
| + | ====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,4)}; | ||
| + | |||
| + | 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/2; | ||
| + | error_v = uh_vahe/2; | ||
| + | |||
| + | // 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==== | ====Valmislahendus==== | ||
| Pärast 9 nädalat tööd on valmis robot balanseeriv joonejälgija. | 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 | + | 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 |
| + | |||
| + | {{: | ||
| + | |||
| + | ====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:// | ||