- Kendinden Dengeleyici Robot için Parça Seçimi
- Kendinden Dengeleyici Robotumuzun 3D Baskı ve Montajı
- Devre şeması
- Kendinden Dengeleyici Robot Kodu
- Arduino Self Balancing Robotunun Çalışması
Segway'in RYNO motorlarından ve diğer kendi kendini dengeleyen scooterlarından ilham aldıktan sonra, her zaman kendi Arduino Segway Robot'um olan bir şeyi yapmak istedim. Bir süre düşünerek Arduino'yu kullanarak Kendi Kendini Dengeleyici bir Robot yapmaya karar verdim. Bu şekilde, tüm bu scooter'ların altında yatan kavramı kavrayabilir ve ayrıca PID algoritmasının nasıl çalıştığını öğrenebilirim.
İnşa etmeye başladığımda, bu botun inşa edilmesi biraz zor olduğunu fark ettim. Aralarından seçim yapabileceğiniz çok fazla seçenek var ve bu nedenle kafa karışıklıkları, motorları seçerken doğru şekilde başlar ve PID değerlerini ayarlayana kadar kalır. Ve akü tipi, akünün konumu, tekerlek tutuşu, motor sürücüsü tipi, CoG'nin (ağırlık merkezi) korunması ve çok daha fazlası gibi dikkate alınması gereken çok şey var.
Ama izin verin size kırayım, bir kez inşa ettiğinizde bunun göründüğü kadar zor olmadığını kabul edeceksiniz. Öyleyse kabul edelim, bu eğitimde kendi kendini dengeleyen robotu oluşturma konusundaki deneyimimi belgeleyeceğim. Yeni başlayan veya botunuzu çalıştırmamanın uzun bir hayal kırıklığından sonra buraya inmiş olan mutlak bir acemi olabilirsiniz. Burası son varış noktanız olmayı hedefliyor. Öyleyse başlayalım……
Kendinden Dengeleyici Robot için Parça Seçimi
Size botu oluşturmak için tüm seçenekleri söylemeden önce, bu kendi kendini dengeleyen robot projesinde kullandığım öğeleri listeleyeyim.
- Arduino UNO
- Redüktörlü DC motorlar (Sarı renkli) - 2Nos
- L298N Motor Sürücü Modülü
- MPU6050
- Bir çift tekerlek
- 7.4V Li-ion Pil
- Bağlantı telleri
- 3D Baskılı Gövde
Kendi kendini dengeleyen robot kitinizi oluşturmak için kullanılabilirliğe bağlı olarak yukarıdaki bileşenlerden herhangi birini karıştırabilir ve seçebilirsiniz, yalnızca bileşenlerin aşağıdaki kriterlere uyduğundan emin olun.
Denetleyici: Burada kullandığım denetleyici Arduino UNO'dur, çünkü kullanımı basittir. Ayrıca bir Arduino Nano veya Arduino mini de kullanabilirsiniz, ancak herhangi bir harici donanım olmadan doğrudan programlayabildiğimiz için UNO'ya bağlı kalmanızı tavsiye ederim.
Motorlar: Kendi kendini dengeleyen bir robot için kullanabileceğiniz en iyi motor seçimi şüphesiz Step motor olacaktır. Ancak işleri basitleştirmek için bir DC dişli motor kullandım. Evet, step cihaza sahip olmak zorunlu değildir; bot, bu ucuz, yaygın olarak bulunan sarı renkli DC dişli motorlarla da iyi çalışıyor.
Motor Sürücüsü: Benimki gibi DC dişli motorları seçtiyseniz, o zaman benim gibi L298N sürücü modülünü kullanabilirsiniz, hatta bir L293D bile iyi çalışmalıdır. L293D ve Arduino kullanarak DC motoru kontrol etme hakkında daha fazla bilgi edinin.
Tekerlekler: Bu adamları küçümsemeyin; Sorunun tekerleklerimde olduğunu anlamakta zorlandım. Bu nedenle, kullandığınız zemini tekerleklerinizin iyi kavradığından emin olun. Yakından izleyin, tutuşunuz asla tekerleklerinizin yerde kaymasına izin vermemelidir.
İvmeölçer ve Jiroskop: Botunuz için en iyi İvmeölçer ve Jiroskop seçeneği MPU6050 olacaktır. Bu nedenle, ADXL345 gibi normal bir İvmeölçer veya bunun gibi bir şey yapmaya çalışmayın, bu işe yaramaz. Nedenini bu makalenin sonunda anlayacaksınız. MPU6050'yi Arduino ile kullanma hakkındaki özel makalemize de göz atabilirsiniz.
Pil: Arduino'yu bir yükseltme modülü olmadan doğrudan çalıştırabilmemiz için olabildiğince hafif bir pile ihtiyacımız var ve çalışma voltajı 5V'den fazla olmalıdır. Bu yüzden ideal seçim 7,4V Li-polimer pil olacaktır. Burada 7.4V Li-ion pilim olduğu için onu kullandım. Ancak bir Li-po'nun Li-ion'dan daha avantajlı olduğunu unutmayın.
Kasa: Ödün vermemeniz gereken bir diğer yer de bot kasanızdır. İyi olduğunuz her şeyi karton, ahşap, plastik kullanabilirsiniz. Ancak, kasanın sağlam olduğundan ve bot dengelemeye çalışırken kıpırdatmamasına dikkat edin. Diğer botlardan çıkarım yaparak Solidworks üzerinde kendi şasimi tasarladım ve bunu 3D olarak yazdırdım. Bir yazıcınız varsa, tasarımı da yazdırabilirsiniz, tasarım dosyaları sonraki başlığa eklenecektir.
Kendinden Dengeleyici Robotumuzun 3D Baskı ve Montajı
Botumu oluşturmak için kullandığım kasayı 3D olarak yazdırmaya karar verdiyseniz, STL dosyalarıthingiverse'den indirilebilir. Ayrıca tasarım dosyalarını da ekledim, böylece personel tercihlerinize göre değiştirebilirsiniz.
Parçaların sarkık yapıları yoktur, bu nedenle bunları herhangi bir destek olmadan kolayca yazdırabilirsiniz ve% 25 dolgu iyi sonuç verir. Tasarımlar oldukça sadedir ve herhangi bir basit yazıcı kolaylıkla halledebilir. Modeli dilimlemek için Cura yazılımını kullandım ve Tevo Tarantula'mı kullanarak yazdırdım, ayar aşağıda gösterilmiştir.
Gövde kısmının yanı sıra dört motor montaj parçasını da yazdırmanız gerekir. Montaj oldukça basittir; Motoru ve kartları yerinde sabitlemek için 3 mm somun ve cıvata kullanın. Montajdan sonra aşağıdaki resimde gösterildiği gibi görünmelidir.
Asıl tasarım, yukarıda gösterildiği gibi Arduino'nun alt rafındaki L298N sürücü modülü ve üstündeki pil ile planlandı. Aynı sırayı takip ediyorsanız, kartı doğrudan sağlanan deliklere vidalayabilir ve Li-po pil için bir kablo etiketi kullanabilirsiniz. Daha sonra değiştirmek zorunda kaldığım süper düz tekerlekler dışında bu düzenleme de işe yaramalı.
Botumda, programlama kolaylığı için pil ve Arduino UNO kartının konumunu değiştirdim ve ayrıca bağlantıları tamamlamak için mükemmel bir kart tanıtmak zorunda kaldım. Yani botum ilk aşamada planladığım gibi görünmüyordu. Kablolama programlama testini ve her şeyi tamamladıktan sonra, iki tekerlekli robotum nihayet böyle görünüyor
Devre şeması
Bu Arduino tabanlı Kendinden Dengeleyici Robot için bağlantı kurmak oldukça basittir. Bu, Arduino ve MPU6050 kullanan kendi kendini dengeleyen bir robottur, bu nedenle MPU6050 ile Arduino arasında arayüz oluşturmayı ve motorları Motor sürücü modülü aracılığıyla bağlamayı tercih ediyoruz. Tüm kurulum 7,4V li-ion pil ile güçlendirilmiştir. Aynısı için devre şeması aşağıda gösterilmiştir.
Arduino ve L298N Motor sürücü modülü doğrudan sırasıyla Vin pini ve 12V terminalinden beslenir. Arduino kartındaki yerleşik regülatör, 7.4V girişini 5V'a dönüştürecektir ve ATmega IC ve MPU6050 bununla çalışacaktır. DC motorlar, 5V ile 12V arasında çalışabilir. Ancak 7.4V pozitif kabloyu aküden motor sürücü modülünün 12V giriş terminaline bağlayacağız. Bu, motorların 7,4V ile çalışmasını sağlayacaktır. Aşağıdaki tablo MPU6050 ve L298N motor sürücü modülünün Arduino ile nasıl bağlandığını listeleyecektir.
Bileşen Pimi |
Arduino Pimi |
MPU6050 |
|
Vcc |
+ 5V |
Zemin |
Gnd |
SCL |
A5 |
SDA |
A4 |
INT |
D2 |
L298N |
|
IN1 |
D6 |
IN2 |
D9 |
IN3 |
D10 |
IN4 |
D11 |
MPU6050, I2C arayüzü üzerinden Arduino ile iletişim kurar, bu nedenle Arduino'nun A4 ve A5 SPI pinlerini kullanırız. DC motorlar sırasıyla D6, D9 D10 ve D11 PWM pinlerine bağlanır. Bunları PWM pinlerine bağlamamız gerekiyor çünkü PWM sinyallerinin görev döngüsünü değiştirerek DC motorun hızını kontrol edeceğiz. Bu iki bileşene aşina değilseniz, MPU6050 Arabirimi ve L298N Motor sürücüsü öğreticisini okumanız önerilir.
Kendinden Dengeleyici Robot Kodu
Şimdi robotu dengelemek için Arduino UNO kartımızı programlamamız gerekiyor. Burası tüm sihrin gerçekleştiği yerdir; arkasındaki konsept basit. MPU6050'yi kullanarak botun öne mi yoksa arkaya mı eğildiğini kontrol etmeliyiz ve sonra öne doğru eğiliyorsa tekerlekleri öne doğru döndürmeliyiz ve arkaya doğru eğiliyorsa tekerlekleri döndürmeliyiz. ters yönde.
Aynı zamanda tekerleklerin dönme hızını da kontrol etmeliyiz, eğer bot merkezden biraz sapmışsa tekerlekler yavaşça dönüyor ve merkezden uzaklaştıkça hız artıyor. Bu mantığı elde etmek için, merkez konumu ayar noktası ve çıktı olarak yönelim bozukluğu seviyesine sahip olan PID algoritmasını kullanıyoruz.
Kullandığımız bot güncel konumunu bilmek MPU6050 a,, 6 eksenli ivme ölçer ve jiroskop sensor birleştirildi. Sensörden güvenilir bir konum değeri elde etmek için hem ivmeölçer hem de jiroskopun değerini kullanmamız gerekir, çünkü ivmeölçerden gelen değerlerde gürültü sorunları vardır ve jiroskoptan gelen değerler zamanla kayma eğilimindedir. Bu yüzden her ikisini de birleştirmeli ve robotumuzun yalpalama ve yuvarlanma değerini almalıyız, ki bu değerin sadece sapma değerini kullanacağız.
Biraz kafa sarsıcı geliyor değil mi? Ancak endişelenmeyin, Arduino topluluğu sayesinde PID hesaplamasını gerçekleştirebilen ve ayrıca MPU6050'den sapma değerini alabilen hazır kitaplıklarımız var. Kitaplık sırasıyla br3ttb ve jrowberg tarafından geliştirilmiştir. Devam etmeden önce kütüphanelerini indirin aşağıdaki bağlantıyı oluşturun ve bunları Arduino kütüphanenize ekleyin.
github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.h
github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
Şimdi, Arduino IDE'mize eklenen kütüphanelerimiz var. Self Balancing Robotumuz için programlamaya başlayalım. Her zaman olduğu gibi, MPU6050 dengeleme robotunun tam kodu bu sayfanın sonunda verilmektedir, burada sadece koddaki en önemli parçacıkları açıklıyorum. Daha önce, kodun MPU6050 örnek kodunun üzerine inşa edildiğini söylediğimizde, kodu amacımız için optimize edeceğiz ve kendi kendini dengeleyen robotumuz için PID ve kontrol tekniğini ekleyeceğiz.
Öncelikle bu programın çalışması için gerekli olan kütüphaneleri ekliyoruz. Yeni indirdiğimiz yerleşik I2C kitaplığı, PID Kitaplığı ve MPU6050 Kitaplığı içerirler.
#include "I2Cdev.h" #include
Ardından verileri MPU6050 sensöründen almak için gereken değişkenleri açıklıyoruz. Hem yerçekimi vektörünü hem de kuaterniyon değerlerini okuyoruz ve ardından botun yalpalama ve dönüş değerini hesaplıyoruz. Şamandıra dizi ypr nihai sonucu düzenleyecek.
// MPU kontrolü / durum vars bool dmpReady = false; // DMP başlatma başarılı olursa doğru ayarla uint8_t mpuIntStatus; // MPU uint8_t devStatus'tan gerçek kesme durumu baytını tutar ; // her cihaz işleminden sonra durumu döndür (0 = başarılı,! 0 = hata) uint16_t packetSize; // beklenen DMP paket boyutu (varsayılan 42 bayttır) uint16_t fifoCount; // şu anda FIFO'da bulunan tüm baytların sayısı uint8_t fifoBuffer; // FIFO depolama tamponu // yönlendirme / hareket vars Kuaterniyon q; // kuaterniyon konteyner VectorFloat yerçekimi; // yerçekimi vektör float ypr; // yaw / pitch / roll konteyneri ve yerçekimi vektörü
Daha sonra, kodun çok önemli bölümü gelir ve burası, doğru değerler kümesini ayarlamak için uzun zaman harcayacağınız yerdir. Robotunuz çok iyi bir ağırlık merkezi ile inşa edilmişse ve bileşenler simetrik olarak düzenlenmişse (çoğu durumda değil), o zaman ayar noktanızın değeri 180 olacaktır. Aksi takdirde botunuzu Arduino seri monitöre bağlayın ve kadar eğin. iyi bir dengeleme konumu bulursanız, seri monitörde görüntülenen değeri okuyun ve bu sizin ayar noktası değerinizdir. Kp, Kd ve Ki'nin değeri botunuza göre ayarlanmalıdır. İki özdeş bot aynı Kp, Kd ve Ki değerlerine sahip olmayacağından ondan kaçış olmayacaktır. Bu değerlerin nasıl ayarlanacağına dair bir fikir edinmek için bu sayfanın sonundaki videoyu izleyin.
/ ********* BOT için bu 4 değeri ayarlayın ********* / çift ayar noktası = 176; Bot dik olduğu zaman // değeri toprak seri monitörü kullanarak. // Bu değerlerin nasıl ayarlanacağını öğrenmek için Circuitdigest.com'daki proje belgelerini okuyun double Kp = 21; // Bu ilk çift Kd = 0.8; // Bu sekmeyi çift olarak ayarlayın Ki = 140; // Son olarak bunu ayarlayın / ****** Değer ayarlarının sonu ********* /
Sonraki satırda giriş, çıkış, ayar noktası, Kp, Ki ve Kd giriş değişkenlerini geçerek PID algoritmasını başlatıyoruz. Bunların dışında, yukarıdaki kod parçacığında ayar noktası Kp, Ki ve Kd değerlerini zaten ayarladık. Giriş değeri, MPU6050 sensöründen okunan sapmanın geçerli değeri olacak ve çıkışın değeri, PID algoritması tarafından hesaplanan değer olacaktır. Yani temelde PID algoritması bize Giriş değerini ayar noktasına yakın olacak şekilde düzeltmek için kullanılması gereken bir çıkış değeri verecektir.
PID pid (& giriş, & çıkış, & ayar noktası, Kp, Ki, Kd, DIRECT);
İçinde boşluk kurulum fonksiyonu biz DMP yapılandırarak MPU6050 initialize (Dijital Hareket İşlemcisi). Bu, İvmeölçer verilerini Jiroskop verileriyle birleştirmemize yardımcı olacak ve Sapma, Eğim ve Yuvarlanma için güvenilir bir değer sağlayacaktır. Konunun çok ötesine geçeceği için bu konuya fazla girmeyeceğiz. Her neyse, kurulum işlevinde aramanız gereken kod segmentlerinden biri jiroskop ofset değerleridir. Her MPU6050 sensörünün kendi ofset değerleri vardır, sensörünüzün ofset değerini hesaplamak ve aşağıdaki satırları programınızda buna göre güncellemek için bu Arduino çizimini kullanabilirsiniz.
// kendi gyro ofsetlerinizi burada minimum hassasiyet için ölçeklendirilmiş olarak sağlayın mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1688);
Ayrıca motorlarımızı bağlamak için kullandığımız Dijital PWM pinlerini de başlatmalıyız. Bizim durumumuzda D6, D9, D10 ve D11. Bu yüzden bu pinleri çıkış pinleri varsayılan olarak DÜŞÜK hale getirdikçe başlatıyoruz.
// initialism motor Outpu pimleri pinMode (6, ÇIKIŞ); pinMode (9, ÇIKIŞ); pinMode (10, ÇIKIŞ); pinMode (11, ÇIKIŞ); // Varsayılan olarak her iki motoru da kapatın analogWrite (6, LOW); analogWrite (9, DÜŞÜK); analogWrite (10, DÜŞÜK); analogWrite (11, DÜŞÜK);
İçerisinde ana döngü MPU6050 verilerin okunacağı hazır olup olmadığını işlevin biz kontrol. Cevabınız evet ise, bunu PID değerini hesaplamak için kullanırız ve ardından sadece PID'nin nasıl tepki verdiğini kontrol etmek için PID'nin giriş ve çıkış değerini seri monitörde görüntüleriz. Ardından, çıktının değerine bağlı olarak botun ileriye mi yoksa geriye mi hareket etmesi veya sabit durması gerektiğine karar veririz.
Bot dik olduğunda MPU6050'nin 180 döndüreceğini varsaydığımız için. Bot öne doğru düştüğünde pozitif düzeltme değerleri alacağız ve bot arkaya düşerse negatif değerler alacağız. Bu nedenle, bu durumu kontrol ediyoruz ve botu ileri veya geri hareket ettirmek için uygun işlevleri çağırıyoruz.
while (! mpuInterrupt && fifoCount <packetSize) { // mpu verisi yok - PID hesaplamaları ve pid.Compute () motorlara çıkış gerçekleştiriliyor ; // Nasıl çalıştığını kontrol etmek için seri monitörde Giriş ve Çıkışın değerini yazdırın. Seri baskı (giriş); Seri.print ("=>"); Serial.println (çıktı); if (input> 150 && input <200) {// Bot düşüyorsa if (output> 0) // Öne doğru düşüyor Forward (); // Tekerleri öne doğru döndürün, aksi takdirde (output <0) // Geriye doğru düşmek Reverse (); // Tekerlekleri geriye doğru döndürün } else // Bot düşmüyorsa Stop (); // Tekerlekleri sabit tutun }
PID çıkış değişkeni de motorun döndürülmesi gereken ne kadar hızlı karar verir. Bot hemen düşmek üzereyse, tekerleği yavaşça döndürerek küçük bir düzeltme yapıyoruz. Eğer bu ufak düzeltmeler işe yararsa ve yine de bot düşüyorsa motorun hızını arttırırız. Tekerleklerin ne kadar hızlı döndüğünün değeri PI algoritması tarafından belirlenecektir. Ters işlevi için çıktı değerini -1 ile çarptığımıza dikkat edin, böylece negatif değeri pozitife dönüştürebiliriz.
void Forward () // Tekerleği ileri döndürme kodu { analogWrite (6, output); analogWrite (9,0); analogWrite (10, çıktı); analogWrite (11,0); Seri.print ("F"); // Hata ayıklama bilgileri } void Reverse () // Tekerleği Geriye doğru döndürmek için kod { analogWrite (6,0); analogWrite (9, çıktı * -1); analogWrite (10,0); analogWrite (11, çıktı * -1); Seri.baskı ("R"); } void Stop () // Her iki tekerleği de durduracak kod { analogWrite (6,0); analogWrite (9,0); analogWrite (10,0); analogWrite (11,0); Seri.print ("S"); }
Arduino Self Balancing Robotunun Çalışması
Donanıma hazır olduğunuzda, kodu Arduino kartınıza yükleyebilirsiniz. Li-ion pil kullandığımız için bağlantıların düzgün olduğundan emin olun, çok dikkatli olunması gerekiyor. Bu nedenle, kısa devreleri iki kez kontrol edin ve botunuz bazı küçük etkiler yaşasa bile terminallerin temas etmemesini sağlayın. Modülünüzü çalıştırın ve seri monitörünüzü açın, Arduino'nuz MPU6050 ile başarılı bir şekilde iletişim kurabilirse ve her şey beklendiği gibi çalışıyorsa aşağıdaki ekranı görmelisiniz.
Burada PID algoritmasının giriş ve çıkış değerlerini input => output formatında görüyoruz . Bot mükemmel bir dengeye sahipse, çıktının değeri 0 olacaktır. Giriş değeri, MPU6050 sensöründen gelen geçerli değerdir. "F" alfabesi botun ileri doğru hareket ettiğini ve "R" ise botun ters yönde hareket ettiğini gösterir.
PID'nin ilk aşamalarında Arduino kablonuzu bota bağlı bırakarak giriş ve çıkış değerlerini kolayca izleyebilmenizi ve ayrıca Kp, Ki ve Kd değerleri için programınızı düzeltmeniz ve yüklemeniz kolay olacaktır. Aşağıdaki video, botun tam çalışmasını gösterir ve ayrıca PID değerlerinizi nasıl düzelteceğinizi gösterir.
Umarım bu, çalışmasını sağlamakta herhangi bir sorun yaşarsanız, kendi kendini dengeleyen robotunuzu oluşturmanıza yardımcı olur, ardından sorularınızı aşağıdaki yorum bölümünde bırakın veya daha teknik sorular için forumları kullanın. Daha fazla eğlence istiyorsanız, aynı mantığı bir top dengeleme robotu yapmak için de kullanabilirsiniz.