Mündəricat:

Hərəkətə Nəzarət Gimbal: 12 addım
Hərəkətə Nəzarət Gimbal: 12 addım

Video: Hərəkətə Nəzarət Gimbal: 12 addım

Video: Hərəkətə Nəzarət Gimbal: 12 addım
Video: Вид из открытой кабины и БОЛЬШЕ: экскурсия по музею авиации Новой Англии // Коннектикут [4K] [KM+Parks&Rec S01E20] 2024, Iyul
Anonim
Image
Image

Hamıya Salam, Adım Harji Nagi. Hal -hazırda Kanpur (UP) Pranveer Singh Texnologiya İnstitutunun elektronika və kommunikasiya mühəndisliyi ixtisası üzrə təhsil alan ikinci kurs tələbəsiyəm. Robototexnika, arduino, Süni Zəka və Analog elektronikaya böyük marağım var.

"Gimbal" sözü, hər hansı bir cismin tək bir oxda fırlanmasına imkan verən dönən bir dəstək olaraq təyin olunur. Beləliklə, üç oxlu bir gimbal, gimbala quraşdırılmış hər hansı bir cismin gimbalı tutanın hərəkətindən asılı olmamasına imkan verir. Gimbal, obyektin hərəkətini diktə edir, onu daşıyan deyil.

3 eksenli idarəetmə üçün 3 MG996R servo mühərrikdən və MPU6050 sensoru, Arduino və batareyanın yerləşdiriləcəyi bir bazadan ibarətdir. 3 oxlu bir gimbal, kameranı tutan şəxs yuxarı və aşağı, sola və sağa, önə və arxaya doğru hərəkət etsə belə sabitləşməsini təmin edir. Yaw, pitch və roll stabilizasiyası olaraq adlandırdığımız budur.

Addım 1: Komponentlərin siyahısı

Komponentlərin siyahısı belədir:

1) Arduino Uno

2) Arduino Uno -nu gücləndirmək üçün 8V, 1.5 Amp Batareya

3) 7805 Voltaj tənzimləyicisi Ic və ya buck konvertorundan istifadə edə bilərsiniz

4) MPU 6050

5) 3*(MG995 SERVO Motors)

6) Jumper telləri

Digər Avadanlıqlar:

1) Havya

2) Yapışqan Tabancası

3) Qazma maşını

4) Yemək olar

Breadborad istifadə etmək əvəzinə, müsbət və mənfi avtobus əlaqəsi üçün kiçik coustom perf board istifadə edirəm

Addım 2: Montaj

Montaj
Montaj
Montaj
Montaj

Foamcore, köpük lövhəsi və ya kağız üzlü köpük lövhəsi, Servo motorunun quraşdırılması və ölçülü modellərin hazırlanması üçün istifadə olunan yüngül və asanlıqla kəsilən bir materialdır.

Əvvəlcə köpük lövhəsinin köməyi ilə servo motoru quraşdırmaq üçün DIY L şəkilli mötərizələr düzəltdim.

Addım 3:

Şəkil
Şəkil

Gimbalın yığılması olduqca asan idi. Yaw servo, MPU 6050 sensoru və ON-OFF açarını quraşdırmağa başladım. Cıvata və qoz -fındıqdan istifadə edərək onu bazaya bağladım

Addım 4: Sonra, Eyni Metoddan istifadə edərək Roll Servo təmin etdim. Parçalar MG995 Servosunu Asanlıqla Quraşdırmaq üçün Xüsusi Dizayn Edilmişdir

Sonra eyni metoddan istifadə edərək Roll Servo təmin etdim. Parçalar MG995 Servosunu Asanlıqla Quraşdırmaq üçün Xüsusi Dizayn Edilmişdir
Sonra eyni metoddan istifadə edərək Roll Servo təmin etdim. Parçalar MG995 Servosunu Asanlıqla Quraşdırmaq üçün Xüsusi Dizayn Edilmişdir

Addım 5: Sonra, Eyni Metoddan istifadə edərək Roll Servo təmin etdim. Parçalar MG995 Servosunu Asanlıqla Quraşdırmaq üçün Xüsusi Dizayn Edilmişdir

