Servo Motor Kontrol

Başlatan forty69, 11 Mayıs 2017, 21:45:39

forty69

Herkese iyi günler,
Başlıkta da belirttiğim gibi servo motor kontrolü ile ilgili birkaç sorum olacaktı. Öncelikle kullandığımı motor modelinden, bunları uygulayacağım proje ve içeriğinden bahsetmek istiyorum :

- 3 adet Servo motor kullanıyorum. Modeli POWER HD LF-20MG. Bu ürünün birkaç özelliği de aşağıdadır :
   - Tork : 6.6V (max) değerinde 20kg-cm ; 4.8V (min) değerinde 16kg-cm
   - Stall Akımı : Maksimum güçte yaklaşık 2.7Amper.
   - Redüktör dişli oranı : 1/306
   - Çalışma hızı (yüksüz halde) : 6.6V değerinde 0.16sn /60derece ; 4.8V değerinde 0.18sn/60derece

- Projeye gelecek olursam, Paralel Delta Robot projesi üzerinde çalışıyorum. Motorları yatay olarak koyacağım. Bu da demek oluyor ki, robotun 0(sıfır) derecesinde, motorlar aslında 90dereceyi gösterecek. (Bu kısmı ufak bir yazılımla hallettim, burada sıkıntı yok.).
   - Robotun 3 tane üstte, bu 3 motora bağlı kolu bulunmaktadır. Bu kolların uzunluğu ise 35cm.
   - Robotun 3 tane de altta kolu bulunmaktadır. Bunların bir ucu üstteki kollara bağlı, diğer ucu ise altta bulunan "end-effector" denilen ve gripperın bulunduğu kısma bağlı. Bu kolların uzunluğu ise 50cm.
   - Motorların bulunduğu taban ile en altta bulunan end-effector birbirine her zaman paralel olacak şekilde tasarlandı. Bu paralellik, robotun kinematik denklemleri ile halloldu. Bu kinematik denklemler ile, robotun uç noktasının (end-effector'e bağlı olan gripperın) istenilen pozisyona gitmesi için gereken açıları hesaplıyorum. Bulduğum bu açıları da motorlara input olarak giriyorum.
   - Kontrol kartı olarak Arduino Mega kullanıyorum.

   Benim sorularıma gelecek olursak eğer,
1) Motorların torkları görüldüğüz üzere bayağı güçlü olduğu halde, ben istediğim sonuçları elde edemiyorum. Titreşimli hareket ediyor. Mekanik olarak sıkıntı var diye düşünüyorum, fakat hesaplamalara göre bu da pek olası gözükmüyor,açıkçası. Neden diye soracak olursanız, oluşacak torkun maksimum kol boyu 35 cm. Kullandığım kollar da ağırlık bakımından bir hayli düşük olduğu için, kol başına yaklaşık 15~20gr. , motorlara pek fazla yük bindirmiyorum. Kullandığım ara ekipmanlar, bağlantı elemanları,rulmanlar vs., ağırlık bakımından biraz etkilese de, bunları da dahil ettiğim zaman maksimum 400~500 gr. gibi bir ağırlık oluyor. Motorun da bu ölçü ve ağırlık kriterlerinin üzerinden gelmesi gerektiğini düşünüyorm.
    Motorların inputlarını Arduino'ya girip, oradan kontrol ediyorum. Daha doğrusu, sadece input giriyorum. Motorları beslemek için Arduinodan ayrı, motor parametrelerini karşılayabilen güç kaynağı kullanıyorum. Bu titreşimin sebebi motorları düzgün bir şekilde kontrol edemediğimden dolayı olabilir mi ?

2) Motorlara PID kontrol uygulamak istesem de, benim buradaki amacım motorların istenilen açıya, yani pozisyona gitmesi. Bu yüzden de pozisyon kontrolü makul gözüküyor. Fakat, Servo motorlar söz konusu olunca, pozisyon kontrolünü zaten kendi içinde halletmiyor mu ?. Hız kontrolüne gelecek olursam, ben zaten sabit gerilim ile besliyorum. Hızı kontrol etmek için de gerilim ile oynamam gerekiyor, bu da kullanılabilir bir opsiyon olarak gözükmüyor. Bu benim görüşüm tabii ki. Kontrollör kullanmam gerekir mi ? Eğer gerekirse, üstte belirttiğim koşullara ve sonuçlara dayanarak nasıl bir kontrol uygulayabilirim ?

3) Motorları dışarıdan beslediğim için ve Arduino ile ortak toprakladığım için ani akım çekimi oluyor, ama bunun Arduino üzerinde bir etkisini görmedim. Optokuplör kullanılacak bir devre ile giriş ve çıkış sinyalini izole etsem, Arduino'yu bu gibi bir durumdan kurtarmış olurum diye düşünüyorum. Doğru bir yöntem midir acaba ?

Cevaplarınız için şimdiden çok teşekkürler. Umarım, sorularımı yeterince açık anlatabilmişimdir.
Saygılarımla..
-Hulusi

matador

