Matlab & Simulink ile PID Denetleyici

Posted by on Oca 6, 2015 in Arduino

matlab-simulink-arduino-unoBu makalemde Matlab & Simulink ile Arduino’nun haberleşmesini örnek bir sistem üzerinden sağlayarak sizlere anlatmaya çalışacağım.

Matlab, Simulink üzerinden modellenecek olan bir PID denetleyici ölçülü bir süreç içinde değişen ve istenilen sıcaklık/nem arasındaki farkı gömülü sistemler (Arduino) üzerinden alarak bir “hata” değeri hesaplar. Bu duruma göre kontrol girişini ayarlayıp hatayı en aza indirerek, istenilen sıcaklık değerine ulaşmak için çalışması istenmektedir.

Gereçler:

  • Arduino UNO
  • DHT11
  • DC Fan
  • Matlab & Simulink

 

DHT11

dht11

DHT11, Çok hassas ölçümler gerektirmeyen, biraz daha genel ölçümlere ihtiyaç duyduğumuz projelerde kullanabileceğimiz, kullanımı kolay ve ucuz bir çözüm olan sıcaklık ve nem sensörüdür.

 

 

Algoritma

algoritma

 

Algoritmayı 2 motorlu olarak yazdım fakat tek motorlu olarak anlatacağım. 2. motoru bilgisayarın fanı olarak düşünebiliriz malum kendisi çok sıcak 🙂

 

 

PID Denetleyici

Endüstriyel kontrol sistemlerinde çok sık kullanılan denetim biçimidir. Japonya da bile %80-90 oranında PID kullanılmaktadır. Yapısının basitliği, anlaşılmasının kolay oluşu, ayarlanacak değişken sayısının az oluşu ve fiziksel gerçeklemenin kolay oluşu onu tercih sebebi yapmıştır.

pid-denetleyici

P – Proportional / Oransal
I – Integral / İntegral
D – Derivative / Türevsel

 

 

Ortam sıcaklık ve nem bilgisi (100 sn)

PID denetleyicimizin katsayılarını belirleyebilmemiz için ortam bilgisine ve istediğimiz sıcaklık değerine ihtiyacımız olacak. Bu yüzden örnek olarak 100 saniyelik zaman diliminde oda sıcaklığını ölçtüm. Ölçülen sıcaklık ve nem bilgisini Arduino üzerinden Matlab’e alabilmek için kullandığım kodlar şu şekilde:

Arduino:

// Caner Gezgez - cnRgzgz.com
#include <DHT11.h>

int pin=2;
DHT11 dht11(pin);
void setup()
{
Serial.begin(9600);
while (!Serial) {
; // Seri haberleşme
}
}

void loop()
{
int err;
float temp, humi;
if((err=dht11.read(humi, temp))==0)
{
//Sıcaklık değerini yolla
Serial.print(temp);

//Nem değerini yolla
Serial.print(humi);
Serial.println();
}
else
{
Serial.println();
Serial.print("Hata:");
Serial.print(err);
Serial.println();
}
delay(DHT11_RETRY_DELAY); // Tekrar okumak için bekle
}

 

Matlab:

% Seri haberleşme ile Arduino üzerinden
% sıcaklık ve nem bilgisi alınmıştır.
s = serial ( 'COM9');
zaman=100;
i=1;
fopen(s);

while(i<zaman)
fprintf(s, 'Seri haberleşme bilgisi');
out = fscanf(s)

Temp(i) = str2num(out(1:4));
subplot(211);
plot(Temp,'g');
axis([0,zaman,20,50]);
title('DHT11 Sıcaklık');
xlabel('---> Zaman (Saniye)');
ylabel('---> Sıcaklık');
grid

Humi(i)=str2num(out(5:9));
subplot(212);
plot(Humi,'m');
axis([0,zaman,25,100]);
title('DHT11 Nem');
xlabel('---> Zaman (Saniye)');
ylabel('---> % Nem ');
grid

i=i+1;
drawnow;
end
fclose(s)
delete(s)
clear s
%Caner Gezgez - cnRgzgz.com

Alınan ortam bilgisi grafiği ve deneysel ayar

matlab-grafikmatlab-grafik-deneysel

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Olması istenilen ortam sıcaklığını 25C olarak belirledim. Deneysel yaklaşım yöntemini kullanarak grafiği incelersek eğer istenmeyen sıcaklıklar olan g1 ve g2’nin 25C ile olan farklarını görebiliriz. Sıcaklığı bu aralıklarda tutmak için Kp=0.25; Ki=0.1; Kd=0.41 olarak belirledim.

Matlab & Simulink modeli

matlab-simulink-modeli

 

 

 

Arduino ile Matlab ve Simulink’i haberleştirebilmeniz için anahtar kelimeyi söylüyorum: Simulink Support Package for Arduino Hardware

Sonuç

  • Matlab ile Arduino’nun seri haberleşmesi sağlandı.
  • Prototip yapma aşamasında Matlab ile modelleme yeteneği kazanılabilir.

Fırsatlar

  • Bir sonraki aşamada çift motor kullanılabilir.
  • Farklı prototipler elde edilebilir.

Matlab & Simulink ile PID Denetleyici

4 Comments

  1. why do u use a Gain3 block, what is the value of that block?
    the 29 DHT11 block, is a constant…supose that is the temperature read from the sensor?

  2. Yeni başlayanlar için bağlantı şemasını http://fritzing.org/ ile çizerek resmini koymanız mümkün mü acaba ?

  3. Güzel bir uygulama olmuş.. Kodlarda ısı okunuyor fakat simulinkte sabit olarak elle girilmiş. kodlarda motora yazan birşey yok. simulinkte görünüyor.. Arduino içine sadece sıcaklık verisini alan ve sadece motora sinyal gönderen bir kod yazılır ise simulink üzerinden online olarak bu veri alınır ve motora kontrol sinyali gönderilebilir.

  4. Merhabalar güzel bir paylaşım olmuş, teşekkürler. Kp=0.25, Ki=0.1 ve Kd=0.41 sabitlerini nasıl belirlediniz acaba?

Bir Cevap Yazın