PİD Nedir ?

Oransal-İntegral-Türevsel
PID kontrol, istenen bir set noktası ile ölçülen bir işlem değişkeni arasındaki fark olarak sürekli bir hata değeri hesaplayan bir geri besleme kontrol döngüsü mekanizmasıdır. Oransal, integral ve türevsel terimlere dayanarak bir düzeltme uygular, bu yüzden PID adını alır.
Oransal (P): Mevcut hata değerine orantılı bir çıktı üretir. Mevcut hataya tepki gösterir ve kontrol çıktısını buna göre ayarlar.
İntegral (I): Geçmiş hata değerlerinin birikiminden sorumludur ve oransal tepkiden sonra kalan herhangi bir ofseti ele alır. Sabit durum hatalarını ortadan kaldırmaya yardımcı olur.
Türevsel (D): Hatanın değişim hızına dayanarak gelecekteki hatayı tahmin eder. Aşırı sapmayı azaltır ve istikrarı iyileştirir.

PID Kontrolünün Uygulamaları
PID kontrolü, çeşitli endüstrilerde geniş bir uygulama yelpazesinde kullanılmaktadır:
Sıcaklık Kontrolü: PID kontrolörleri, fırınlar, ocaklar ve soğutma sistemleri gibi işlemlerde sıcaklığı düzenler.
İşlem Kontrolü: Kimya ve petrokimya endüstrilerinde, PID kontrolörleri basınç, akış hızı ve konsantrasyon gibi işlem değişkenlerini istenen seviyelerde tutar.
Hareket Kontrolü: PID kontrolörleri, robotik ve otomasyonda motorların konumunu, hızını ve torkunu kontrol etmek için kullanılır.
Akışkan Dinamikleri: Akışkan sistemlerinde, PID kontrolörleri sıvı ve gazların akış hızını ve basıncını düzenler.
Arduino ile PID Kontrolünün Uygulanması
Arduino ile PID kontrolü uygulamak için Arduino PID Kütüphanesi’ni kullanabilirsiniz, bu kütüphane projelerinizde PID kontrolünü kullanmayı basitleştirir.
Kurulum: İlk olarak, Arduino IDE’nin Kütüphane Yöneticisi’nden Arduino PID Kütüphanesi’ni yükleyin.
Ayar: Arduino skecinizde PID kütüphanesini dahil edin ve set noktası, giriş ve çıkış için gerekli değişkenleri tanımlayın. Ayrıca, bir PID örneği oluşturun ve PID parametrelerini (Kp, Ki, Kd) yapılandırın.
|
1 2 3 4 |
#include < PID_v1.h> double setpoint, input, output; double Kp = 2.0, Ki = 5.0, Kd = 1.0; PID myPID(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT); |
Yapılandırma: PID kontrolcünüzün modunu AUTOMATIC olarak ayarlayın ve çıkış sınırlarını tanımlayın.
|
1 2 |
myPID.SetMode(AUTOMATIC); myPID.SetOutputLimits(0, 255); |
Döngü: Ana döngüde, giriş değişkenini mevcut işlem değişkeniyle güncelleyin ve çıkışı hesaplamak için PID örneğinin Compute() metodunu çağırın. Bu çıktıyı aktüatörünüzü (örneğin, motor, ısıtıcı) kontrol etmek için kullanın.
|
1 2 3 4 5 6 |
void loop() { input = analogRead(sensorPin); myPID.Compute(); analogWrite(actuatorPin, output); delay(100); } |
Örnek PID Arduino Kodu -1
Bu kod ile sensörden alınan verilerle röle kontrolü gerçekleştirilmiş.
|
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 |
#include < PID_v1.h> #define input_pin 0 // Kullanacağımız pinleri belirliyoruz. #define role_pin 6 int Setpoint, Input, Output; // Değişkenleri tanımlıyoruz. double Kp=1, Ki=5, Kd=1; // Ayar parametrelerimizi tanımlayıp belirliyoruz. PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT); int WindowSize = 1000; // Pulse için belirlediğimiz maksimum süre. unsigned long windowStartTime; void setup() { Serial.begin(9600); windowStartTime = millis(); // Değişkenlerimizi atıyoruz, analog iletişimi başlatıyoruz. Setpoint = 90; // Suyun gelmesini istediğimiz sıcaklık değeri. myPID.SetMode(AUTOMATIC); // PID kontrolörümüzü açıyoruz. } void loop() { Input = analogRead(input_pin); // PID kontrolörümüze göre rölenin açık duruma geçmesi myPID.Compute(); // veya kapalı duruma geçmesini sağlayan kod. if (millis() - windowStartTime > WindowSize) { windowStartTime += WindowSize; } if (Output < millis() - windowStartTime) digitalWrite(role_pin, HIGH); else digitalWrite(role_pin, LOW); } |
Örnek PID Arduino Kodu – 2
|
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 |
#include <PIDController.h> /* ENCODER_A ve ENCODER_B pinleri, mikrodenetleyiciden enkoder verilerini okumak için kullanılır. Enkoderden gelen veriler çok hızlı gelir, bu nedenle bu iki pinin kesme etkinleştirilmiş olması gerekir. pinler */ #define ENCODER_A 2 #define ENCODER_B 3 /* MOTOR_CW ve MOTOR_CCW pinleri, H-köprüsünü sürmek için kullanılır. H-köprüsünden motorlar sürülür. Bu iki pinin PWM etkinleştirilmiş olması gerekir, aksi takdirde kod çalışmaz. */ #define MOTOR_CW 9 #define MOTOR_CCW 10 /* Bu bölümde oransal, integral ve türev kontrolörleri için kazanç değerlerini tanımladık. Kazanç değerlerini deneme yanılma yöntemleriyle belirledim. */ #define __Kp 260 // Oransal sabit #define __Ki 2.7 // İntegral sabiti #define __Kd 2000 // Türev sabiti volatile long int encoder_count = 0; // mevcut enkoder sayısını saklar unsigned int integerValue = 0; // gelen seri değeri saklar. Maksimum değer 65535'tir char incomingByte; // her bir karakteri tek tek ayrıştırır ve saklar int motor_pwm_value = 255; // PID hesaplamasından sonra veriler bu değişkene kaydedilir. PIDController pidcontroller; void setup() { Serial.begin(115200); // Hata ayıklama için seri port pinMode(ENCODER_A, INPUT); // ENCODER_A Giriş Olarak pinMode(ENCODER_B, INPUT); // ENCODER_B Giriş Olarak pinMode(MOTOR_CW, OUTPUT); // MOTOR_CW Çıkış Olarak pinMode(MOTOR_CCW, OUTPUT); // MOTOR_CW Çıkış Olarak /* Arduino'nun ENCODER_A pinine bir kesme ekleyin ve darbe yükselen kenarda olduğunda encoder() fonksiyonunu çağırın. */ attachInterrupt(digitalPinToInterrupt(ENCODER_A), encoder, RISING); pidcontroller.begin(); // PID örneğini başlatın pidcontroller.tune(260, 2.7, 2000); // PID'yi ayarlayın, argümanlar: kP, kI, kD pidcontroller.limit(-255, 255); // PID çıkışını -255 ile 255 arasında sınırlandırın, bu, integral birikimini ortadan kaldırmak için önemlidir! } void loop() { while (Serial.available() > 0) { integerValue = Serial.parseInt(); // integerValue'ı saklar incomingByte = Serial.read(); // /n karakterini saklar if (incomingByte == '\n') // yeni satır karakteri alırsak döngüye devam ederiz continue; } pidcontroller.setpoint(integerValue); // PID kontrol cihazının "ulaşmaya" çalıştığı "hedef", Serial.println(integerValue); // hata ayıklama için gelen değeri yazdırın motor_pwm_value = pidcontroller.compute(encoder_count); // PID'nin değeri hesaplamasına izin verin, hesaplanan optimum çıkışı döndürür Serial.print(motor_pwm_value); // hata ayıklama için hesaplanan değeri yazdırın Serial.print(" "); if (motor_pwm_value > 0) // motor_pwm_value sıfırdan büyükse motoru saat yönünde döndürüyoruz motor_ccw(motor_pwm_value); else // aksi takdirde saat yönünün tersine hareket ettiriyoruz motor_cw(abs(motor_pwm_value)); Serial.println(encoder_count); // son enkoder sayısını yazdırın. } void encoder() { if (digitalRead(ENCODER_B) == HIGH) // ENCODER_B yüksekse sayacı artırın encoder_count++; // sayacı artırın else // aksi takdirde sayacı azaltın encoder_count--; // sayacı azalt } void motor_cw(int power) { if (power > 100) { analogWrite(MOTOR_CW, power); // değer 100'den büyükse motoru döndür digitalWrite(MOTOR_CCW, LOW); // diğer pini LOW yap } else { // her iki pin de düşük seviyeye ayarlandı digitalWrite(MOTOR_CW, LOW); digitalWrite(MOTOR_CCW, LOW); } } void motor_ccw(int power) { if (power > 100) { analogWrite(MOTOR_CCW, power); digitalWrite(MOTOR_CW, LOW); } else { digitalWrite(MOTOR_CW, LOW); digitalWrite(MOTOR_CCW, LOW); |
Arduino için PID Kontrol Cihazı Kütüphanesini İndirin
Hobi ve Eğitim Projelerinde Uygulamalar
Sıcaklık Kontrolü: Bir DIY inkübatör veya lehim istasyonu gibi projelerde istenen bir sıcaklığı korumak için PID kontrolörü kullanın.
Motor Hız Kontrolü: Bir robotik araba veya CNC makinesi gibi projelerde DC motorun hızını düzenlemek için PID kontrolünü uygulayın.
Işık Yoğunluğu Kontrolü: Ortam ışık koşullarına bağlı olarak bir LED’in parlaklığını ayarlamak için kapalı döngü bir sistem oluşturun.
Çizgi İzleyen Robot: Bir çizgi izleyen robotun yönlendirme hassasiyetini artırmak için PID kontrolünü kullanın, böylece robot yolu daha düzgün bir şekilde takip eder.
Dengeleyici Robotlar: İki tekerlekli bir robotun dengesini korumak için PID kontrolünü uygulayın, bu robotlar bir Segway’e benzer şekilde çalışır.
Sonuç
Arduino ile PID kontrolü, geri beslemeli kontrol sistemlerini anlamak ve uygulamak için pratik ve elden bir yaklaşım sunar. Eğitim amaçları veya hobi projeleri için olsun, PID kontrolü ve Arduino platformunun kombinasyonu, kontrol teorisi ve uygulamalarını keşfetmek için çok yönlü ve erişilebilir bir araç sağlar.