1-) Titreşim ya da mekaniksel küçük sallantılar her zaman motor veya kontrolle ilgili olmayabilir. Mekaniğe de dikkat etmek gerekir. Kullandığınız yataklama iyi mi? Ölçüler de kaçıklık var mı? Hareket eden mekanizmanın ağırlık merkezi bu sallantılara etki eden faktörlerdir. Ağırlık merkezi dönme noktasına ne kadar yakın olursa o kadar lineer hareketler elde edersiniz. Salınımlar gittikçe küçülecektir.

2-) PID kontrol uygulamak isterseniz kolun açısını ölçmek için bir şey yapmanız gerekir. Bir potans bile yeterli olabilir. Hassasiyete göre seçmek gerekir. Pozisyon kontrolünü kendi içinde yapıyor evet, ama sizin yazılımınız o pozisyona gidilip gidilmediğini bilmiyor. Yazılıma bunu anlatmak için de dediğim gibi bir geribildirim almanız gerekir. Bahsi geçen RC Servo motorlarda, puls ile bilgi verirsiniz. Servo motorun hızını kontrol etmek isterseniz, örneğin 0 konumunda iken 1.5ms'lik periyodlarda puls veriyorsunuz, 90 dereceye ulaşmak için 2ms'lik periyod yeterli siz direk 2ms'lik puls uygularsanız motor o an ki voltaja bağlı olan hızına göre döner. 6.6V 0.16derece/sn ile yani. Voltajı değiştirmeden hızını da 1.5ms ile 2ms lik periyodları adım adım yaparak hızını kontrol edebilirsiniz.
Yalnız bunu yaparken adımlara dikkat etmek gerek zira motor takıla takıla döner.

3-) Beslemeyi arduino üzerinden almıyorsanız sorun olmaz.

Son olarak eklemek istediğim bir kaç konu var. jerk birimini araştırmanızın faydalı olacağını düşünüyorum. İvmenin zamana bağlı değişimini yazılımınıza ekleyerek titreşimleri minimize edebilirsiniz.

forty69

Alıntı yapılan: matador - 12 Mayıs 2017, 12:32:37
1-) Titreşim ya da mekaniksel küçük sallantılar her zaman motor veya kontrolle ilgili olmayabilir. Mekaniğe de dikkat etmek gerekir. Kullandığınız yataklama iyi mi? Ölçüler de kaçıklık var mı? Hareket eden mekanizmanın ağırlık merkezi bu sallantılara etki eden faktörlerdir. Ağırlık merkezi dönme noktasına ne kadar yakın olursa o kadar lineer hareketler elde edersiniz. Salınımlar gittikçe küçülecektir.
Öncelikle bu güzel yanıtlarınız için teşekkür ederim. Kullandığım yataklama iyi durumda,sıkıntı yok gibi gözüküyor. Yanlız, bugün end-effector malzemesini değiştirerek biraz daha hafiflettim. Böylece motorlara uygulanan yükte kısmen azalma olacak. Bunu deneyip sonuca göre ekstradan birşeyler daha düşünebilirim.
Alıntı yapılan: matador - 12 Mayıs 2017, 12:32:37
2-) PID kontrol uygulamak isterseniz kolun açısını ölçmek için bir şey yapmanız gerekir. Bir potans bile yeterli olabilir. Hassasiyete göre seçmek gerekir. Pozisyon kontrolünü kendi içinde yapıyor evet, ama sizin yazılımınız o pozisyona gidilip gidilmediğini bilmiyor. Yazılıma bunu anlatmak için de dediğim gibi bir geribildirim almanız gerekir. Bahsi geçen RC Servo motorlarda, puls ile bilgi verirsiniz. Servo motorun hızını kontrol etmek isterseniz, örneğin 0 konumunda iken 1.5ms'lik periyodlarda puls veriyorsunuz, 90 dereceye ulaşmak için 2ms'lik periyod yeterli siz direk 2ms'lik puls uygularsanız motor o an ki voltaja bağlı olan hızına göre döner. 6.6V 0.16derece/sn ile yani. Voltajı değiştirmeden hızını da 1.5ms ile 2ms lik periyodları adım adım yaparak hızını kontrol edebilirsiniz.
Yalnız bunu yaparken adımlara dikkat etmek gerek zira motor takıla takıla döner.
Demek istediğinizi tam anlamıyla anladım. Ben başka şekilde düşünüyordum ama kesin olarak uygulayamadığım için doğrulayamıyordum. Düşündüğüm şey, örneğin, motora 60 dereceye gitmesini söyledim. Robot kolu da o açıya set edecek kendisini. Farzedelim ki üzerindeki yükten dolayı veya başka sebeplerden dolayı 30 derecede takılı kaldı. Servo motor, zaten kendi içinde bunun hesabını yapmıyor mu ? Tamam, referans açısına gidene kadar motor zorlanacak, ama ben dışarıdan ölçüp geri besleme ile kontrol etsem de bu aynı şekilde kalmayacak mı ? Yani ben şöyle bir kontrol oluşturuyordum yazılımda ; motora açı değerini giriyordum, belli saniye aralığında motordan açı değerini okuyup benim istediğim ile aynı mı değil mi diye kontrol ettiriyordum. Acaba doğru bir yöntem midir orasını o kadar tecrübe etmedim.
Hız kontrolünde ise, Arduino'da servo motorlar için iki adet input girme şekli mevcut. Biri direk açı değerini girmek. Diğeri de açı değeri yerine 544-2400 arasında değerler girip 0 ile 180 derece arasında hareket ettirebiliyorum. Bu 544-2400 arası değerler mikrosaniyeye tekabül ediyor. Bundan ayrı olarak da bir diğer yaptığım şey de ; C# ile Arduinoyu haberleştirip, potansiyometre ile kontrol ettiriyordum. Bu yaptıklarım arasında en hızlısıydı. Bu yüzden hız kontrolüyle ilgili pek birşey yapmak istememiştim.
[/quote]
Alıntı yapılan: matador - 12 Mayıs 2017, 12:32:37
3-) Beslemeyi arduino üzerinden almıyorsanız sorun olmaz.