Sonra eyni metoddan istifadə edərək Roll Servo təmin etdim. Parçalar MG995 Servosunu Asanlıqla Quraşdırmaq üçün Xüsusi Dizayn Edilmişdir
Sonra eyni metoddan istifadə edərək Roll Servo təmin etdim. Parçalar MG995 Servosunu Asanlıqla Quraşdırmaq üçün Xüsusi Dizayn Edilmişdir

Addım 6: Bağlantılar

Əlaqələr
Əlaqələr

Dövrə diaqramında 8V -ni 5V -ə çevirmək üçün buck çeviricisini və ya 7805 Voltaj tənzimləyicisi IC -dən istifadə edə bilərsiniz. Dövrə diaqramı verilən mikrokontrolör Arduino Nano, Arduino Uno, Arduino Mega da istifadə edə bilərsiniz.

MPU 6050 -nin SCL və SDA sancaqları Arduino Analog pin A5 və A4 -ə bağlıdır. (SCL və SDA pinləri fərqli ola bilər, buna görə digər mikrokontrolör üçün SCl və SDA pinləri üçün məlumat cədvəlinə baxın)

Addım 7: 7805 Voltaj Regulyatoru IC ilə əlaqə

7805 Voltaj Regulyatoru IC ilə əlaqə
7805 Voltaj Regulyatoru IC ilə əlaqə

Bu dövrə diaqramı 7805 voltaj tənzimləyicisinin ic bağlantısı üçündür, 8v batareyanı Vin -ə qoşun və 5v çıxış gərginliyi alacaqsınız.

Addım 8: Kodlaşdırma

Aşağıdakı kitabxanaları daxil etməlisiniz:

1) zip faylını yükləmək üçün buraya vurun

2) #includeZip faylını yükləmək üçün bura vurun

Zip faylını yüklədikdən sonra arduino eskizinə zip kitabxana əlavə edin

Kod üçün

