Mundarija:

Gimbal harakatini boshqarish: 12 qadam
Gimbal harakatini boshqarish: 12 qadam

Video: Gimbal harakatini boshqarish: 12 qadam

Video: Gimbal harakatini boshqarish: 12 qadam
Video: Телескопический погрузчик MANITOU MLT 733-115 и MLT 737-130PS - сравнение погрузчиков. 2024, Noyabr
Anonim
Image
Image

Hammaga salom, mening ismim Xarji Nagi, men hozirda Kanpur (UP) Pranveer Singh Texnologiya Institutining elektronika va aloqa muhandisligi bo'yicha ikkinchi kurs talabasiman. Robototexnika, arduino, sun'iy intellekt va analog elektronikaga katta qiziqishim bor.

"Gimbal" so'zi har qanday ob'ektni bitta o'qda aylantirish imkonini beradigan aylanadigan tayanch sifatida tavsiflanadi. Shunday qilib, uch o'qli gimbal gimbalga o'rnatilgan har qanday narsaning gimbalni ushlab turuvchi harakatidan mustaqil bo'lishiga imkon beradi. Gimbal ob'ektning harakatini belgilaydi, uni olib yuruvchi emas.

U 3 o'qli boshqaruv uchun 3 MG996R servo dvigatelidan va MPU6050 sensori, Arduino va akkumulyator joylashadigan tayanchdan iborat. 3 o'qli gimbal kameraning harakatini barqarorlashtirishni ta'minlaydi, garchi uni ushlab turgan kishi yuqoriga va pastga, chapga va o'ngga, old va orqa tomonga ko'tarilsa ham. Buni biz yaw, pitch va roll stabilizatsiyasi deb ataymiz.

1 -qadam: Komponentlar ro'yxati

Komponentlar ro'yxati:

1) Arduino Uno

2) Arduino Uno -ni quvvatlantirish uchun 8V, 1,5 Amperli batareya

3) 7805 Ic voltaj regulyatori yoki siz konvektordan foydalanishingiz mumkin

4) MPU 6050

5) 3*(MG995 SERVO Motors)

6) o'tish simlari

Boshqa uskunalar:

1) payvandlash temir

2) yopishtiruvchi qurol

3) burg'ulash mashinasi

4) Oziq -ovqat

Breadborad -ni ishlatish o'rniga, avtobusning ijobiy va salbiy ulanishi uchun men kichkina maxsus taxtadan foydalanaman

2 -qadam: yig'ish

Yig'ish
Yig'ish
Yig'ish
Yig'ish

Ko'pikli, ko'pikli taxta yoki qog'ozli ko'pikli plastinka Servo dvigatelini o'rnatish va shkalali modellarni tayyorlash uchun ishlatiladigan engil va oson kesiladigan materialdir.

Birinchidan, ko'pikli plastinka yordamida servo dvigatelni o'rnatish uchun o'z qo'llarim bilan L shaklidagi qavslar yasadim.

3 -qadam:

Rasm
Rasm

Gimbalni yig'ish juda oson edi. Men Yaw servo, MPU 6050 sensori va ON-OFF kalitini o'rnatishdan boshladim. Bolt va yong'oqdan foydalanib, uni taglikka mahkamladim

4 -qadam: Keyin, xuddi shu usuldan foydalanib, men rul servosini ta'minladim. ehtiyot qismlar MG995 servosini osongina o'rnatish uchun maxsus mo'ljallangan

Keyin, xuddi shu usuldan foydalanib, rulonli servo bilan ta'minladim. ehtiyot qismlar MG995 servosini osongina o'rnatish uchun mo'ljallangan
Keyin, xuddi shu usuldan foydalanib, rulonli servo bilan ta'minladim. ehtiyot qismlar MG995 servosini osongina o'rnatish uchun mo'ljallangan

5 -qadam: Keyin, xuddi shu usuldan foydalanib, men rul servosini ta'minladim. ehtiyot qismlar MG995 servosini osongina o'rnatish uchun maxsus mo'ljallangan

