Bu projede PID kontrol tabanlı topu denge noktasında sabitleyen iki eksenli top dengeleme robotunun yapımından bahsedeceğim.Top dengeleme sisteminde iki yöntem kullanılmaktadır. Birinci yöntem topun mesafesini ölçerek diğer yöntem ise görüntü işleme tabanlı yapılmaktadır. Ben ilk yöntemi uygulayacağım. Dengeleme sistemi topun mesafesini ölçerek PID algoritmasında belirlediğimiz noktada sabitlenmesini sağlayacaktır. Ayrıca matlab üzerinden de topun mesafesini anlık görebileceğiz.
Malzemeler
Mekanik Kısım
Arduino Yazılımı
Arduino yazılım kısmında Setpoint tanımlaması topun duracağı noktadır.Bu noktanın değerini değiştirerek topun istediğimiz noktada kalmasını sağlayacağız.
NOT: Topun hareket ettiği düzlemin yatay olabilmesi için, servo motor açısı 102 derece olmalıdır.
Malzemeler
- Arduino Uno
- Ping Ultrasonik Sensör
- Dijital Servo Motor (20kg.cm ideal)
- 5v DC Güç Kaynağı
Elektronik Kısım
- [col]
- Sensör Bağlantıları
- Sinyal Pin – Dijital 7.PinVCC- 5VGND – GND
- Servo Motor Bağlantıları
- Sinyal Pin – Dijital 9.PinVCC – 5VGND – GND
Mekanik Kısım
Top 34 cm uzunluğunda bir düzlemde hareket edecek.Alttaki kısımda servo motor kolu döndürerek üstteki düzlemi hareket ettirecek.Gerekli uzunluklar şekilde gösterilmiştir.
Yazılım Kısmı
MATLAB Yazılımı
clear all
close all
clc
arduino=serial('COM3','BaudRate',9600); % Portunuzu arduino portuyla aynı yaptım
fopen(arduino);
CM(1)=0;
time(1)=0;
i=1;
tic;
while (toc<=100)
CM(2)=fscanf(arduino,'%f');
time(2)=toc;
figure(1);
grid on;
axis([toc-10, toc+10, 0, 35])
h(i)=plot(time,CM,'b','LineWidth',5);
hold on
CM(1)=CM(2);
time(1)=time(2);
if(i >= 300)
delete(h(i-299));
end
i=i+1;
end
fclose(arduino);
Arduino Yazılımı
PID Kütüphanesi > PID_v1
#include
#include
const int servoPin = 9;
float Kp = 2.5;b// İlk Oransal Kazanç
float Ki = 0; // İlk İntegral Kazancı
float Kd = 1.1; //İlk Türev Kazancı
double Setpoint, Input, Output, ServoOutput;
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
Servo myServo;
void setup() {
Serial.begin(9600);
myServo.attach(servoPin);
Input = readPosition();
myPID.SetMode(AUTOMATIC);
myPID.SetOutputLimits(-80,80); // -80 ile 80 derece arası
}
void loop()
{
Setpoint = 15; // Denge Noktası
Input = readPosition();
myPID.Compute();
ServoOutput=102+Output;
myServo.write(ServoOutput);
}
float readPosition() {
delay(40);
const int pingPin = 7;
long duration, cm;
unsigned long now = millis();
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);
pinMode(pingPin, INPUT);
duration = pulseIn(pingPin, HIGH);
cm = duration/(29*2);
if(cm > 30) // 30 cm top için maksimum pozisyon
{cm=30;}
Serial.println(cm);
return cm; //Mesafe değerini döndürür.
}
Arduino yazılım kısmında Setpoint tanımlaması topun duracağı noktadır.Bu noktanın değerini değiştirerek topun istediğimiz noktada kalmasını sağlayacağız.
NOT: Topun hareket ettiği düzlemin yatay olabilmesi için, servo motor açısı 102 derece olmalıdır.