/*

DIY Gimbal - Jeff Rowberg tərəfindən i2cdevlib kitabxanasından MPU6050_DMP6 nümunəsinə əsaslanan MPU6050 Arduino Dərs Kodları: https://github.com/jrowberg/i2cdevlib */// I2Cdev və MPU6050 kitabxana olaraq, yoxsa.cpp/.h faylları // hər iki sinif üçün layihənizin daxil edilmə yolunda olmalıdır #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // #include "MPU6050.h" // MotionApps istifadə edərkən fayl lazım deyil / / I2Cdev.h #I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // sinif default I2C ünvanı 0C68 ola bilər, I2Cdev I2CDEV_ARDUINO_WIRE tətbiqi // istifadə olunarsa / Arduino Wire kitabxanası lazımdır. burada bir parametr olaraq qəbul edildi // AD0 aşağı = 0x68 (SparkFun breakout və InvenSense qiymətləndirmə lövhəsi üçün standart) // AD0 yüksək = 0x69 MPU6050 mpu; // MPU6050 mpu (0x69); // <- AD0 yüksək üçün istifadə edin // 3 servo mühərriki təyin edin Servo servo0; Servo servo1; Servo servo2; düzgün üzmək; int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #INTERRUPT_PIN 2 təyin edin // Arduino Uno -da pin 2 istifadə edin və əksər lövhələr bool blinkState = false; // MPU idarəsi/status vars bool dmpReady = false; // DMP init uğurlu uint8_t mpuIntStatus olsaydı doğru təyin edin; // MPU uint8_t devStatus -dan faktiki fasilə statusu baytını saxlayır; // hər cihaz əməliyyatından sonra vəziyyəti qaytarın (0 = uğur,! 0 = səhv) uint16_t packetSize; // gözlənilən DMP paket ölçüsü (standart 42 baytdır) uint16_t fifoCount; // hazırda FIFO -da olan bütün baytların sayı uint8_t fifoBuffer [64]; // FIFO saxlama tamponu // oriyentasiya/hərəkət variantları Quaternion q; // [w, x, y, z] quaternion konteyner VectorInt16 aa; // [x, y, z] sürətləndirici sensor ölçüləri VectorInt16 aaReal; // [x, y, z] cazibə qüvvəsi olmayan sürətləndirici sensor ölçüləri VectorInt16 aaWorld; // [x, y, z] dünya çərçivəli sürətləndirici sensor ölçüləri VectorFloat çəkisi; // [x, y, z] cazibə vektoru float euler [3]; // [psi, theta, phi] Euler bucaqlı konteyner float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll konteyner və çəkisi vektoru // InvenSense çaydanlığı demo uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0 üçün paket quruluşu, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // ============================================== ================ // === KESME ALGILAMA RUTİNİ === // ==================== =========================================== uçucu bool mpuInterrupt = false; // MPU kəsmə pininin yüksək boşluğa getdiyini göstərir dmpDataReady () {mpuInterrupt = true; } // ============================================== ================= // === İLK KURULUM === // =================== =========================================== Void setup () {// I2C avtobusuna qoşul (I2Cdev kitabxanası bunu avtomatik etməz) #I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400kHz I2C saatı. Kompilyasiya çətinlikləri varsa bu sətiri şərh edin #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, true); #endif // serial ünsiyyətini başlatmaq // (115200 Çaydanlıq Demosu çıxışı üçün lazım olduğu üçün seçildi, ancaq // layihənizdən asılı olaraq həqiqətən sizə bağlıdır) Serial.begin (38400); while (! Serial); // Leonardonun siyahıya alınmasını gözləyin, digərləri dərhal davam edir // cihazı //Serial.println(F("I2C cihazlarının işə salınması… ")); mpu.initialize (); pinMode (INTERRUPT_PIN, GİRİŞ); devStatus = mpu.dmpInitialize (); // mpu.setXGyroOffset (17) üçün minimum həssaslıq üçün ölçülmüş öz girro ofsetlərinizi təmin edin; mpu.setYGyroOffset (-69); mpu.setZGyroOffset (27); mpu.setZAccelOffset (1551); // test çipim üçün 1688 zavod standartı // işlədiyinə əmin olun (əgər varsa 0 qaytarır) əgər (devStatus == 0) {// hazırdırsa DMP -ni yandırın // Serial.println (F ("Aktivləşdirmə) DMP… ")); mpu.setDMPEnabled (doğru); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // DMP Hazır bayrağımızı elə qurun ki, əsas loop () funksiyası ondan istifadə etməyinizin yaxşı olduğunu bilsin //Serial.println(F("DMP hazırdır! İlk kəsilmə gözləyir … ")); dmpReady = doğru; // sonrakı müqayisə üçün gözlənilən DMP paket ölçüsünü əldə edin packetSize = mpu.dmpGetFIFOPacketSize (); } başqa {// HATA! // 1 = ilkin yaddaş yüklənməsi uğursuz oldu // 2 = DMP konfiqurasiya yeniləmələri uğursuz oldu // (pozulacaqsa, adətən kod 1 olacaq) // Serial.print (F ("DMP Başlanğıcı uğursuz oldu (kod")); //Serial.print(devStatus); //Serial.println (F (")")); } // 3 servo mühərrikin qoşulduğu pinləri təyin edin servo0.attach (10); servo1. əlavə (9); servo2.tach (8); } // ============================================== ================= // === ANA PROGRAM LOOP === // ================== ============================================ void loop () { / / proqramlaşdırma uğursuz olarsa, (! dmpReady) qayıtsa heç bir şey etməyə çalışmayın; // MPU müdaxiləsini və ya əlavə paketlərin (!

