Arduino İle Top Dengeleme Yapımı | Balancing of a Ball on Beam Use Arduino



Arduino İle Top Dengeleme Robotu Yapımı


Projemizde, PID kontrol ile topu denge noktasında tutan iki eksenli top dengeleme mekanizma yapımını paylaşacağım.Top dengeleme sisteminde kullanılan yöntem , topun mesafesini ölçerek dengede tutmak.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 olarak görülebilir.Top dengeleme projemize başlayalım.




Malzemeler




Normalde , Ping Ultrasonik Sensör kullanılır fakat fiyatı çok olduğu için(169 tl den başlayan fiyatlar) çok farkı olmayan hc sr04 kullandık.


Devre Şeması



Servo nun bilgi ucu ardiunonun 9 numaralı pinine,sensörden çıkan bilgi ise 7 numaralı pine girecek şekilde olmalı.

Bordun + ve - ucunu Ardiuno nun 5V ve GND uçlarına bağlayarak besleme işlemini yapıyoruz.


Mekanik Şema

Ölçülere birebir yapmak fayda var.Eğer kendi ölçülerinize göre yapmak istiyorsanız kodlarda biraz değişiklik yapmak zorundasınız.


Ardiuno Kodları


  1. #include<Servo.h>
  2. #include<PID_v1.h>
  3. const int servoPin = 9;
  4. float Kp = 2.5;// İlk Oransal Kazanç
  5. float Ki = 0; // İlk İntegral Kazancı
  6. float Kd = 1.1; //İlk Türev Kazancı
  7. double Setpoint, Input, Output, ServoOutput;
  8. PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
  9. Servo myServo;
  10.   
  11. void setup() {
  12.   
  13. Serial.begin(9600);
  14. myServo.attach(servoPin);
  15. Input = readPosition();
  16. myPID.SetMode(AUTOMATIC);
  17. myPID.SetOutputLimits(-80,80); // -80 ile 80 derece arası
  18. }
  19.   
  20. void loop()
  21. {
  22. Setpoint = 15; // Denge Noktası
  23. Input = readPosition();
  24.   
  25. myPID.Compute();
  26.   
  27. ServoOutput=102+Output;
  28. myServo.write(ServoOutput);
  29. }
  30.   
  31. float readPosition() {
  32. delay(40);
  33.   
  34. const int pingPin = 7;
  35.   
  36. long duration, cm;
  37. unsigned long now = millis();
  38. pinMode(pingPin, OUTPUT);
  39. digitalWrite(pingPin, LOW);
  40. delayMicroseconds(2);
  41. digitalWrite(pingPin, HIGH);
  42. delayMicroseconds(5);
  43. digitalWrite(pingPin, LOW);
  44.   
  45. pinMode(pingPin, INPUT);
  46. duration = pulseIn(pingPin, HIGH);
  47.   
  48. cm = duration/(29*2);
  49.   
  50. if(cm > 30) // 30 cm top için maksimum pozisyon
  51. {cm=30;}
  52.   
  53. Serial.println(cm);
  54.   
  55. return cm; //Mesafe değerini döndürür.
  56. }    

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.

Kendi tasarladığım mekanizmadan ufak bir video;



Kaynak :



Yorumlar

Yorum Gönder