Mecanum Tekerli Araç Kontrolü
Bu projede arduino ile mecanum tekerli araç kontrol edeceğiz. Mecanum tekerler sayesinde aracınızı her yöne hareket ettirebilirsiniz.
Aracınızı ileri-geri dışındaki yönlerde kontrollü bir şekilde hareket ettirmek için dikkat etmeniz birkaç husus var.
Bunlar:
- Aracınız çok hafif olmamalı(Ağırlık teker boyutuna göre değişir)
- Encoder ve yüksek torklu motor kullanılmalı
- Tekerler düşük devirlerde kullanılmalı
Videodaki araçta kullandıklarım:
- Aduino Due
- Rover 5 motor sürücü
- 350rpm 12V encoderli motor(8nm)
- 1 set encoder teker.
- PSU
- Kontrplak ve çita
Bağlantı kısmını bu aşamaya gelmiş herkesin yapabileceğini düşündüğüm için geçiyorum.
Kod
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 |
#include <Encoder.h> //encoder kütüphanesi Encoder m4_enc(49, 48); //her bir motor için Encoder m3_enc(47, 46); //encoder bağlantılarını Encoder m2_enc(44, 45); //tanımlıyoruz Encoder m1_enc(42, 43); byte m4_pwm_pin=2; //hız kontrolü için byte m3_pwm_pin=3; //pwm pinleri byte m2_pwm_pin=4; byte m1_pwm_pin=5; byte m4_yon_pin=53; //yön pinleri byte m3_yon_pin=51; //rover 5 sürücüde diğier byte m2_yon_pin=52; //sürücülerden farklı olarak byte m1_yon_pin=50; //tek pin ile yön kontrolü yapılabiliyor char m4_i_pin=A11; //rover 5 motorların çektiği char m3_i_pin=A10; //akımları bize analog char m2_i_pin=A9; //olarak bildirebiliyor char m1_i_pin=A8; float kd=0.75; //pid kontrol için float kp=0.75; //kd kp değerleri unsigned long t; long m1_x, m2_x, m3_x, m4_x, eski_m1_x, eski_m2_x, eski_m3_x, eski_m4_x; int ger_m1_hiz, ger_m2_hiz, ger_m3_hiz, ger_m4_hiz, m1_hiz, m2_hiz, m3_hiz, m4_hiz, m1_pwm, m2_pwm, m3_pwm, m4_pwm, m1_i, m2_i, m3_i, m4_i; boolean m1_yon, m2_yon, m3_yon, m4_yon; /* * m1_x birinci motorun encoderından okuduğumuz toplam puls * eski_m1_x birinci motorun encoderından okuduğumuz bir önceki toplam puls * ger_m1_hiz birinci motorun çalışmasını istediğimiz hız * m1_hiz birinci motorun anlık hızı * m1_pwm birinci motora gönderilen pwm * m1_yon birinci motorun yönü * */ */ int i; void setup() { pinMode(m4_pwm_pin, OUTPUT); pinMode(m3_pwm_pin, OUTPUT); pinMode(m2_pwm_pin, OUTPUT); pinMode(m1_pwm_pin, OUTPUT); pinMode(m4_yon_pin, OUTPUT); pinMode(m3_yon_pin, OUTPUT); pinMode(m2_yon_pin, OUTPUT); pinMode(m1_yon_pin, OUTPUT); Serial.begin(9600); } void loop() { //Videodaki hareketler if (millis()-t>10){ if (i<100){ yuru(30,0,0); } else if (i>100 && i<200){ yuru(-30,0,0); } else if (i>200 && i<300){ yuru(0,30,0); } else if (i>300 && i<400){ yuru(0,-30,0); } else if (i>400 && i<500){ yuru(0,0,30); } else if (i>500 && i<600){ yuru(0,0,-30); } else if (i>600 && i<700){ yuru(30,30,0); } else if (i>700 && i<800){ yuru(-30,-30,0); } else if (i>800 && i<900){ yuru(30,30,30); } else{ yuru(0,0,0); } i++; t=millis(); } /* Serial.print(m1_hiz); Serial.print(" "); Serial.print(m2_hiz); Serial.print(" "); Serial.print(m3_hiz); Serial.print(" "); Serial.print(m4_hiz); Serial.print(" "); Serial.print(m1_pwm); Serial.print(" "); Serial.print(m2_pwm); Serial.print(" "); Serial.print(m3_pwm); Serial.print(" "); Serial.println(m4_pwm); */ } //her motor için encoder okuması void yollar(){ m1_x=m1_enc.read(); m2_x=m2_enc.read(); m3_x=m3_enc.read(); m4_x=m4_enc.read(); } //motorların anlık hızlarının hesaplanması void hizlar(){ yollar(); m1_hiz=eski_m1_x-m1_x; m2_hiz=eski_m2_x-m2_x; m3_hiz=eski_m3_x-m3_x; m4_hiz=eski_m4_x-m4_x; eski_m1_x=m1_x; eski_m2_x=m2_x; eski_m3_x=m3_x; eski_m4_x=m4_x; } //motorların pwm sinyallerinin ve yönlerinin düzenlenmesi void motor(){ m1_pwm=constrain(m1_pwm, -255, 255); m2_pwm=constrain(m2_pwm, -255, 255); m3_pwm=constrain(m3_pwm, -255, 255); m4_pwm=constrain(m4_pwm, -255, 255); if (m1_pwm>0){ m1_yon=1; } else{ m1_yon=0; } if (m2_pwm>0){ m2_yon=0; } else{ m2_yon=1; } if (m3_pwm>0){ m3_yon=1; } else{ m3_yon=0; } if (m4_pwm>0){ m4_yon=0; } else{ m4_yon=1; } digitalWrite(m1_yon_pin, m1_yon); digitalWrite(m2_yon_pin, m2_yon); digitalWrite(m3_yon_pin, m3_yon); digitalWrite(m4_yon_pin, m4_yon); analogWrite(m1_pwm_pin, abs(m1_pwm)); analogWrite(m2_pwm_pin, abs(m2_pwm)); analogWrite(m3_pwm_pin, abs(m3_pwm)); analogWrite(m4_pwm_pin, abs(m4_pwm)); } /* * bu fonksiyonda * 1. parametre aracın ileri-geri hzız * 2. parametre sağ-sol hızı * 3. parametre kendi ekseni etrafında dönme hızı * fonksiyon girilen bu parametreleri kullanarak * hangi motorun hangi yönde hangi devirde dönmesi * gerektiğini hesaplıyor */ void yuru(int hiz_y, int hiz_x, int hiz_aci){ int toplam_hiz=hiz_y+hiz_x+hiz_aci; if (toplam_hiz>255){ hiz_y=255*hiz_y/toplam_hiz; hiz_x=255*hiz_x/toplam_hiz; hiz_aci=255*hiz_aci/toplam_hiz; } ger_m1_hiz=hiz_y+hiz_x-hiz_aci; ger_m2_hiz=hiz_y-hiz_x-hiz_aci; ger_m3_hiz=hiz_y-hiz_x+hiz_aci; ger_m4_hiz=hiz_y+hiz_x+hiz_aci; pwm_hesapla(); } //pid ile pwm hesabı int m1_pid(int hedef_dgr, int dgr){ float pidTerm; int hata; static int son_hata; hata=hedef_dgr-dgr; pidTerm=(hata)*kp+((hata-son_hata)*kd); son_hata=hata; return (m1_pwm+int(pidTerm)); } int m2_pid(int hedef_dgr, int dgr){ float pidTerm; int hata; static int son_hata; hata=hedef_dgr-dgr; pidTerm=(hata)*kp+((hata-son_hata)*kd); son_hata=hata; return (m2_pwm+int(pidTerm)); } int m3_pid(int hedef_dgr, int dgr){ float pidTerm; int hata; static int son_hata; hata=hedef_dgr-dgr; pidTerm=(hata)*kp+((hata-son_hata)*kd); son_hata=hata; return (m3_pwm+int(pidTerm)); } int m4_pid(int hedef_dgr, int dgr){ float pidTerm; int hata; static int son_hata; hata=hedef_dgr-dgr; pidTerm=(hata)*kp+((hata-son_hata)*kd); son_hata=hata; return (m4_pwm+int(pidTerm)); } void pwm_hesapla(){ hizlar(); m1_pwm=m1_pid(ger_m1_hiz, m1_hiz); m2_pwm=m2_pid(ger_m2_hiz, m2_hiz); m3_pwm=m3_pid(ger_m3_hiz, m3_hiz); m4_pwm=m4_pid(ger_m4_hiz, m4_hiz); motor(); } |
Son Yorumlar