= 1024) {

// sıfırlayın ki, təmiz şəkildə davam edək mpu.resetFIFO (); fifoCount = mpu.getFIFOCount (); Serial.println (F ("FIFO daşması!")); // əks halda, DMP məlumatlarının hazır kəsilməsini yoxlayın (bu tez -tez baş verməlidir)} başqa halda (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// düzgün mövcud məlumat uzunluğunu gözləyin, ÇOX qısa bir gözləmə olmalıdır (fifoCount 1 paket mövcuddur / / (bu, fasilə gözləmədən dərhal daha çox oxumağımıza imkan verir) fifoCount -= packetSize; // Yaw, Pitch və Roll dəyərlərini əldə edin #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmp & getGrGrity;.dmpGetYawPitchRoll (ypr, & q, & gravity); // Yaw, Pitch, Roll dəyərləri - Radians dərəcələrə ypr [0] = ypr [0] * 180 / M_PI; ypr [1] = ypr [1] * 180 / M_PI; ypr [2] = ypr [2] * 180 / M_PI; // (j <= 300) {düzgün = ypr [0]; // Yaw təsadüfi dəyərdən başlasa, 300 oxunuşu atla (özünü kalibrləmə prosesi); 300 oxunuşdan sonra son dəyəri ələ keçir j ++;} // Başqa 300 oxunuşdan sonra {ypr [0] = ypr [0] - düzgün; // Yawı 0 dərəcəyə təyin et - son təsadüfi Yaw dəyərini cari dəyərdən çıxarmaq üçün Yaw 0 dərəcə es // MPU6050 sensorunun dəyərlərini -90 -dan 90 -a qədər servo idarəetmə üçün uyğun olan dəyərlərlə 0 -dan 180 int -ə qədər servo0Value = map (ypr [0], -90, 90, 0, 180); int servo1Value = xəritə (ypr [1], -90, 90, 0, 180); int servo2Value = xəritə (ypr [2], -90, 90, 180, 0); // servoları MPU6050 oriyentasiyasına uyğun olaraq idarə edin servo0.write (servo0Value); servo1.write (servo1Value); servo2.write (servo2Value); } #endif}}

Nəhayət, yazma funksiyasından istifadə edərək, bu dəyərləri nəzarət siqnalları olaraq servolara göndəririk. Əlbəttə ki, X və Y oxları üçün sabitləşmə istəyirsinizsə və bu platformanı kamera gimbal olaraq istifadə etsəniz, Yaw servosunu deaktiv edə bilərsiniz

Addım 9: Bütün Komponentlər Bağlandıqda Görünüşü Bu Şəkilə Bənzərdir

Bütün Komponentlər Bağlandıqda Görünüşü Bu Şəkilə Bənzərdir
Bütün Komponentlər Bağlandıqda Görünüşü Bu Şəkilə Bənzərdir

Addım 10: İndi bütün əsas məhsulları qida qutusuna daxil edin

İndi Bütün Baza Məhsullarını Qidanın İçinə Yerləşdirin
İndi Bütün Baza Məhsullarını Qidanın İçinə Yerləşdirin

Addım 11: Bütün Tellər və Komponentlər Yeməyin İçinə Yerləşdirildikdən Sonra Köpük Lövhəsinə Yapışqan Tabancası Tətbiq Edilə bilər

Bütün tellər və komponentlər bir qidanın içərisinə qoyulduqda, köpük lövhəsinin əsasına yapışqan tabancası tətbiq edilə bilər
Bütün tellər və komponentlər bir qidanın içərisinə qoyulduqda, köpük lövhəsinin əsasına yapışqan tabancası tətbiq edilə bilər

Addım 12: Nəticə

Bunu yaxşı kamera gimbalından uzaqda qeyd edin. Bu servolar belə bir məqsəd üçün nəzərdə tutulmadığı üçün hərəkətlər hamar deyil. Əsl kamera gimbalları, hamar hərəkətlər əldə etmək üçün xüsusi bir BLDC motorundan istifadə edir. Beləliklə, bu layihəni yalnız təhsil məqsədi ilə düşünün.

Bu dərslik üçün hər şey olardı, ümid edirəm ki, bundan zövq aldınız və yeni bir şey öyrəndiniz. Aşağıdakı şərhlər bölməsində hər hansı bir sual verməkdən çekinmeyin və layihə kolleksiyalarını yoxlamağı unutmayın

Tövsiyə: