menu search
  • Kaydol
brightness_auto

Hoş geldiniz! TÜRKLER SORUYOR PLATFORMU'na katılmak ister misiniz? Hemen kayıt olun veya giriş yapın.

more_vert

Teknoloji-Tasarım dersi projem için HC-SR04 mesafe sensöründen gelen verilere göre SG90 servo motoru kontrol ediyorum. Ancak servo, hedeflenen açıya giderken sürekli titriyor, stabil değil. Bu durumda kod tarafında PID kontrol gibi bir optimizasyon mu yapmalıyım, yoksa bağlantılarda veya motorun kendisinde mi bir sorun var?

thumb_up_off_alt 0 beğenilme thumb_down_off_alt 0 beğenilmeme

1 cevap

more_vert

Merhaba sevgili proje kahramanı! Teknoloji-Tasarım dersi projen için gösterdiğin çaba ve bu karmaşık soruna bu kadar detaylı yaklaşman gerçekten takdire şayan. HC-SR04 mesafe sensörüyle SG90 servo kontrol etmek, öğrencilik yıllarımda benim de sıkça kullandığım, hem öğretici hem de eğlenceli bir kombinasyondu. Ancak bu "titreme" meselesi, pek çoğumuzun yolunu kesen, bazen sinir bozucu, bazen de çok öğretici bir engel olmuştur.

Arduino Uno ve SG90 servo titremesi sorunun, tıpkı hayatın kendisi gibi, tek bir cevabı yok. Bu tür sorunlar genellikle donanım, yazılım ve bazen de mekanik uyumsuzlukların birleşimiyle ortaya çıkar. 'PID mi, donanım mı?' sorunun, aslında derinlemesine bir teşhis ve adım adım çözüm sürecinin başlangıcı olduğunu söyleyebilirim. Hadi gel, bu gizemi birlikte çözelim ve projenin pürüzsüz çalışmasını sağlayalım.

Kalbin Atışı: Donanım Tarafını İnceleyelim

Genellikle bir sistemde kararsızlık veya beklenmedik davranışlar gözlemlediğimizde, ilk durağımız her zaman donanım olmalıdır. Çünkü sağlam bir temel olmadan, üzerine inşa edeceğimiz yazılım katmanı ne kadar mükemmel olursa olsun, beklentimizi karşılamayacaktır.

Güç Kaynağı: Servoların Gizli Düşmanı

SG90 gibi küçük servolar bile, özellikle hareket halindeyken anlık olarak beklenenden daha fazla akım çekebilir. Arduino Uno'nun 5V pini, bu tür akım dalgalanmalarını karşılamakta genellikle yetersiz kalır. Unutmayın, Arduino'nun dahili voltaj regülatörü, mikrodenetleyici ve diğer küçük bileşenleri beslemek üzere tasarlanmıştır, bir motoru değil.

  • Senaryo: SG90'ı doğrudan Arduino Uno'nun 5V pininden beslediysen, servo hareket etmeye çalıştığında çektiği akım, Arduino'nun voltaj regülatörünü zorlayabilir. Bu durum, 5V hattındaki voltajın anlık olarak düşmesine (voltaj düşüşü veya brownout) neden olur. Servo bu düşüşü bir "duraklama" veya "titreme" olarak algılayabilir. Hatta sensörün veya mikrodenetleyicinin de etkilendiğini görebilirsin.
  • Çözüm Önerisi: SG90 servoyu harici bir güç kaynağından beslemelisin.
    • Harici 5V Güç Kaynağı: Örneğin, eski bir telefon şarj cihazı (USB adaptörü) veya 5V'luk bir pil paketi kullanabilirsin.
    • Ortak Toprak: Çok ama çok önemli bir nokta: Harici güç kaynağının eksi (-) ucu ile Arduino Uno'nun GND (toprak) pinini mutlaka birbirine bağlamalısın. Ortak bir toprak referansı olmadan sistem doğru çalışmaz ve tahmin edilemez davranışlar sergiler.
    • Deneyimden Örnek: Bir öğrencim, robot kol projesinde aynı titreme sorununu yaşıyordu. Servo motorları doğrudan Arduino'dan besliyordu. Harici bir pil paketiyle beslemeye geçtiğimizde, sorun sihirli bir şekilde ortadan kalktı.

Bağlantıların Önemi: Gevşeklik ve Parazit

