Bu yazımızda robotikle, robotlarla ve otomasyon sistemleri ile uğraşanların sıkça duyduğu PID’yi ele alacağız. PID kelimesi “proportional integral derivative” kelimelerinin kısaltılmasından gelir. Türkçesi “oransal integral türev” anlamına gelir. Türev-İntegral geçtiği için biraz göz korkutsa da bu yazı ile ilköğretimde okuyan biri bile PID kontrolü anlayabilir.
PID Nedir? Nerede ve Ne İçin Kullanılır?
PID, içerisinde otomasyon içeren birçok sistemde kullanılan kontrol yöntemidir. Anlık verilerinin yanında önceki verilere göre gerçekleşen değişimleri kullanarak sistemi kontrol eder. Uçakların otopilotları, şerit takip sistemleri, akıllı ev sistemleri, uzay araçları, ısıtıcılar-soğutucular ve daha sayamadığım yüzlerce farklı işlerde kullanılır. Konuyu çizgi izleyen robot üzerinden anlatarak diğer teknolojilerde nasıl kullanılacağından da bahsedeceğim.
PID’nin Avantajları
Konuya bir robotu pid ile kontrol etmenin getirdiği farktan bahsederek başlayalım. PID kelimesinin açılımındaki “oransal” kontrol, robotun çizgiye olan uzaklığına göre düzeltme manevrası ile yapılır. Birçoğumuzun ilk yaptığı çizgi izleyen robot, oransal kontrol ile çalışmış oluyor. Örneğin çizgiye uzaklığı -5 ile 5 arasında tanımlayalım. 0 değeri merkez yani çizginin üzerinde bulunduğu durum. Negatif kısım solda, pozitif kısım sağda olduğunu gösteriyor.
Çizgi sensörümüzün aldığı verilere göre robotun verdiği kararları aşağıdaki gibi yapabiliriz:
-1 hafif sağa dön
-3 sağa dön
-5 sağa keskin dön
1 hafif sola dön
3 sola dön
5 sola keskin dön
Robotumuz sadece böyle karar alarak aslında sola döndüğünde düzeltmesi için tekrar sağa dönmesi, bunu düzeltmesi için tekrar sola dönmesi şeklinde bir döngüye girer. Sürekli sağa ve sola titreme yaparak çizgiyi izler. Eğer aldığımız verileri PID algoritması ile işlersek hem bu titremenin önüne geçmiş oluruz hem de çizgiyi daha tutarlı şekilde takip etmesini sağlarız. Bir uçağın otopilotunda PID algoritma kullanmadığımız bir sistem düşünürsek uçak irtifasını korumaya çalışmak için sürekli aşağı-yukarı kumanda vererek uçuş güvenliğini düşürür. Yolcu konforundaki farkı tahmin edebiliriz.
Aşağıdaki ilk videoda sadece oransal kullanılmış bir çizgi izleyen robot, ikinci videoda pid algoritması kullanılmış bir robot ve bunların arasındaki farkları görüyoruz.
Türev ve Integral Nedir?
Şimdi türev ve integrale bakabiliriz. Türev tanım olarak bir durumda yaşanan en küçük değişimdir. Fakat tanım ile değil bir örnek ile açalım. Damlayan bir musluk ve altında bir kova hayal edelim. Musluk damladıkça kova dolacaktır. Musluğumuz her saniye başında bir damla su damlatıyor ise bu kovadaki su miktarında meydana gelebilecek en küçük değişim bir damla kadar sudur. Her saniye bir damla kadar su miktarı artıyor. Daha az bir değişim gözlemleyemiyoruz. Yarım damla veya 2 damla. En küçük değişim miktarımız yani türevimiz o zaman bir damladır. Türevi kısaca bu kadar bilmek PID kontrolü anlamak için yeterli olacaktır.
Şimdi kovamıza bir delik açalım. Buradan da belirli aralıklarla su boşalsın. Bir yandan kovamız damlayan musluk ile dolarken bir yanda da boşalacak. Doldurma hızımızın boşaltma hızından yüksek olduğunu kabul edelim. Bir gece bekleyince kovada bir miktar su olduğunu görürüz. Örneğin kovada 5L su bulunsun. O zaman, şimdiden musluğun damlamaya başladığı zamana kadarki integralimiz 5L sudur. Bu süreçte kovamız hem su dolmuş hem de su akıtmıştır. Bunların hepsinin eklenmesi ile integrali hesapladık. Bu örnek de PID kontrol için yeterli bir integral bilgisi oluşturmuştur.
PID ile Çizgi İzleyen Robot Uygulaması
Şimdi çizgi izleyen robotumuzda türevi ekleyerek PID algoritmamızı birlikte oluşturalım:
Az önceki -5 ile 5 arasında değer veren sensörümüzü tekrardan alalım. Bu değere hata ismini verelim. Hatamız 5 olsun. Robotumuz “sola keskin dön” kararını alır. Sola doğru giderken bir an sonra 2 değerini aldığında türevimiz (değişim son durum-ilk durum formülü hesaplanır.) 2-5=-3 olur. Şu anda hatamız 2 ve türevimiz -3. Toplam durum 2+(-3)=-1 oldu. O zaman şimdi robotumuz “hafif sağa dön” komutunu vermeli. Böylece robot keskin solun ardından hafifçe sağa yönelerek çizgi ile paralelleşerek çizgiye yerleşir. Aşağıdaki fotoğrafta mavi grafik sadece oransal hesaplamayı, kırmızı grafik ise türev eklenmesini ifade ediyor.
Peki integrali eklersek ne olur?
İntegral kova örneğinden hatırlarsak birikimli olarak ilerleyen bir şey. İçerisinde 10 dakika öncesi de bulunuyor. Türeve karşı negatif etki yaparak robotun daha sert dönmesine yol açar. Çünkü o süreç içerisinde kendisine sürekli ekleme yapar.
Örneğin robotun hatası 5 olsun. Bir sonraki durumda 3, daha sonrakinde 1 olsun. İntegral sürekli ekleme yaparak 5+3+1=9 olur. Türev ile 5 olan keskin dönüşü azaltmış iken integral daha da keskin dönüşe zorlar. Aşağıdaki grafikte olduğu gibi. Bunu engellemek için PID kontrolde katsayılar kullanılır. Örneğin integralin katsayısını 0,1 yaparsak 9 yerine 0.9 ekler. Böylece etkisi azaltılır. Aynı şey oransal ve türevi için de geçerlidir. Robotun karakteristiğine göre katsayıları belirleriz. Örneğin, türevin katsayısı 1 iken robot hala titreme yapıyorsa katsayıyı artırmamız gerekir ya da robot çizgiyi bulamıyor ise katsayıyı düşürmemiz gerekir.
O zaman bütün bunları birleştirerek PID kontrol için bir formül yazalım:
Kp: Oransal Katsayı
Ki: İntegralin katsayısı
Kd: Türevin katsayısı
PID = Kp*hata + Kd*Türev + Ki*İntegral
Türev ve integrali ise şu şekilde hesaplayabiliriz:
Önceki Durum: Bir önceki anda alınan hata
Toplam: Önceki alınan her hatanın toplamı
Türev = Hata – Önceki Durum
İntegral = Toplam + Hata
Şimdi Arduino üzerinde PID ile çizgi izleyen robotu kontrol eden bir program yazarak öğrendiklerimizi destekleyelim.
Projenin Malzemeleri
Arduino Nano Klon – USB Kablo Hediyeli
QTR-8A Analog Kızılötesi Sensör Kartı – Çizgi İzleyen
6V 250 RPM Redüktörlü Motor – Sarı
L293D Motor Sürücü Entegresi – Dip16
#include <QTRSensors.h>
#define motor1a A0
#define motor1b A1
#define motor1p 10
#define motor2a A2
#define motor2b A3
#define motor2p 11
QTRSensors qtr; //tanimlamalar
int error, turev,guc,lasterror=0;
int integral=0;
int solll,saggg;
int hiz=100;
float kp=0.03;
float kd=0.01; //pid katsayilari
float ki=0;
const uint8_t SensorCount = 8;
uint16_t sensorValues[SensorCount];
void setup() {
qtr.setTypeRC(); //Analog sensor kullanilacaksa setTypeRC yerine setTypeAnalog kullanin
qtr.setSensorPins((const uint8_t[]){9,8,7,6,5,4,3,2}, SensorCount); //sensor tanimlama
delay(500);
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
pinMode(10, OUTPUT);
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(11, OUTPUT);
//kalibrasyon kodlari
for (uint16_t i = 0; i < 400; i++)
{
qtr.calibrate();
}
digitalWrite(13, LOW);
Serial.begin(9600);
for (uint8_t i = 0; i < SensorCount; i++)
{
Serial.print(qtr.calibrationOn.minimum[i]);
Serial.print(' ');
}
Serial.println();
for (uint8_t i = 0; i < SensorCount; i++)
{
Serial.print(qtr.calibrationOn.maximum[i]);
Serial.print(' ');
}
Serial.println();
Serial.println();
delay(1000);
}
void loop(){
digitalWrite(motor1a,HIGH);
digitalWrite(motor2a,HIGH);
digitalWrite(motor2b,LOW);
digitalWrite(motor1b,LOW);
uint16_t position = qtr.readLineWhite(sensorValues);
error=position-3500;
integral=integral+error;
turev=error-lasterror;
lasterror=error;
guc=(kp*error)+(kd*turev)+(integral*ki);
solll=hiz+guc;
saggg=hiz-guc;
if(solll<0) solll=0;
if(saggg<0) saggg=0;
if(solll>255)solll=255;
if(saggg>255) saggg=255;
analogWrite(motor1p,solll);
analogWrite(motor2p,saggg);
}
Proje ile örneklendirdikten sonra PID’nin diğer uygulamaları hakkında birkaç örnek verebiliriz.
PID Uygulama Örnekleri
Uçaklar uçarken pilotlar sürekli el ile kumanda vermezler. Otopilota izlenecek yol ve irtifa bilgisi girildikten sonra otopilot bu işlemi yapar. Uçaklardaki otopilotun çalışma mantığının çizgi izleyen robot ile aynıdır. Belirli rota çizgisi üzerinde uçağı tutar. Aynı şekilde irtifada da olması gereken irtifa ile hata payına göre hesaplama sonucu gerekli kumanda verilir. Böylece sürekli aşağı-yukarı şeklinde kumanda verilmez.
Hastanelerde ve iş yerlerinde gördüğümüz akıllı ısıtma-soğutma sistemleri de PID kontrol ile çalışmaktadır. Eğer sadece oransal kontrol kullanılsaydı ayarlanan dereceyi geçince soğutma, tekrar ısıtma yaparak hem enerji zararına hem de ısıtma soğutma sisteminin çabuk bozulmasına sebebiyet verirdi.
Bu yazımızda PID kontrolün ne olduğuna, türev-integral ile bağlantısına, nasıl kullanılacağına ve endüstriyel uygulamalarına baktık. Umarım faydalı olmuştur.