Arduino İle Top Dengeleme Robotu Yapımı

27 17.895

Bu projemizde 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.Bir yöntem topun mesafesini ölçerek diğer yöntem de  görüntü işleme tabanlı yapılmaktadır.Görüntü işleme ile dengeleme sistemini ilerleyen günlerde anlatacağım.Bu projemizin dengeleme sistemi için topun mesafesini ölçerek PID algoritmasında belirlediğimiz noktada sabitlenmesini sağlayacak bir algoritma geliştireceğiz.Ayrıca matlab üzerinden de topun mesafesini anlık görebileceğiz.Top dengeleme robotu projemize başlayalım.

Malzemeler:

  1. Arduino Uno
  2. Ping Ultrasonik Sensör
  3. Dijital Servo Motor (20kg.cm ideal)
  4. 5v DC Güç Kaynağı

Elektronik Kısım:

Sensör Bağlantıları:

Sinyal Pin – Dijital 7.Pin

VCC- 5V

GND – GND

Servo Motor Bağlantıları:

Sinyal Pin – Dijital 9.Pin

VCC – 5V

GND – 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ı >> Matlab PID Plot

Ardino Yazılımı:

PID Kütüphanesi >> PID_v1

#include<Servo.h>
#include<PID_v1.h>
const int servoPin = 9;
float Kp = 2.5;// İ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.

Güncelleme : 09.02.2017

Hc-Sr04 Ultrasonik sensörle yapmak isterseniz aşağıdaki kodu kullanabilirsiniz. Sensörün trig pini D6, echo pini D7 pinlerine takınız.

#include<Servo.h>
#include<PID_v1.h>
const int servoPin = 9;
float Kp = 2.5;// İ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;
#define trigPin 6
#define echoPin 7
void setup() {

Serial.begin(9600);
myServo.attach(servoPin);
Input = readPosition();
myPID.SetMode(AUTOMATIC);
myPID.SetOutputLimits(-80,80); // -80 ile 80 derece arası
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}

void loop()
{
Setpoint = 15; // Denge Noktası
Input = readPosition();

myPID.Compute();

ServoOutput=102+Output;
myServo.write(ServoOutput);
}

float readPosition() {
delay(40);
long duration, cm;
unsigned long now = millis();
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
cm = (duration/2) / 29.1;

if(cm > 30) // 30 cm top için maksimum pozisyon
{cm=30;}

Serial.println(cm);

return cm; //Mesafe değerini döndürür.
}

 

Bunlar da İlgini Çekebilir
Cevap bırakın

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

