Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
et:projects:tudengid11:balanseerija [2011/03/30 09:53] Siim573et: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 - {{: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}} 
  
 ==== Ülesanne ==== ==== Ülesanne ====
Line 86: Line 81:
 ====Elektroonika==== ====Elektroonika====
  
-Üldine elektroonika blokkskeem+Üldine elektroonika plokkskeem 
 + 
 +{{ :et:projects:tudengid11:balansseerija:el_skeem.png?400 | Plokkskeem }}
  
 Jooneandurite elektriskeem Jooneandurite elektriskeem
Line 106: Line 103:
 ====Juhtalgoritm==== ====Juhtalgoritm====
  
-{{:et:projects:tudengid11:balansseerija:juhtalgoritm.png}}+{{ :et:projects:tudengid11:balansseerija:juhtalgoritm.png }} 
 + 
 +==Lähtekood== 
 + 
 +<code c> 
 + 
 +// Standardteegid 
 +#include <homelab/pin.h> 
 + 
 +// 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<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5)|(0<<PC6)|(1<<PC7); 
 +  
 + 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, integral_p, derivative_p; 
 + short error_v, previous_error_v, integral_v, derivative_v; 
 + long speed_v, speed_p, M_p, M_v; 
 + short p_error=0,i_error=0,d_error=0,lerror=0; 
 + long Kpj,Kij,Kdj,J=0; 
 + 
 + suund_p = EDASI; 
 + suund_v = EDASI; 
 + 
 + // PWM ja adc initsialiseerimine 
 + init_adc();  
 + adc_compare(); 
 + pwm_init(); 
 +  
 + // esimeste lugemite sisestamine 
 + for(int j=0;j<5;j++) 
 +
 + 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, pin_echo_e); 
 + // Filtreerib ja parandab 
 + Filter(esimene, ENK); 
 + k++;  
 +
 + else 
 +
 + tagumine = ultrasonic_measure1(pin_trigger_t, pin_echo_t); 
 + // Filtreerib ja parandab 
 + Filter(tagumine, TNK); 
 + 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/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); 
 +  
 +
 +
 +</code> 
 + 
 +Siin on ülejäänud lähtekood -> {{:et:projects:tudengid11:balansseerija:source_code.rar|AVR Studio projekt}}
  
 ====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 ka teostada roboti kokku monteerimine ilma koostejooniseta. +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}} {{:et:projects:tudengid11:balansseerija:valmis.jpg?550x550}}
Line 118: Line 327:
  
 Eesmärk oli kasutada ära võimalult palju olemasolevaid komponente ja materjale. 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== ==Komponentide tabel==
-^ Komponent          ^ Nimetus              ^ Kogus ^ Hind  ^ Maksumus   +^ Komponent           ^ Nimetus                ^ Kogus ^ Hind € ^ Maksumus €  
-| Põhikontroller     | ATmega128            | 1     | | | +| Põhikontroller      | ATmega128 arendusplaat | 1     65     65          
-| Mootorikontroller  H-sild L293D         | 1     | | | +| Mootorikontroller   | L293D moodulplaat      | 1     15     15          
-| Mootorid           | 12V 0.2Nm, 14000rpm  | 2     | | | +| Mootorid            | 12V 0.05Nm, 14000rpm   | 2     10     20          
-| Reduktorid         | Faulhaber 16/7, 43:1 | 2     | | | +| Reduktorid          | Faulhaber 16/7, 43:1   | 2     10     20          
-| Ultraheli andurid  | SRF04                | 2     | | | +| Ultraheli andurid   | SRF04                  | 2     15     30          
-| Jooneandurid       | QRD1114              | 5     | | | +| Jooneandurid        | QRD1114                | 5     2,5    12,5        
-| Akud, patareid     | AA Patarei           | 8     | | | +| Akud, patareid      | AA Patarei             | 8     0,5    4           
-| Rattad             | Lego, D = 80mm       | 2     | | | +| Rattad              | Lego, D = 80mm         | 2     3      6           
-| Kere materjalid    | Plastik 5mm, POM     | 1x1m  | | | +| Kere materjalid     | Plastik 5mm, POM1x1m | 1     50     | 50          
-| Sisend-väljundplaat| LED ja Mikrolüliti   | 5 + 1 | | | +| Sisend-väljundplaat | LED ja Mikrolüliti     | 5 + 1 | 0,3    1,8         | 
-^ Kokku                                   ^       ^ ^ ^+| 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. Lisaks tuleks CNC freespingi ja muude töövahendite kasutamise hind.
  
 ====Projektijuhtimine==== ====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==== ====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==== ====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==== ====Lisad====
-Video roboti toimimisest - [[http://www.youtube.com/watch?v=OvwDmx-TnVQ|PID]]+Video roboti toimimisest - [[http://www.youtube.com/watch?v=OvwDmx-TnVQ|PID demo]]
et/projects/tudengid11/balanseerija.1301478807.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