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 10:23] Siim573et:projects:tudengid11:balanseerija [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== Balanseerija ====== ====== Balanseerija ======
  
-Dokument on koostamisel! 
  
 ===== Meeskond ===== ===== Meeskond =====
Line 8: 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 88: Line 81:
 ====Elektroonika==== ====Elektroonika====
  
-Üldine elektroonika blokkskeem+Üldine elektroonika plokkskeem 
 + 
 +{{ :et:projects:tudengid11:balansseerija:el_skeem.png?400 | Plokkskeem }}
  
 Jooneandurite elektriskeem Jooneandurite elektriskeem
Line 108: Line 103:
 ====Juhtalgoritm==== ====Juhtalgoritm====
  
-{{:et:projects:tudengid11:balansseerija:juhtalgoritm.png}}+{{ :et:projects:tudengid11:balansseerija:juhtalgoritm.png }}
  
 ==Lähtekood== ==Lähtekood==
-<code java>+ 
 +<code c> 
 // Standardteegid // Standardteegid
 #include <homelab/pin.h> #include <homelab/pin.h>
Line 122: Line 119:
 #define ENK  181 // esimene normaal kaugus #define ENK  181 // esimene normaal kaugus
 #define TNK  177 // tagumine normaal kaugus #define TNK  177 // tagumine normaal kaugus
-#define VIGA 40+#define VIGA 40  // jäme mõõteviga 
 + 
 +#define NUPP_PORT PINC 
 +#define NUPP1_PIN PC6
  
 // Ultraheli anduri viigud // Ultraheli anduri viigud
Line 130: Line 130:
 pin pin_echo_t    = PIN(C, 0); pin pin_echo_t    = PIN(C, 0);
  
-// Globaalsed muutujad 
-uint8_t korrektuur = 0 ; 
-register uint8_t sensor asm("r10"); 
-register uint8_t nr_rotates asm("r11"); 
-register uint8_t pre_sensor asm("r12"); 
 short esimene,tagumine,esimene_v[5],tagumine_v[5]; short esimene,tagumine,esimene_v[5],tagumine_v[5];
- 
  
 void Filter(short lugem, short kaugus) void Filter(short lugem, short kaugus)
 { {
- // võrdleb tegelikuga ja elimineerib suured vead+ // võrdleb tegelikuga ja otsustab mida sellega teha
  if((lugem > kaugus + VIGA)||(lugem < kaugus - VIGA))  if((lugem > kaugus + VIGA)||(lugem < kaugus - VIGA))
  {  {
Line 148: Line 142:
  tagumine = tagumine_v[4];   tagumine = tagumine_v[4];
  }  }
- else // nihutab tulemusi kui lugem on sobilik+ else // nihutab tulemusi
  {  {
  if(kaugus == ENK)  if(kaugus == ENK)
Line 167: Line 161:
  }  }
  }  }
 +
  
 } }
Line 172: Line 167:
 // Põhifunktsioon Main // Põhifunktsioon Main
 // ------------------------------------------------------------- // -------------------------------------------------------------
 +pin test[5] = {PIN(C,3), PIN(C,5), PIN(C,7), PIN(C,2), PIN(C,4)};
  
 int main(void) 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 k = 0; // andurite abimuutuja kordamööda mõõtmisel
Line 184: Line 182:
  short p_error=0,i_error=0,d_error=0,lerror=0;  short p_error=0,i_error=0,d_error=0,lerror=0;
  long Kpj,Kij,Kdj,J=0;  long Kpj,Kij,Kdj,J=0;
- long time = 0; 
  
  suund_p = EDASI;  suund_p = EDASI;
  suund_v = EDASI;  suund_v = EDASI;
  
 + // PWM ja adc initsialiseerimine
  init_adc();   init_adc();
  adc_compare();  adc_compare();
Line 199: Line 197:
  tagumine_v[j] = TNK;  tagumine_v[j] = TNK;
  }  }
- // Joonejälgimise kordajad + 
- Kpj=120;+ // Joonejälgimise PID 
 + Kpj=80;  
 + Kdj=0;
  Kij=0;  Kij=0;
- Kdj=50; 
   
  // PID kordajad  // PID kordajad
Line 208: Line 207:
  Ki = 10; // lõppvalemis jagatud 10-ga  Ki = 10; // lõppvalemis jagatud 10-ga
  Kd = 2;  Kd = 2;
- //Kpj = 70; +
- +
  integral_p = 0;  integral_p = 0;
  derivative_p = 0;  derivative_p = 0;
Line 221: Line 219:
  previous_error_v = error_v;  previous_error_v = error_v;
  M_v = 0;  M_v = 0;
- korrektuur = 0; 
  
  while(1)  while(1)
- { + {
  // Ultraheli andurite lugemine  // Ultraheli andurite lugemine
  if(k==0)  if(k==0)
- { + { 
 +
  esimene = ultrasonic_measure1(pin_trigger_e, pin_echo_e);  esimene = ultrasonic_measure1(pin_trigger_e, pin_echo_e);
  // Filtreerib ja parandab  // Filtreerib ja parandab
  Filter(esimene, ENK);  Filter(esimene, ENK);
- k++;time++; + k++;
  }  }
  else  else
Line 238: Line 236:
  // Filtreerib ja parandab  // Filtreerib ja parandab
  Filter(tagumine, TNK);  Filter(tagumine, TNK);
- k=0;time+++ k=0; 
- } + }  
-  + uh_vahe = ((TNK-tagumine_v[4]) - (ENK-esimene_v[4])) ; 
- 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  // jooneandurite lugemine
  sensor = read_sensors();  sensor = read_sensors();
Line 260: Line 260:
  if(integral_v < -400) integral_v = -400;  if(integral_v < -400) integral_v = -400;
  derivative_v = error_v - previous_error_v;  derivative_v = error_v - previous_error_v;
- + // Momentide arvutamine
  M_p = Kp*(error_p) + Ki*integral_p/10 + Kd*derivative_p;  M_p = Kp*(error_p) + Ki*integral_p/10 + Kd*derivative_p;
  M_v = Kp*(error_v) + Ki*integral_v/10 + Kd*derivative_v;  M_v = Kp*(error_v) + Ki*integral_v/10 + Kd*derivative_v;
   
- speed_p = max_speed*M_p/400; + speed_p = max_speed*M_p/400-100
- speed_v = max_speed*M_v/400;+ speed_v = max_speed*M_v/400-100;
   
  previous_error_p = error_p;  previous_error_p = error_p;
Line 289: Line 289:
  suund_v = TAGASI;  suund_v = TAGASI;
  }  }
 +
  p_error=jooneasukoht(PAREM);  p_error=jooneasukoht(PAREM);
  i_error+=p_error;  i_error+=p_error;
Line 297: Line 297:
  if(J>100)J=100;   if(J>100)J=100;
  if(J<-100)J=-100;  if(J<-100)J=-100;
- if (J>=0)speed_v=(speed_v*(100-J)/100); + speed_v = (speed_v*(100-J)/100); 
- else speed_p = (speed_p*(100+J)/100)+ speed_p = (speed_p*(100+J)/100);
- +
- // Kiiruse piiraja +
- if(speed_p > max_speed) speed_p = max_speed; +
- if(speed_v > max_speed) speed_v = max_speed;+
  
 + 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(PAREM,speed_p,suund_p);
- Motors(VASAK,speed_v,suund_v); + Motors(VASAK,speed_v,suund_v); 
 +
  }  }
 } }
 </code> </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 319: 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.1301480639.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