27 Yorum
  1. Mehmet Eren

    hocam matlab yazılımını güncelleme şansınız var mı linke ulaşamıyorum.Şimdiden teşekkürler

  2. mehmet

    hocam top 15 cm altında olduğunda hata veriyor kodda eksiklik var mı bu kısımda bilgilendirirsen teşekkür ederim

  3. deniz

    mekanik kısımda 34 cm vsnin zemin genişlikleri kaç cm olmalı acaba?

  4. emre

    merhaba ben araştırmada yaptım sonuca ulaşamadım burada pid kontrolde ki kd kp değerlerini nasıl buldunuz hesaplama kısmında biraz detaylı açıklayabilir misiniz

  5. Abdurrahim

    Hocam mümkünse simülink modelinide bizimle paylaşabilir misin? bu konularda yeniyim bu projeyi de yapmak istiyorum. bu konuda yardımcı olabilir misiniz?

  6. Emre

    Merhaba ben bitirme projesi olarak yaptım bunu ancak dengeleme işlemi setpoint noktasından hep uzakta oluyor yaklasik olarak 25 cm ve sonrasina gecince servo motoru durduruyor nerde hatam var yardimci olurmusunuz.

  7. Osman

    Merhaba Hocam

    Kullandığınız servo motorun seri numarasını verebilirmisiniz?
    MG90s kullanıyorum ve motorun set noktasında sabitlemesinden verim alamıyorum motor ya set noktasından uzaklastıkca topu dahada uzaklastırıyor yardımcı olursanız sevinirim

  8. Kayhan

    Merhaba ben bu çalışmayı çok beğendim fakat benimde bir bitirme ödevim var dengeleme sistemi bir tavla üzerinde bunu üç boyuta çıkarma imkanımız var mıdır acaba yardımcı olursanız sevinirim?

  9. Mehmet Kahraman

    Kodları aynen derlediğimde şöyle hata veriyor;
    sketch_nov13a:8: error: ‘Pid’ does not name a type
    sketch_nov13a.ino: In function ‘void setup()’:
    sketch_nov13a:16: error: ‘myPID’ was not declared in this scope
    sketch_nov13a:16: error: ‘AUTOMATIC’ was not declared in this scope
    sketch_nov13a.ino: In function ‘void loop()’:
    sketch_nov13a:25: error: ‘myPID’ was not declared in this scope
    Bunun sebebi ne olabilir?

  10. Özkan

    Abi ben okul bitirme projesi olarak bunu yapmayı düşünüyorum da yazılımsal olarak hiç bir bilgim yok bunu matlab da nasıl yapılır

    1. Sezgin GÜL

      matlab yazılımı da yukarıda

      1. Eren

        matlab yazılımını keşke daha ayrıtınlı yapsaydın + matlabin grafik çizmesinde sorun var

  11. eren çelik

    merhaba ben projeyi hc sr04 ile yapmak istiyorum ama onun kodu için değiştirmem gereken yerler neresi acaba

  12. Eren çelik

    Merhaba ben bu projeyi hcsr04 sensörü ile yapmayı düşünüyorum bir de tam motor adı veya özelliği verir misiniz ayrıca sensörü ping kullanmadığım zaman kod da hangi yerleri değiştirmeliyim cevap verirseniz çok sevinirim

  13. Bahattinates

    merhaba. projeniz harika. elin koluna.saglik. islerinizden. basarilar. dilerim.

  14. Harun Doğan

    Aanlatımınız çok güzel olmuş teşekkürler, başka Arduino ile PİD uygulaması örneği var mı ?

    1. Sezgin GÜL

      rica ederim. çizgi izleyen proje var pid kontrollü >> http://www.robimek.com/arduino-ile-cizgi-izleyen-robot-yapimi/

  15. burak

    projeyi çalıştırdım yalnız matlab kısmını yapamadım yardımcı olur musunuz?

    1. Sezgin GÜL

      Sorunu yazarsanız yardımcı olurum.

      1. burak

        matlab programı hata veriyor çalışmıyor(hata da bu hocam:Error in Matlab (line 9)
        fopen(arduino);

        >> )

        1. Sezgin GÜL

          matlab arduinoya bağlanamıyor. matlab i kapatıp tekrar aç çalıştır. Ayrıca arduino=serial(‘COM3′,’BaudRate’,9600); kısmındaki COM adresi arduinonun takılı olduğu port numarası ile aynı olmalıdır.

      2. sukru

        abi bu projedeki hareketi gösteren programın adı ne acaba

        1. Sezgin GÜL

          Sensörden gelen veriler arduino üzerinden matlab programına aktarılıyor. Matlab da referans noktasına göre alınan uzaklık değerlerini grafiksel olarak ekrana yazdırıyor.

  16. Furkan

    Proje için teşekkür ederim.Kodu incelediğim zaman cm_duration/(29*2) ve ServoOutput=102+Output; komutlarını tam anlayamadım.Neye göre bu rakamlar hesaplanıyor.Açıklayabilir misiniz ?

    1. Sezgin GÜL

      cm = duration/(29*2); bu ifade ping sensörün mesafe ölçümüdür. Buradaki 29*2 işlemi yani 58 e bölmesi deneysel olarak hesaplanan değerdir. Bütün ölçümlerde geçerlidir.
      ServoOutput=102+Output; ifadesinde ise servonun derecesi yazılmaktadır. Buradaki 102 servonun başlangıç açısıdır. Output ise pid algoritması ile hesaplanan açı değeridir. Yani top hareket ettiğinde istenilen mesafeye dengelemek için pid hatasal yaklaşım hesaplar ve bu hesaplama sonucu kolu hareket ettirmek için servo motora açı bilgisi gönderir. Bu şekilde pid ile istenilen konuma gelmesi sağlanır.

      1. Furkan

        Açıklamanız için teşekkürler,gayet anlaşılır oldu

  17. Chris

    I think you need to make it real n add feedback n work that code out