Bu 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, Ç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
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.
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
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
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.
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?
Yeni başlayanlar için bağlantı şemasını http://fritzing.org/ ile çizerek resmini koymanız mümkün mü acaba ?
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.
Bahsettiginiz olayı gerceklestirebildiniz mi ? Şu an tam olarak ihtiyacım olan şey bu 🙂
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?
Gain3 de ne yazıyor?