Keyin, xuddi shu usuldan foydalanib, rulonli servo bilan ta'minladim. ehtiyot qismlar MG995 servosini osongina o'rnatish uchun maxsus mo'ljallangan
Keyin, xuddi shu usuldan foydalanib, rulonli servo bilan ta'minladim. ehtiyot qismlar MG995 servosini osongina o'rnatish uchun maxsus mo'ljallangan

6 -qadam: ulanishlar

Ulanishlar
Ulanishlar

O'chirish sxemasida siz 8Vni 5V ga 5 V ga aylantirish uchun buck konverteri yoki 7805 voltaj regulyatori IC dan foydalanishingiz mumkin. O'chirish diagrammasi berilgan mikrokontroller Arduino Nano, siz Arduino Uno, Arduino Mega -dan ham foydalanishingiz mumkin.

MPU 6050 ning SCL va SDA pinlari Arduino analog pinli A5 va A4 ga ulangan. (SCL va SDA pinlari farq qilishi mumkin, shuning uchun boshqa mikrokontrollerlar uchun SCl va SDA pinlari uchun ma'lumotlar jadvalini ko'rib chiqing)

7 -qadam: 7805 kuchlanish regulyatori IC bilan ulanish

7805 kuchlanish regulyatori IC bilan ulanish
7805 kuchlanish regulyatori IC bilan ulanish

Ushbu sxema 7805 voltaj regulyatorining ic -ni ulash uchun mo'ljallangan, 8V batareyani Vin -ga ulang va siz 5V chiqish kuchlanishiga ega bo'lasiz.

8 -qadam: kodlash

Siz quyidagi kutubxonalarni kiritishingiz kerak:

1) zip faylini yuklab olish uchun #includeClick ni bosing

2) #includeZip faylini yuklab olish uchun shu erni bosing

Zip faylini yuklab olgandan so'ng, arduino eskiziga zip kutubxonasini qo'shing

Kod uchun

