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/04/04 19: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 113: Line 106:
  
 ==Lähtekood== ==Lähtekood==
-<code java>+ 
 +<code c> 
 // Standardteegid // Standardteegid
 #include <homelab/pin.h> #include <homelab/pin.h>
Line 124: 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 132: 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 150: 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 169: Line 161:
  }  }
  }  }
 +
  
 } }
Line 174: 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 186: 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 201: 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 210: 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 223: 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 240: 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 262: 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 291: 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 299: 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 327: Line 333:
 | Põhikontroller      | ATmega128 arendusplaat | 1     | 65     | 65          | | Põhikontroller      | ATmega128 arendusplaat | 1     | 65     | 65          |
 | Mootorikontroller   | L293D moodulplaat      | 1     | 15     | 15          | | Mootorikontroller   | L293D moodulplaat      | 1     | 15     | 15          |
-| Mootorid            | 12V 0.05Nm, 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     | 15     | 30          | | Ultraheli andurid   | SRF04                  | 2     | 15     | 30          |
 | Jooneandurid        | QRD1114                | 5     | 2,5    | 12,5        | | Jooneandurid        | QRD1114                | 5     | 2,5    | 12,5        |
Line 336: Line 342:
 | Sisend-väljundplaat | LED ja Mikrolüliti     | 5 + 1 | 0,3    | 1,8         | | Sisend-väljundplaat | LED ja Mikrolüliti     | 5 + 1 | 0,3    | 1,8         |
 | Makettplaat         | 100x160mm              | 1     | 6,4    | 6,4         | | Makettplaat         | 100x160mm              | 1     | 6,4    | 6,4         |
-^ Kokku                                      ^       ^ ^ ^+| 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.+Ü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. Ü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.
Line 354: Line 375:
  
 ====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.1301945027.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