Bazen en basit şeyler en büyük sorunlara yol açar.

  • Jumper Kablolar: Kullandığın jumper kabloların kalitesi ve sağlamlığı çok önemli. Ucuz veya eski kabloların içindeki teller kopmuş olabilir veya dirençleri artmıştır.
  • Gevşek Bağlantılar: Breadboard üzerindeki veya sensör/servo pinlerindeki bağlantılar gevşek olabilir. Bu, anlık kesintilere ve sinyal bozulmalarına neden olur.
  • Çözüm Önerisi:
    • Tüm bağlantıları tek tek kontrol et. Kabloları çıkarıp tekrar tak.
    • Mümkünse, farklı jumper kablolar dene.
    • Lehimli bağlantılar varsa, soğuk lehim olup olmadığını kontrol et.
    • Pratik İpucu: Projeyi çalıştırırken kablolara nazikçe dokunarak veya oynatarak titremenin değişip değişmediğini gözlemle. Bu, hangi bağlantının sorunlu olabileceğine dair ipucu verebilir.

Servo Motorun Kendisi: Bazen Doğası Gereği

SG90'lar uygun fiyatlı ve küçük projeler için harika motorlar olsa da, endüstriyel sınıf hassasiyet beklememeliyiz.

  • Ölü Bölge (Dead Band): SG90 gibi motorların belirli bir "ölü bölgesi" (dead band) vardır. Bu, motorun komutu algılaması için gereken minimum sinyal değişikliğidir. Bu bölge içindeki küçük değişiklikler motorun titremesine veya kararsız kalmasına neden olabilir.
  • Mekanik Boşluk: İç dişlilerdeki küçük boşluklar da motorun konumunu tam olarak sabitleyememesine yol açar.
  • Çözüm Önerisi:
    • Eğer elinde varsa, başka bir SG90 servo motoruyla deneme yap. Bazen motorun kendisinde üretimden kaynaklı bir sorun olabilir.
    • Motora aşırı yük bindirmediğinden emin ol. Titreşim, motorun taşıması gereken yükün çok ağır olmasından da kaynaklanabilir.
    • Deneyimden Örnek: Bir robot el projesinde, parmakları hareket ettiren SG90'lar, parmakların kendi ağırlığından bile etkilenip titriyordu. Daha güçlü bir servo (örneğin MG996R) veya daha hafif bir mekanik yapı kullanmak sorunu çözdü.

Beyin Fırtınası: Yazılım ve Kontrol Yaklaşımları

Donanım tarafında her şeyin yolunda olduğundan emin olduktan sonra, şimdi yazılım dünyasına dalalım.

Gürültü Filtreleme ve Stabil Sensör Verisi

HC-SR04 sensörü, çevresel koşullara (sıcaklık, nem, yüzeyin yapısı) bağlı olarak bazen gürültülü veya dalgalı veriler sağlayabilir. Servo motorun bu dalgalı verilere tepki vermesi, sürekli titremeye yol açar.

  • Çözüm Önerisi:
    Basit Ortalama Alma: Sensörden gelen son 5-10 okumayı bir diziye alıp ortalamasını alarak servo motoru bu ortalama değere yönlendirebilirsin.
    Hareketli Ortalama Filtresi (Moving Average Filter): Bu, anlık değişimleri yumuşatır ve daha kararlı bir hedef açı değeri elde etmeni sağlar.

    `arduino
    // Örnek basit ortalama filtresi
    const int numReadings = 10;
    int readings[numReadings];
    int readIndex = 0;
    long total = 0;
    int averageDistance = 0;

    void setup() {
    // ... diğer setup kodların
    for (int i = 0; i < numReadings; i++) {

    readings[i] = 0;
    

    }
    }

    void loop() {
    // HC-SR04'ten yeni mesafe oku
    long currentDistance = getDistance(); // Kendi getDistance fonksiyonunu kullan

    total = total - readings[readIndex];
    readings[readIndex] = currentDistance;
    total = total + readings[readIndex];
    readIndex = readIndex + 1;

    if (readIndex >= numReadings) {

    readIndex = 0;
    

    }

    averageDistance = total / numReadings;

    // Servo kontrolü için averageDistance kullan
    // ...
    }
    `

Gecikmeler ve Akış Kontrolü

