İçindekiler:

Robotik Kol: Jensen: 4 Adım
Robotik Kol: Jensen: 4 Adım

Video: Robotik Kol: Jensen: 4 Adım

Video: Robotik Kol: Jensen: 4 Adım
Video: 2B den 3B 4 DOF Robot Kolu Yapımı Arduino IDE ve Kod Video6.1 2024, Ekim
Anonim
Robotik Kol: Jensen
Robotik Kol: Jensen

Jensen, Charles B. Malloch, PhD'nin mentorluğunda 1 kredilik bağımsız bir proje olarak yapılan, sezgisel hareket planlamasına odaklanan Arduino platformunda inşa edilmiş bir robotik koldur. Kolu manuel olarak hareket ettirerek programlanmış bir dizi hareketi tekrarlayabilir. UMass Amherst M5 makerspace'de yerleşik diğer robotik kolları görmekten ilham aldım. Ayrıca CAD yazılımını kullanmayı öğrenmek ve gelişmiş bir Arduino projesi yapmak istedim. Bunu tüm bunları yapmak için bir fırsat olarak gördüm.

Adım 1: Özgün Tasarım ve Kapsam

Özgün Tasarım ve Kapsam
Özgün Tasarım ve Kapsam

Bu proje için öğrenmeyi seçtiğim CAD yazılımı OnShape idi ve modellediğim ilk şey bir HiTec HS-422 analog servoydu. Servoyu yerel olarak benim için uygun olduğu ve makul bir fiyat olduğu için seçtim. Ayrıca kendi parçalarımı tasarlamaya geçmeden önce OnShape'i öğrenmek için iyi bir uygulama oldu. Projenin bu erken noktasında, kolun neler yapabileceğine dair genel bir fikrim vardı. İyi bir hareket aralığına ve bir şeyleri almak için bir kavrayıcıya sahip olmasını istedim. Ben CAD'de modellemeye devam ederken bu genel özellikler tasarımı bilgilendirdi. Bu noktada sahip olduğum diğer bir tasarım kısıtlaması, 3D yazıcımdaki baskı yatağının boyutuydu. Bu yüzden yukarıdaki fotoğrafta gördüğünüz taban nispeten ilkel bir karedir.

Projenin bu aşamasında ben de kolu nasıl kontrol etmek istediğim üzerine beyin fırtınası yapıyordum. Yapım alanında ilham aldığım bir robot kol, kontrol için bir kukla kol kullandı. Bir diğeri, kolun kullanıcı tarafından çeşitli pozisyonlara hareket ettirildiği sezgisel bir yol programlama yöntemi kullandı. Kol daha sonra bu pozisyonlar arasında geri dönecekti.

Asıl planım, kolun yapımını bitirmek ve ardından bu kontrol yöntemlerinin ikisini de uygulamaktı. Ben de bundan sonra bir noktada kontrol etmek için bir bilgisayar uygulaması yapmak istedim. Muhtemelen anlayabileceğiniz gibi, projenin bu yönünün kapsamını küçülttüm. Bu ilk iki kontrol yöntemi üzerinde çalışmaya başladığımda, sezgisel yol programlamanın düşündüğümden daha karmaşık olduğunu çabucak buldum. İşte o zaman onu odak noktam haline getirmeye ve diğer kontrol yöntemlerini süresiz olarak beklemeye almaya karar verdim.

2. Adım: Kontrol

Kontrol
Kontrol

Seçtiğim kontrol yöntemi şu şekilde çalışıyor: Kolunuzu ellerinizle çeşitli pozisyonlara hareket ettiriyorsunuz ve bu pozisyonları "kaydetiyorsunuz". Her pozisyon, kolun her bir bağlantısı arasındaki açı hakkında bilgi içerir. Konumları kaydetmeyi bitirdikten sonra, bir oynatma düğmesine basarsınız ve kol sırayla bu konumların her birine döner.

Bu kontrol yönteminde çözülmesi gereken çok şey vardı. Her servonun kayıtlı bir açıya dönmesi için, ilk etapta bu açıları bir şekilde "kaydetmem" gerekiyordu. Bu, her servonun mevcut açısını alabilmek için kullandığım Arduino Uno'yu gerektiriyordu. Bu kontrol yöntemini kullanan robotik bir kol yapan arkadaşım Jeremy Paradie, her bir hobi servosunun dahili potansiyometresini kullanmam konusunda bana ipucu verdi. Bu, servonun açısını kodlamak için kullandığı potansiyometredir. Bir test servosu seçtim, dahili potansiyometrenin orta pimine bir tel lehimledim ve kabloyu dışarı beslemek için muhafazada bir delik açtım.