/*

DIY Gimbal - Jeff Rowberg i2cdevlib kutubxonasidagi MPU6050_DMP6 misoliga asoslangan MPU6050 Arduino o'quv qo'llanma kodi: https://github.com/jrowberg/i2cdevlib */// kutubxona sifatida I2Cdev va MPU6050 o'rnatilishi kerak, aks holda.cpp/.h fayllari // har ikkala sinf uchun ham loyihangizning qo'shilish yo'lida bo'lishi kerak #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // #"MPU6050.h" ni o'z ichiga oladi // agar MotionApps -dan fayl qo'shilsa /kerak emas / / Arduino Wire kutubxonasi kerak, agar I2Cdev I2CDEV_ARDUINO_WIRE ilovasi // I2Cdev.h da ishlatilsa #= I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // sinfning standart I2C manzili 0C68 bo'lishi mumkin // bu erda parametr sifatida qabul qilingan // AD0 past = 0x68 (SparkFun uzilishi va InvenSense baholash paneli uchun standart) // AD0 yuqori = 0x69 MPU6050 mpu; // MPU6050 MPa (0x69); // <- AD0 yuqori uchun ishlatish // 3 servo dvigatelni belgilang Servo servo0; Servo servo1; Servo servo2; to'g'ri suzish; int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #INTERRUPT_PIN 2 ni aniqlang // Arduino Uno -dagi 2 -pinni ishlating va ko'pchilik bool blinkState = false; // MPU boshqaruvi/holati bool dmpReady = false; // agar DMP boshlang'ichi muvaffaqiyatli bo'lsa, rostni belgilang uint8_t mpuIntStatus; // MPU uint8_t devStatus -dan haqiqiy uzilish holati baytiga ega; // har bir qurilma ishidan keyin holatni qaytarish (0 = muvaffaqiyat,! 0 = xato) uint16_t packetSize; // kutilgan DMP paket hajmi (standart 42 bayt) uint16_t fifoCount; // hozirda FIFOda mavjud bo'lgan barcha baytlar soni uint8_t fifoBuffer [64]; // FIFO saqlash buferi // yo'nalish/harakat variantlari Quaternion q; // [w, x, y, z] quaternionli konteyner VectorInt16 aa; // [x, y, z] aksel sensori o'lchovlari VectorInt16 aaReal; // [x, y, z] tortishishsiz aksel sensori o'lchovlari VectorInt16 aaWorld; // [x, y, z] butun dunyo bo'ylab aksel sensori o'lchovlari VectorFloat gravitatsiyasi; // [x, y, z] tortishish vektori suzuvchi euler [3]; // [psi, teta, phi] Eyler burchakli konteyner float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll konteyner va tortish vektori // InvenSense choynak demo uchun paket tuzilishi uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // =============================================== ================ // === O'ZGARISH DETEKTION RUTINE === // ==================== =========================================== uchuvchi bool mpuInterrupt = false; // MPU uzilish pimi yuqori bo'shliqqa aylanganligini ko'rsatadi dmpDataReady () {mpuInterrupt = true; } // ============================================== ================= // === Boshlang'ich o'rnatish === // ==================== =========================================== Void setup () {// I2C avtobusiga qo'shilish (I2Cdev kutubxonasi buni avtomatik ravishda qilmaydi) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400 kHz chastotali I2C. Kompilyatsiya qilishda qiyinchiliklar bo'lsa, bu qatorga izoh bering #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, true); #endif // ketma -ket aloqani ishga tushirish // (115200 tanlangan, chunki u Choynak Demo chiqishi uchun kerak, lekin bu sizning loyihangizga qarab // sizga bog'liq) Serial.begin (38400); while (! Seriyali); // Leonardo ro'yxatini kuting, boshqalar darhol davom ettiradilar // qurilmani ishga tushirish //Serial.println(F("I2C qurilmalarini ishga tushirish … ")); mpu.initialize (); pinMod (INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize (); // bu erda o'z sezgirligi minimallashtirilgan mpu.setXGyroOffset (17) uchun o'z gyro ofsetlarini etkazib bering; mpu.setYGyroOffset (-69); mpu.setZGyroOffset (27); mpu.setZAccelOffset (1551); // sinov chipi uchun 1688 zavod standarti // uning ishlaganligiga ishonch hosil qiling (agar shunday bo'lsa 0 qaytariladi) agar (devStatus == 0) {// DMP yoqilsa, hozir u tayyor // Serial.println (F ("Enable DMP … ")); mpu.setDMPEnabled (haqiqiy); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // DMP Ready bayrog'ini o'rnating, shunda asosiy loop () funktsiyasi uni ishlatishning to'g'riligini biladi //Serial.println(F("DMP tayyor! Birinchi uzilish kutilmoqda … ")); dmpReady = rost; // keyinchalik taqqoslash uchun kutilgan DMP paket hajmini oling packetSize = mpu.dmpGetFIFOPacketSize (); } boshqa {// XATO! // 1 = xotira yuklamadi // 2 = DMP konfiguratsiyasini yangilab bo'lmadi // (agar u buzilsa, odatda kod 1 bo'ladi) // Serial.print (F ("DMP ishga tushirilmadi (kod")); //Serial.print(devStatus); //Serial.println (F (")"))); } // 3 ta servo dvigatel ulangan pinlarni aniqlang servo0.attach (10); servo1. qo'shish (9); servo2.attach (8); } // ============================================== ================= // === ASOSI PROGRAM LOOP === // ================== ============================================ void loop () { / / agar dasturlash muvaffaqiyatsiz bo'lsa, (! dmpReady) qaytsa, hech narsa qilishga urinmang; // MPU uzilishi yoki qo'shimcha paketlar mavjud bo'lishini kuting (! mpuInterrupt && fifoCount <packetSize) {if (mpuInterrupt && fifoCount)

= 1024) {

// qayta tiklash, shuning uchun biz mpu.resetFIFO () ni toza davom ettirishimiz mumkin; fifoCount = mpu.getFIFOCount (); Serial.println (F ("FIFO to'lishi!")); // aks holda, DMP ma'lumotlarining tayyor uzilishini tekshiring (bu tez -tez sodir bo'lishi kerak)} aks holda (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// mavjud ma'lumotlarning to'g'ri uzunligini kuting, juda qisqa kutish kerak (fifoCount 1 to'plami mavjud / / (bu bizga uzilishni kutmasdan darhol ko'proq o'qish imkonini beradi) fifoCount -= packetSize; // Yaw, Pitch and Roll qiymatlarini oling #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmp & gretGrGrity;.dmpGetYawPitchRoll (ypr, & q, & gravity); // Yaw, Pitch, Roll qiymatlari - radian darajalariga ypr [0] = ypr [0] * 180 / M_PI; ypr [1] = ypr [1] * 180 / M_PI; ypr [2] = ypr [2] * 180 / M_PI; // 300 o'qishni o'tkazib yuboring (o'z-o'zini kalibrlash jarayoni), agar (j <= 300) {to'g'ri = ypr [0]; // Yaw tasodifiy qiymatdan boshlanadi, shuning uchun biz 300 o'qishdan keyin oxirgi qiymatni olish j ++;} // 300 o'qishdan keyin {ypr [0] = ypr [0] - to'g'ri; // Yawni 0 gradusga qo'ying - oxirgi tasodifiy Yaw qiymatini joriy qiymatdan chiqarib oling. Yaw 0 daraja es // MPU6050 sensori qiymatlarini -90 dan 90 gacha servo boshqaruvi uchun mos keladigan qiymatlarga xaritasini 0 dan 180 int servo0Value = map (ypr [0], -90, 90, 0, 180); int servo1Value = xarita (ypr [1], -90, 90, 0, 180); int servo2Value = xarita (ypr [2], -90, 90, 180, 0); // servolarni MPU6050 yo'nalishi servo0.write (servo0Value) bo'yicha boshqaring; servo1.write (servo1Value); servo2.write (servo2Value); } #endif}}

Nihoyat, yozish funktsiyasidan foydalanib, biz bu qiymatlarni servolarga nazorat signallari sifatida yuboramiz. Albatta, agar siz X va Y o'qlari uchun stabilizatsiyani xohlasangiz, Yaw servosini o'chirib qo'yishingiz va ushbu platformani gimbal sifatida ishlatishingiz mumkin

9 -qadam: Barcha komponentlar ulanganda, bu rasmga o'xshaydi

Barcha komponentlar ulanganda, bu rasmga o'xshaydi
Barcha komponentlar ulanganda, bu rasmga o'xshaydi

10 -qadam: Endi barcha asosiy narsalarni oziq -ovqat idishiga soling

Endi barcha asosiy narsalarni oziq -ovqat idishiga joylashtiring
Endi barcha asosiy narsalarni oziq -ovqat idishiga joylashtiring

11 -qadam: Barcha simlar va komponentlar oziq -ovqat ichiga joylashtirilganda, ko'pik taxtasi tagiga yopishtiruvchi tabancani qo'llash mumkin

Barcha simlar va komponentlar oziq -ovqat ichiga joylashtirilganda, ko'pik taxtasi tagiga yopishtiruvchi tabancani qo'llash mumkin
Barcha simlar va komponentlar oziq -ovqat ichiga joylashtirilganda, ko'pik taxtasi tagiga yopishtiruvchi tabancani qo'llash mumkin

12 -qadam: Xulosa

Iltimos, buni yaxshi kamera gimbalidan uzoqroq deb biling. Harakatlar silliq emas, chunki bu servolar bunday maqsad uchun mo'ljallanmagan. Haqiqiy kamera gimballari silliq harakatlarni olish uchun maxsus BLDC dvigatelidan foydalanadi. Shunday qilib, ushbu loyihani faqat ta'lim maqsadida ko'rib chiqing.

Bu darslik uchun hamma narsa bo'lardi, umid qilamanki, sizga yoqdi va yangi narsalarni o'rgandingiz. Quyidagi izohlar bo'limida har qanday savol berishingiz mumkin va loyiha to'plamlarini tekshirishni unutmang

Tavsiya: