Bolu Beyi tarafından yazıldı Aralık - 20 - 2013 11 Yorum

ArduinoCircuitLogoPID Kontrolcüleri ile ilgili daha önceden bir makale paylaşmıştım, burada bulabilirsiniz:
PID Kontrolcüleri ve Ziegler-Nichols Teoremi

Bu yazımda da Arduino IDE üzerinde, IMU sensör üzerinden gelen verileri okuduğumuzu var sayarak basit bir PID Kontrolcü yazılımı geliştireceğiz. Daha sonra IMU’dan veri okuma yazılımını da sizlerle paylaşacağım. İntegral değerini hesaplarken basit bir integral sarması(integral wind up) tekniği kullandık. Yani IMU sensörden gelen açı bilgilerini(integral için) sürekli topladığımızda aşırı değerlerin gelmesini engellemek amacıyla I değerini -5 ile +5 (-IMAX ile +IMAX) aralığında sınırladık. Bununla birlikte sensörün açısı -1 ile +1 aralığında olursa, integral değerini sıfırladık.

PID Kontrolcü Arduino Kodu:

void PID_Hesapla()
{
double yaw, roll, pitch;
yaw = 0;
pitch = GyroY;
roll = GyroX;
Sayacc = millis();
dt = (Sayacc – OncekiSayac) / 1000.0;
OncekiSayac = Sayacc;// Yaw PID
Mevcut_hata[0] = Setpoint_ypr[0] – yaw;
p = YAW_KP * Mevcut_hata[0];
Zin += (double)((double)(Mevcut_hata[0])*dt*YAW_KI);
Zin = constrain(Zin, -IMAX, IMAX);
d = (double)((double)(-Onceki_hata[0] + Mevcut_hata[0])/dt);
d = OncekiYawD + dt / ( filtre + dt ) * (d – OncekiYawD);
d *= YAW_KD;
if(GyroZ < 1 && GyroZ > -1)
{
Zin = 0;
OncekiYawD = 0;
}
PID_ypr[0] = p + Zin + d;
Onceki_hata[0] = Mevcut_hata[0];
OncekiYawD = d;// Pitch PID
Mevcut_hata[1] = Setpoint_ypr[1] – pitch;
p = PITCH_KP * Mevcut_hata[1];
Yin += (double)((double)(Mevcut_hata[1])*dt*PITCH_KI);
Yin = constrain(Yin, -IMAX, IMAX);
d = (double)((double)(-Onceki_hata[1] + Mevcut_hata[1])/dt);
d = OncekiPitchD + dt / ( filtre + dt ) * (d – OncekiPitchD);
d *= PITCH_KD;
if(GyroY < 1 && GyroY > -1)
{
Yin = 0;
OncekiPitchD = 0;
}
PID_ypr[1] = p + Yin + d;
Onceki_hata[1] = Mevcut_hata[1];
OncekiPitchD = d;

// Roll PID
Mevcut_hata[2] = Setpoint_ypr[2] – roll;
p = ROLL_KP * Mevcut_hata[2];
Xin += (double)((double)(Mevcut_hata[2])*dt*ROLL_KI);
Xin = constrain(Yin, -IMAX, IMAX);
d = (double)((double)(-Onceki_hata[2] + Mevcut_hata[2])/dt);
d = OncekiRollD + dt / ( filtre + dt ) * (d – OncekiRollD);
d *= ROLL_KD;
if(GyroX < 1 && GyroX > -1)
{
Xin = 0;
OncekiRollD = 0;
}
PID_ypr[2] = p + Xin + d;
Onceki_hata[2] = Mevcut_hata[2];
OncekiRollD = d;
}

Bugüne kadar 11 yorum yapıldı

  1. GökhN dedi ki:

    Hocam bitirme projesi olarak uzaktan kontrollü denge robotu aldım..Bluetooth kontrolünü hallettim ama işin en zor kısmı pıd ve mpu kısmını halledemedim ..yardımcı olabilirmisiniz

  2. GökhN dedi ki:

    attığınız kodları kullandım fakat birçok hata verdi..
    Ben mpu6050 nin neye göre değerler verildiğini ve PID ile nasıl bağdaştırıldığını anlamadım.Cevap verdiğiniz için teşekkür ediyorum

    • Bolu Beyi dedi ki:

      PID için MPU’dan gelen x,y ve z eksenindeki açıları kullanmanız gerekiyor. Mesela quadrotorun dengede durması için 0 derece açı yapması gerekli. Eğer 1 derece açıya gelirse quadrotor bir tarafa doğru hareket edecektir. Bunu önlemek için de PID kullanmanız lazım. Gelen sonuçlara göre pervane (motor) hızlarını ayarlamanız gerekiyor.

      Hata kısmına gelince girdileri düzgün vermemiş olabilirsiniz. MPU’dan gelen açıları ekrana bir yazdırın kontrol edin derim.

    • Bolu Beyi dedi ki:

      Ek olarak, yukarıdaki kodlarda bahsedilen “mevcut hata” değişkeni, MPU’dan gelen açıları temsil ediyor.

  3. Gokhan dedi ki:

    Hocam bu yaptığınız guadro içinmi.
    Ben denge robotu için mpu ile yaptım ama pid ye yansitamadim

    • Bolu Beyi dedi ki:

      Aynen quadrotor için bu. Denge robotu için sanırım sadece x ve y eksenlerindeki açıları kullanmanız gerekiyor. Nasıl bir hata aldınız?

  4. GökhN dedi ki:

    hocam hata almadım .çünkü hiç anlayamadım bu pıd işini ..mpudan gelen verileri neye göre tanımlayıp denge işlemini yapıyor

    • Bolu Beyi dedi ki:

      MPU’dan gelen açı değerlerine (bunları optimize etmeniz gerekiyor 0-180 aralığında) göre her bir pervanenin yani motorun dönüş hızına karar veriyor.

  5. barış yusuf gündüz dedi ki:

    hocam merhaba ben bu pid işini anlayamadım cızgı ızleyen ıcın kullanıcam bana yardımcı olabılır misiniz? tesekkur ederım.

    • Bolu Beyi dedi ki:

      PID’yi dengeyi sağlamak için kullanıyoruz. Yani yaptığımız robotun belli bir açıda hareket etmesini istediğimiz zaman, hata değerlerinden yola çıkarak robotun dengede kalması sağlanıyor. Bildiğim kadarıyla çizgi izleyen robotlar tekerlekli şekilde yapılıyor. Eğer tekerlekli yapıyorsanız PID’ye ihtiyaç yok sanırım.


Time limit is exhausted. Please reload CAPTCHA.