Artık potansiyometrenin orta pimindeki voltajı okuyarak mevcut açıyı alabiliyordum. Ancak iki yeni sorun vardı. İlk olarak orta pinden gelen sinyalde voltaj yükselmeleri şeklinde gürültü vardı. Bu sorun daha sonra gerçek bir sorun haline geldi. İkincisi, açı gönderme ve açı alma değer aralığı farklıydı.

Hobi servo motorlarına 0 ile 180 derece arasında bir açıya hareket etmesini söylemek, ona açıya karşılık gelen yüksek bir zamana sahip bir PWM sinyali göndermeyi içerir. Aksine, servo kornayı 0 ile 180 derece arasında hareket ettirirken potansiyometrenin orta pinindeki voltajı okumak için Arduino'nun bir analog giriş pinini kullanmak, ayrı bir değer aralığı döndürür. Bu nedenle, servoyu aynı açıya döndürmek için kaydedilmiş bir giriş değerini karşılık gelen PWM çıkış değerine çevirmek için biraz matematik gerekiyordu.

İlk düşüncem, kaydedilen her açı için karşılık gelen çıkış PWM'sini bulmak için basit bir menzil haritası kullanmaktı. Bu işe yaradı, ancak çok kesin değildi. Benim projemde, 180 derecelik bir açı aralığına karşılık gelen PWM yüksek zaman değerleri aralığı, analog giriş değerleri aralığından çok daha büyüktü. Ek olarak, bu aralıkların her ikisi de sürekli değildi ve yalnızca tam sayılardan oluşuyordu. Bu nedenle, kaydedilmiş bir girdi değerini bir çıktı değerine eşlediğimde kesinlik kayboldu. İşte bu noktada servolarımı olması gereken yere götürmek için bir kontrol döngüsüne ihtiyacım olduğunu düşündüm.

Girişin orta pin voltajı ve çıkışın PWM çıkışı olduğu bir PID kontrol döngüsü için kod yazdım, ancak hızlı bir şekilde sadece entegre kontrole ihtiyacım olduğunu keşfettim. Bu senaryoda, çıktı ve girdinin her ikisi de açıları temsil ediyordu, bu nedenle orantısal ve türevsel kontrolün eklenmesi, onu aşmaya veya istenmeyen davranışa neden olma eğilimindeydi. İntegral kontrolü ayarladıktan sonra hala iki sorun vardı. İlk olarak, mevcut ve istenen açı arasındaki ilk hata büyük olsaydı, servo çok hızlı hızlanırdı. İntegral kontrol için sabiti azaltabilirdim, ancak bu genel hareketi çok yavaşlattı. İkincisi, hareket gergindi. Bu, analog giriş sinyalindeki gürültünün bir sonucuydu. Kontrol döngüsü sürekli olarak bu sinyali okuyordu, bu nedenle voltaj yükselmeleri gergin harekete neden oldu. (Bu noktada ben de tek test servomdan yukarıdaki resimdeki montaja geçtim. Ayrıca yazılımdaki her servo için bir kontrol döngüsü nesnesi yaptım.)

Çıktıya üstel ağırlıklı hareketli ortalama (EWMA) filtresi koyarak aşırı hızlı hızlanma sorununu çözdüm. Çıktının ortalaması alınarak, hareket halindeki büyük artışlar azaltıldı (gürültüden kaynaklanan titreşim dahil). Ancak, giriş sinyalindeki gürültü hala bir problemdi, bu yüzden projemin bir sonraki aşaması bunu çözmeye çalışıyordu.

Adım 3: Gürültü

Gürültü
Gürültü

Yukarıdaki Resimde

Kırmızı: orijinal giriş sinyali

Mavi: işlemden sonra giriş sinyali

Giriş sinyalindeki gürültüyü azaltmanın ilk adımı, nedenini anlamaktı. Sinyali bir osiloskopta araştırmak, voltaj yükselmelerinin 50 Hz hızında gerçekleştiğini ortaya çıkardı. Servolara gönderilen PWM sinyalinin de 50Hz hızında olduğunu biliyordum, bu yüzden voltaj yükselmelerinin bununla bir ilgisi olduğunu tahmin ettim. Servoların hareketinin bir şekilde potansiyometrelerin V+ piminde voltaj yükselmelerine neden olduğunu ve bunun da orta pimdeki okumayı bozduğunu varsaydım.

Gürültüyü azaltmak için ilk denememi burada yaptım. Her servoyu tekrar açtım ve potansiyometre üzerindeki V+ pininden gelen bir tel ekledim. Onları okumak için Arduino Uno'nun sahip olduğundan daha fazla analog girişe ihtiyacım vardı, bu yüzden ben de bu noktada bir Arduino Mega'ya geçtim. Kodumda, açı girişini orta pimdeki voltajın analog bir okuması olmaktan, orta pimdeki voltaj ile V + pimindeki voltaj arasındaki orana değiştirdim. Umudum, pinlerde bir voltaj yükselmesi olursa, oranda iptal olur.