Son olarak eklemek istediğim bir kaç konu var. jerk birimini araştırmanızın faydalı olacağını düşünüyorum. İvmenin zamana bağlı değişimini yazılımınıza ekleyerek titreşimleri minimize edebilirsiniz.
Anladım, dediğiniz hakkında az çok birşeyler biliyordum, fakat uygulama alanları ve nasıl uygulanacağı hakkında detaylı bilgiye sahip değildim. En iyisi dediğiniz gibi araştırmamda fayda var.

Bu güzel yorumlarınız için tekrardan teşekkür ederim.
Saygılarımla
-Hulusi

matador

RC Servoların konum bilgisini paylaştığını bilmiyordum. Yine de kol üzerinden ayrıca bir ölçüm yapılmasının daha sağlıklı olacağını düşünüyorum. Motor döndü fakat mekaniksel bir aksaklıktan ötürü kol hareket etmedi diyelim. Bunun için önlem düşünülmeli.

Cemre.

Alıntı yapılan: matador - 13 Mayıs 2017, 09:40:27
RC Servoların konum bilgisini paylaştığını bilmiyordum. Yine de kol üzerinden ayrıca bir ölçüm yapılmasının daha sağlıklı olacağını düşünüyorum. Motor döndü fakat mekaniksel bir aksaklıktan ötürü kol hareket etmedi diyelim. Bunun için önlem düşünülmeli.

RC Servo içerisinde DC Motor + Pot ile pozisyonlama yapan bir denetleyici mevcuttur. (Çoğunlukla bu böyledir.) Ancak dışarıya bu bilgiyi verdiklerini hiç görmedim. Ayrıca bir modifikasyon yapılmadı ise.

Servo pozisyon sinyalini scope ile incelemekte fayda var. Sinyal kablolarınızın boyları çok uzun olmasa iyi olabilir. Ne tür bir denetleyici kullanıyorsunuz? (MCU vs.)

forty69

Alıntı yapılan: matador - 13 Mayıs 2017, 09:40:27
RC Servoların konum bilgisini paylaştığını bilmiyordum. Yine de kol üzerinden ayrıca bir ölçüm yapılmasının daha sağlıklı olacağını düşünüyorum. Motor döndü fakat mekaniksel bir aksaklıktan ötürü kol hareket etmedi diyelim. Bunun için önlem düşünülmeli.
Servo motor üzerindeki sinyal kablosundan, Arduino da yazılım ile okuma yapılabiliyor. Ben yine dediğiniz gibi ayrıca bir ölçüm yapmaya çalışayım en iyisi. Teşekkürler :)

forty69

Alıntı yapılan: Cemre. - 13 Mayıs 2017, 10:19:39
RC Servo içerisinde DC Motor + Pot ile pozisyonlama yapan bir denetleyici mevcuttur. (Çoğunlukla bu böyledir.) Ancak dışarıya bu bilgiyi verdiklerini hiç görmedim. Ayrıca bir modifikasyon yapılmadı ise.

Servo pozisyon sinyalini scope ile incelemekte fayda var. Sinyal kablolarınızın boyları çok uzun olmasa iyi olabilir. Ne tür bir denetleyici kullanıyorsunuz? (MCU vs.)
Bir önceki postta @matador a belirttiğim gibi, ayrıca sizin de dediğiniz gibi içindeki denetleyiciden geri dönüş alabiliyorum. Arduino Mega kullanıyorum. Hali hazırda Arduino'nun kendi servo kütüphanesi içerisinde bu özellik mevcut.
Teşekkürler..

apsis

Servo motor 20Kg diyor ama cm başına 20kg buna dikkat etmek gerekli ve bu muhtemelen stall torkudur . Titreşimler ciddi ise kütle dengelemeye bakınız(makine dinamiği). Mesela 3 pistonlu radyal bir motor modelinin kütle dengeleme hesapları size fikir verebilir.
"Makineye Beyin" MEKATRONİK