Arduino loop'u çok hızlı çalışır. Eğer her döngüde sensörden okuma yapıp hemen servoya yazmaya kalkarsan, servo motor bu kadar sık ve küçük değişikliklere yetişemeyebilir.

  • Çözüm Önerisi:
    Küçük Bir Gecikme: delay() komutu kullanmak her zaman en verimli yöntem olmasa da, basit projelerde işe yarayabilir. servo.write() komutundan sonra küçük bir delay(20); veya delay(50); eklemek, servoya tepki vermesi için biraz zaman kazandırabilir.
    Değer Değişikliği Kontrolü: Servo motoru, sadece hedef açı mevcut açıdan anlamlı derecede farklıysa hareket ettir. Küçük farklar için hareket ettirmemek, motorun ömrünü uzatır ve titremeyi azaltır.

    `arduino
    // Örnek: Sadece belirli bir fark varsa hareket ettir
    int currentServoAngle = 0; // Servonun son gittiği açı
    const int angleTolerance = 2; // Açılar arasındaki tolerans (örneğin 2 derece)

    // ... loop içinde
    int targetAngle = map(averageDistance, 10, 100, 0, 180); // Kendi mapping değerlerini kullan

    if (abs(targetAngle - currentServoAngle) > angleTolerance) {
    myServo.write(targetAngle);
    currentServoAngle = targetAngle;
    delay(20); // Servonun pozisyona ulaşması için küçük bir gecikme
    }
    `

PID Kontrolü: Ne Zaman ve Nasıl?

Gelelim can alıcı soruna: PID kontrol.

  • PID Nedir? PID (Proportional-Integral-Derivative) kontrol, bir sistemin istenen bir hedef değere (setpoint) ulaşmasını ve orada kalmasını sağlamak için kullanılan güçlü bir geri bildirim kontrol mekanizmasıdır.
    P (Oransal): Mevcut hata miktarına (hedef ile mevcut arasındaki fark) göre anında tepki verir. Hata büyüdükçe tepki de büyür.
    I (İntegral): Zamanla biriken hataları düzeltir. Sistemin hedefte kalmakta zorlandığı durumlarda, kalıcı hataları ortadan kaldırmaya çalışır.
    * D (Türevsel): Hatanın değişim hızına göre tepki verir. Aşırı salınımı engellemeye ve sistemi daha hızlı stabilize etmeye yardımcı olur.

  • SG90 ve PID: SG90 gibi bir hobi servo için PID kontrolü, genellikle ilk çözüm değildir ve hatta çoğu zaman gereksiz karmaşıklık getirebilir. Neden mi?
    Mekanik Kısıtlamalar: PID, yazılımsal bir optimizasyondur. Eğer titremenin temel nedeni servo motorun kendi içindeki mekanik boşluklar veya güç beslemesindeki yetersizlikse, PID bu donanımsal sorunları sihirli bir şekilde çözemez. Hatta yanlış ayarlanmış bir PID, bu boşlukları daha da belirginleştirerek titremeyi artırabilir.
    Ayarlama Zorluğu: PID kontrolünü doğru bir şekilde ayarlamak (Kp, Ki, Kd değerlerini bulmak) başlı başına bir sanattır. Bu süreç genellikle deneme yanılma, hatta bazen matematiksel modelleme gerektirir. Küçük bir SG90 için bu kadar derin bir ayarlama yapmak, projenin basitliğini ortadan kaldırabilir.

  • Peki Ne Zaman PID Düşünmeli?
    Eğer projen endüstriyel bir kontrol sistemiyse, yüksek hassasiyet gerektiriyorsa.
    Servonun harici bir yüke karşı pozisyonunu çok sıkı tutması gerekiyorsa.
    Eğer tüm donanım ve temel yazılım çözümlerini denediysen ve hala bir miktar titreşim veya sapma varsa.
    Deneyimden Örnek: Bir drone stabilizasyon sisteminde, her motorun hızını milisaniyelik hassasiyetle kontrol etmek için PID vazgeçilmezdi. Ancak basit bir robot kolunda hedef açıya gitmek için P-kontrol (sadece oransal) bile yeterli olabiliyordu.

Özetle: SG90 ve benzeri hobi servolarında titreme sorunu genellikle güç, bağlantı veya sensörden gelen gürültü kaynaklıdır. PID'ye geçmeden önce bu temel sorunları çözmeye odaklanmanı şiddetle tavsiye ederim. Eğer bu sorunları aştıktan sonra bile hala kabul edilemez bir titreme varsa ve daha hassas kontrol istiyorsan, o zaman PID'yi bir sonraki adım olarak düşünebilirsin. Arduino için PID kütüphaneleri (örneğin Brett Beauregard'ın "Arduino PID Library") mevcuttur ve denemek istersen yol gösterebilirler.

Adım Adım Çözüme Doğru: Pratik Yaklaşım

Şimdi tüm bu bilgileri bir araya getirelim ve pratik bir sorun giderme planı oluşturalım:

  1. Güç Kaynağını Kontrol Et: Servoyu mutlaka harici bir 5V güç kaynağından besle ve toprak hatlarını birleştirmeyi unutma! Bu, genelde titreme sorunlarının %50'sini çözer.
  2. Bağlantıları Gözden Geçir: Tüm jumper kabloları kontrol et, gevşek olanları sıkılaştır, şüpheli kabloları değiştir. Breadboard'un sağlam olduğundan emin ol.
  3. Sensörü İzole Et: HC-SR04 sensöründen gelen verileri doğrudan Serial.println() ile seri monitöre yazdır. Verilerde aşırı dalgalanma var mı? Eğer varsa, yukarıda bahsettiğim ortalama alma veya hareketli ortalama filtresini uygula.
  4. Basit Bir Servo Testi Yap: Sensörden gelen veriyi tamamen devre dışı bırak. Arduino'na sadece servoyu bağla ve basitçe 0'dan 180 dereceye yavaşça giden, sonra geri dönen bir kod yaz.
    `arduino

    include <Servo.h>

    Servo myServo;
    void setup() {
    myServo.attach(9); // Servoyu 9. pine bağladığını varsayalım
    Serial.begin(9600);
    }
    void loop() {
    for (int pos = 0; pos <= 180; pos += 1) {

    myServo.write(pos);
    delay(15);
    

    }
    for (int pos = 180; pos >= 0; pos -= 1) {

    myServo.write(pos);
    delay(15);
    

    }
    }
    `
    Bu basit kodda bile titreme varsa, sorun büyük ihtimalle güç kaynağı veya servo motorun kendisindedir.

  5. Gecikme Ekle ve Değer Değişikliği Kontrolü: Servo .write() komutları arasına küçük delay()'ler ekle ve sadece hedef açı mevcut açıdan belirli bir eşik değeri kadar farklıysa servoyu hareket ettir.
  6. PID'yi En Sona Sakla: Yukarıdaki tüm adımları denedikten sonra hala tatmin edici bir sonuç alamıyorsan ve projenin gereksinimleri daha yüksek hassasiyet istiyorsa, o zaman PID kontrolünü araştırmaya başlayabilirsin. Ancak unutma, bu ekstra çaba SG90'ın mekanik limitlerini aşamaz.

Sonuç

Sevgili proje kahramanı, titreme sorunuyla karşılaşmak, öğrenme sürecinin doğal bir parçasıdır. Bu sorunları çözmek, seni sadece daha iyi bir programcı değil, aynı zamanda daha iyi bir problem çözücü yapar. Genellikle, bu tür projelerdeki titreme sorunlarının kökeninde yetersiz güç beslemesi veya gürültülü sensör verileri yatar.

Adım adım ilerle, önce donanımını sağlamlaştır, sonra yazılımını optimize et. Her değişikliği yaptıktan sonra sistemi test etmeyi unutma. Emin ol, bu süreçte elde edeceğin tecrübe, projenin kendisi kadar değerli olacak.

Projenin harika olacağına eminim. Başarılar dilerim!

thumb_up_off_alt 0 beğenilme thumb_down_off_alt 0 beğenilmeme

İlgili sorular

thumb_up_off_alt 0 beğenilme thumb_down_off_alt 0 beğenilmeme
1 cevap
thumb_up_off_alt 0 beğenilme thumb_down_off_alt 0 beğenilmeme
1 cevap
thumb_up_off_alt 0 beğenilme thumb_down_off_alt 0 beğenilmeme
1 cevap
thumb_up_off_alt 0 beğenilme thumb_down_off_alt 0 beğenilmeme
1 cevap
thumb_up_off_alt 0 beğenilme thumb_down_off_alt 0 beğenilmeme
2 cevap

9,220 soru

17,097 cevap

34 yorum

109 üye

Çevrimiçi Kullanıcı Sayısı: 46
0 Üye 46 Ziyaretçi
Bugünkü Ziyaretler: 478
Dünkü Ziyaretler: 6140
Toplam Ziyaretler: 4832209

Son Kazanılan Rozetler

hataylı Bir rozet kazandı
nisanur_ciftci Bir rozet kazandı
sibel_Çelik Bir rozet kazandı
fatma_arslan Bir rozet kazandı
Ömer_Çelik Bir rozet kazandı
...