Her şeyi tekrar bir araya getirdim ve test ettim ama ani yükselmeler devam ediyordu. Bu noktada yapmam gereken yerimi araştırmaktı. Bunun yerine, bir sonraki fikrim potansiyometreleri tamamen ayrı bir güç kaynağına koymaktı. V+ kablolarını Arduino'daki analog girişlerden ayırdım ve onları ayrı bir güç kaynağına bağladım. Pimleri daha önce araştırmıştım, bu yüzden onları hangi voltajda çalıştıracağımı biliyordum. Ayrıca her servoda kontrol panosu ile V+ pini arasındaki bağlantıyı da kestim. Her şeyi tekrar bir araya getirdim, açı giriş kodunu eski haline döndürdüm ve ardından test ettim. Beklendiği gibi, giriş pininde daha fazla voltaj yükselmesi olmadı. Ancak, yeni bir sorun vardı - potansiyometreleri ayrı bir güç kaynağına koymak, servoların dahili kontrol döngülerini tamamen bozmuştu. V+ pinleri öncekiyle aynı voltajı alıyor olsa da, servoların hareketi düzensiz ve kararsızdı.

Bunun neden olduğunu anlamadım, bu yüzden nihayet servolarda toprak bağlantımı araştırdım. Zeminde ortalama 0,3 Voltluk bir voltaj düşüşü oldu ve servolar akım çektiğinde daha da yükseldi. O zaman bu pimlerin artık "toprak" olarak kabul edilemeyeceği ve "referans" pimleri olarak daha iyi tanımlanabileceği benim için açıktı. Servolardaki kontrol panoları potansiyometrenin orta pinindeki voltajı hem V+ hem de referans pinlerine göre ölçüyor olmalıdır. Potansiyometrelere ayrı ayrı güç vermek, bu göreceli ölçümü bozdu çünkü artık tüm pinlerde meydana gelen bir voltaj yükselmesi yerine, sadece referans pininde meydana geldi.

Akıl hocam Dr. Malloch, tüm bunların hatalarını ayıklamama yardımcı oldu ve orta pimdeki voltajı diğer pimlere göre ölçmemi de önerdi. Açı girişinin gürültüsünü azaltmak için üçüncü ve son girişimim için yaptığım şey buydu. Her servoyu açtım, kestiğim kabloyu yeniden taktım ve potansiyometre üzerindeki referans piminden gelen üçüncü bir kabloyu ekledim. Kodumda açı girişini şu ifadeye eşdeğer yaptım: (orta pin - referans pini) / (V+pin - referans pini). Test ettim ve voltaj yükselmelerinin etkilerini başarıyla azalttı. Ayrıca bu girişe bir de EWMA filtresi koydum. Bu işlenmiş sinyal ve orijinal sinyal yukarıda resmedilmiştir.

Adım 4: İşleri Sarma

Eşyaları Sarmak
Eşyaları Sarmak

Gürültü problemini elimden geldiğince çözerek, tasarımın son kısımlarını düzeltmeye ve yapmaya başladım. Kol, tabandaki servoya çok fazla ağırlık veriyordu, bu yüzden büyük bir yatak kullanarak kolun ağırlığını destekleyen yeni bir taban yaptım. Ayrıca tutucuyu yazdırdım ve çalışmasını sağlamak için biraz zımparaladım.

Nihai sonuçtan çok memnunum. Sezgisel hareket planlaması tutarlı bir şekilde çalışır ve her şey göz önüne alındığında hareket düzgün ve doğrudur. Başka biri bu projeyi yapmak isteseydi, öncelikle onları daha basit bir versiyonunu yapmaya teşvik ederdim. Geriye dönüp baktığımda, hobi servo motorları kullanarak böyle bir şey yapmak çok safçaydı ve onu çalıştırırken yaşadığım zorluk bunu gösteriyor. Kolun da bu kadar iyi çalışmasını bir mucize olarak görüyorum. Hala bir bilgisayarla arayüz oluşturabilen, daha karmaşık programları çalıştırabilen ve daha hassas hareket edebilen robotik bir kol yapmak istiyorum, bu yüzden bir sonraki projem için bunu yapacağım. Yüksek kaliteli dijital robotik servolar kullanacağım ve umarım bu projede karşılaştığım birçok problemden kaçınmamı sağlar.

CAD belgesi:

cad.onshape.com/documents/818ea878dda7ca2f…

Önerilen: