İçindekiler:

Hareket Kontrollü Gimbal: 12 Adım
Hareket Kontrollü Gimbal: 12 Adım

Video: Hareket Kontrollü Gimbal: 12 Adım

Video: Hareket Kontrollü Gimbal: 12 Adım
Video: Cep Telefonu İle Profesyonel Görünen Videolar İçin 12 Gimbal İpucu | DJI OM 6 ve iPhone 13 2024, Temmuz
Anonim
Image
Image

Herkese Merhaba, Benim adım Harji Nagi. Şu anda Kanpur(UP) Pranveer Singh Teknoloji Enstitüsü'nde elektronik ve iletişim mühendisliği okuyan ikinci sınıf öğrencisiyim. Robotik, arduino, Yapay Zeka ve Analog elektronik konularına büyük ilgi duyuyorum.

"Gimbal" kelimesi, herhangi bir nesnenin tek bir eksende dönmesine izin veren pivotlu bir destek olarak tanımlanır. Böylece, üç eksenli bir gimbal, gimbal üzerine monte edilen herhangi bir nesnenin, gimbali tutanın hareketinden bağımsız olmasına izin verir. Gimbal, onu taşıyanın değil, nesnenin hareketini belirler.

3 eksen kontrolü için 3 adet MG996R servo motor ve üzerine MPU6050 sensörü, Arduino ve pilin yerleştirileceği bir tabandan oluşur. Kamerayı titreşimsiz sabit tutmak için kullanılır. 3 eksenli bir gimbal, onu tutan kişi yukarı ve aşağı, sola ve sağa, öne ve arkaya gitse bile kameranın hareketinin sabitlenmesini sağlar. Bu, sapma, eğim ve yuvarlanma stabilizasyonu olarak adlandırdığımız şeydir.

Adım 1: Bileşen Listesi

Bileşen listesi şunlardır:

1)Arduino Uno

2) Arduino Uno'ya güç sağlamak için 8V, 1.5 Amper Pil

3) 7805 Voltaj regülatörü Ic veya buck konveter kullanabilirsiniz

4) MPU 6050

5)3*(MG995 SERVO Motorlar)

6) Jumper Telleri

Diğer Ekipmanlar:

1) Havya

2) Tutkal Tabancası

3) Matkap makinesi

4) Gıda Can

Breadborad kullanmak yerine pozitif ve negatif bus bağlantısı için küçük özel perf kartı kullandım

Adım 2: Montaj

birleştirme
birleştirme
birleştirme
birleştirme

Foamcore, köpük levha veya kağıt yüzlü köpük levha, Servo motoru monte etmek ve ölçekli modeller yapmak için kullanılan hafif ve kolay kesilen bir malzemedir.

Öncelikle köpük levha yardımıyla servo motoru monte etmek için DIY L şeklinde braketler yaptım.

Aşama 3:

resim
resim

Gimbalın montajı oldukça kolaydı. Yaw servosunu, MPU 6050 sensörünü ve ON-OFF anahtarını kurmaya başladım. Cıvata ve somun kullanarak tabana sabitledim

Adım 4: Ardından, Aynı Yöntemi Kullanarak Roll Servoyu Sabitledim. Parçalar, MG995 Servolara Kolaylıkla Sığdırmak İçin Özel Olarak Tasarlanmıştır

Ardından, Aynı Yöntemi Kullanarak Roll Servoyu Sabitledim. Parçalar, MG995 Servolara Kolaylıkla Sığdırmak İçin Özel Olarak Tasarlanmıştır
Ardından, Aynı Yöntemi Kullanarak Roll Servoyu Sabitledim. Parçalar, MG995 Servolara Kolaylıkla Sığdırmak İçin Özel Olarak Tasarlanmıştır

Adım 5: Ardından, Aynı Yöntemi Kullanarak Roll Servoyu Sabitledim. Parçalar, MG995 Servolara Kolaylıkla Sığdırmak İçin Özel Olarak Tasarlanmıştır

Ardından, Aynı Yöntemi Kullanarak Roll Servoyu Sabitledim. Parçalar, MG995 Servolara Kolaylıkla Sığdırmak İçin Özel Olarak Tasarlanmıştır
Ardından, Aynı Yöntemi Kullanarak Roll Servoyu Sabitledim. Parçalar, MG995 Servolara Kolaylıkla Sığdırmak İçin Özel Olarak Tasarlanmıştır

6. Adım: Bağlantılar

Bağlantılar
Bağlantılar

Devre şemasında 8V'u 5V'a çevirmek için buck dönüştürücü veya 7805 Voltaj regülatör IC kullanabilirsiniz. Devre şeması verilen mikrodenetleyici Arduino Nano'dur, Arduino Uno, Arduino Mega da kullanabilirsiniz.

MPU 6050'nin SCL ve SDA pinleri Arduino Analog pin A5 ve A4'e bağlıdır.

Adım 7: 7805 Voltaj Regülatörü IC ile Bağlantı

7805 Voltaj Regülatörü IC ile Bağlantı
7805 Voltaj Regülatörü IC ile Bağlantı

Bu devre şeması 7805 voltaj regülatörü ic bağlantısı içindir, 8v pili Vin'e bağlayın ve 5v çıkış voltajı elde edeceksiniz.

Adım 8: Kodlama

Aşağıdaki kitaplıkları eklemelisiniz:

1)#includeZip dosyasını indirmek için Buraya Tıklayın

2)#includeZip dosyasını indirmek için buraya tıklayın

Zip dosyasını indirdikten sonra, arduino taslağına zip kitaplığı ekleyin

Kod için

/*

DIY Gimbal - Jeff Rowberg'in i2cdevlib kitaplığındaki MPU6050_DMP6 örneğine dayanan MPU6050 Arduino Eğitim Kodu: https://github.com/jrowberg/i2cdevlib */ // I2Cdev ve MPU6050 kitaplık olarak kurulmalıdır, aksi takdirde.cpp/.h dosyaları // her iki sınıf için de projenizin dahil etme yolunda olmalıdır #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" //#include "MPU6050.h" // MotionApps include file / / I2Cdev I2CDEV_ARDUINO_WIRE uygulaması // I2Cdev.h'de kullanılıyorsa Arduino Wire kitaplığı gereklidir #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // sınıf varsayılan I2C adresi 0x68 // belirli I2C adresleri olabilir buraya parametre olarak geçildi // AD0 low = 0x68 (SparkFun koparma ve InvenSense değerlendirme panosu için varsayılan) // AD0 high = 0x69 MPU6050 mpu; //MPU6050 mpu(0x69); // <-- AD0 yüksek için kullanın // 3 servo motoru tanımlayın Servo servo0; Servo servo1; Servo servo2; doğru yüzer; int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #define INTERRUPT_PIN 2 // Arduino Uno'da pin 2'yi kullanın ve çoğu pano bool flashState = false; // MPU kontrolü/durumu değişkenleri bool dmpReady = false; // DMP başlatma başarılıysa true olarak ayarla uint8_t mpuIntStatus; // MPU uint8_t devStatus'tan gelen gerçek kesme durumu baytını tutar; // her cihaz işleminden sonra durumu döndür (0 = başarı, !0 = hata) uint16_t packageSize; // 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[64]; // FIFO depolama arabelleği // yönlendirme/hareket değişkenleri Quaternion q; // [w, x, y, z] dörtlü kap VectorInt16 aa; // [x, y, z] hızlanma sensörü ölçümleri VectorInt16 aaReal; // [x, y, z] yerçekimsiz ivme sensörü ölçümleri VectorInt16 aaWorld; // [x, y, z] dünya çerçevesi ivme sensörü ölçümleri VectorFloat yerçekimi; // [x, y, z] yerçekimi vektörü kayan nokta euler[3]; // [psi, teta, phi] Euler açı kabı kayan nokta ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll konteyner ve yerçekimi vektörü // InvenSense çaydanlık demosu için paket yapısı uint8_t teapotPacket[14] = { '$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\r', '\n' }; // ============================================== ================ // === KESİNTİ ALGILAMA RUTİNİ === // ====================== ========================================= volatile bool mpuInterrupt = false; // MPU kesme pininin yüksek void olup olmadığını gösterir dmpDataReady() { mpuInterrupt = true; } // ============================================= ================= // === İLK KURULUM === // ==================== ========================================= geçersiz kurulum() { // I2C veri yoluna katıl (I2Cdev kitaplığı bunu otomatik olarak yapmaz) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin(); Wire.setClock(400000); // 400kHz I2C saati. Derleme sorunları yaşıyorsanız bu satırı yorumlayın #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, true); #endif // seri iletişimi başlat // (Çaydanlık Demo çıktısı için gerekli olduğu için 115200 seçildi, ancak projenize bağlı olarak // gerçekten size kalmış) Serial.begin(38400); while (!Seri); // Leonardo numaralandırmasını bekleyin, diğerleri hemen devam eder // cihazı başlat //Serial.println(F("I2C cihazları başlatılıyor…")); mpu.initialize(); pinMode(KESME_PIN, GİRİŞ); devStatus = mpu.dmpInitialize(); // burada minimum hassasiyet için ölçeklendirilmiş kendi gyro ofsetlerinizi sağlayın mpu.setXGyroOffset(17); mpu.setYGyroOffset(-69); mpu.setZGyroOffset(27); mpu.setZAccelOffset(1551); // Test çipim için 1688 fabrika varsayılanı // çalıştığından emin ol (eğer öyleyse 0 döndürür) if (devStatus == 0) { // DMP'yi aç, artık hazır // Serial.println(F("Etkinleştiriliyor) DMP…")); mpu.setDMPEnabled(true); AttachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus(); // DMP Ready bayrağımızı, ana loop() işlevinin onu kullanmanın uygun olduğunu bilmesi için ayarlayın //Serial.println(F("DMP hazır! İlk kesme bekleniyor…")); dmpReady = doğru; // sonraki karşılaştırma için beklenen DMP paket boyutunu al packageSize = mpu.dmpGetFIFOPacketSize(); } başka { // HATA! // 1 = ilk bellek yüklemesi başarısız // 2 = DMP yapılandırma güncellemeleri başarısız // (bozulacaksa, kod genellikle 1 olur) // Serial.print(F("DMP Başlatma başarısız (kod ")); //Serial.print(devStatus); //Serial.println(F(")")); } // 3 servo motorun bağlı olduğu pinleri tanımlayın servo0.attach(10); servo1.attach(9); servo2.attach(8); } // ============================================= ================= // === ANA PROGRAM DÖNGÜSÜ === // ==================== =========================================== void loop() { / / programlama başarısız olursa, (!dmpReady) dönerse hiçbir şey yapmaya çalışmayın; // MPU kesintisini veya mevcut ekstra paket(ler)i bekleyin while (!mpuInterrupt && fifoCount < packageSize) { if (mpuInterrupt && fifoCount)

= 1024) {

// temiz bir şekilde devam edebilmemiz için resetle mpu.resetFIFO(); fifoCount = mpu.getFIFOCount(); Serial.println(F("FIFO taşması!")); // aksi takdirde, DMP veri hazır kesmesini kontrol edin (bu sık sık yapılmalıdır) } else if (mpuIntStatus & _BV(MPU6050_INTERRUPT_DMP_INT_BIT)) { // mevcut doğru veri uzunluğunu bekleyin, ÇOK kısa bir süre (fifoCount 1 paket kullanılabilir) olmalıdır / / (bu, bir kesinti beklemeden hemen daha fazlasını okumamızı sağlar) fifoCount -= packageSize; // Yaw, Pitch ve Roll değerlerini alın #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); // Yaw, Pitch, Roll değerleri - Radyan - derece ypr[0] = ypr[0] * 180 / M_PI;ypr[1] = ypr[1] * 180 / M_PI; ypr[2] = ypr[2] * 180 / M_PI; // 300 okumayı atla (kendi kendine kalibrasyon işlemi) if (j <= 300) {doğru = ypr[0]; // Sapma rastgele bir değerde başlar, bu yüzden biz 300 okumadan sonra son değeri yakala j++; } // 300 okumadan sonra else { ypr[0] = ypr[0] - doğru; // Yaw'ı 0 dereceye ayarlayın - mevcut değerden son rastgele Yaw değerini çıkarın 0 derece sapma es // MPU6050 sensörünün değerlerini -90'dan 90'a, servo kontrol için uygun değerlere 0'dan 180'e eşleştirin int servo0Value = map(ypr[0], -90, 90, 0, 180); int servo1Value = map(ypr[1], -90, 90, 0, 180); int servo2Value = map(ypr[2], -90, 90, 180, 0); // MPU6050 yönlendirmesine göre servoları kontrol edin servo0.write(servo0Value); servo1.write(servo1Value); servo2.write(servo2Value); } #endif } }

Son olarak write fonksiyonunu kullanarak bu değerleri servolara kontrol sinyali olarak gönderiyoruz. Tabii ki, sadece X ve Y ekseni için stabilizasyon istiyorsanız Yaw servoyu devre dışı bırakabilir ve bu platformu kamera gimbal olarak kullanabilirsiniz

Adım 9: Tüm Bileşenler Bağlandığında, Bu Resme Benzer Görünüyor

Bütün Bileşenler Bağlandığında Bu Resme Benzer Görünüyor
Bütün Bileşenler Bağlandığında Bu Resme Benzer Görünüyor

Adım 10: Şimdi Yiyecek Kutusunun İçine Tüm Temel Malzemeyi Yerleştirin

Şimdi Yiyecek Kutusunun İçine Tüm Temel Malzemeyi Yerleştirin
Şimdi Yiyecek Kutusunun İçine Tüm Temel Malzemeyi Yerleştirin

Adım 11: Tüm Teller ve Bileşenler Bir Gıda Kutusunun İçine Yerleştirildiğinde, Köpük Levhanın Tabanına Tutkal Tabancası Uygulanır

Tüm Teller ve Bileşenler Bir Gıda Kutusunun İçine Yerleştirildiğinde, Köpük Levhanın Tabanına Tutkal Tabancası Uygulanır
Tüm Teller ve Bileşenler Bir Gıda Kutusunun İçine Yerleştirildiğinde, Köpük Levhanın Tabanına Tutkal Tabancası Uygulanır

Adım 12: Sonuç

Lütfen bunun iyi bir kamera gimbalinden çok uzak olduğuna dikkat edin. Bu servolar böyle bir amaç için tasarlanmadığından hareketler düzgün değildir. Gerçek kamera yalpaları, düzgün hareketler elde etmek için özel bir BLDC motor tipi kullanır. Bu nedenle, bu projeyi sadece eğitim amaçlı düşünün.

Bu ders için hepsi bu kadar, umarım beğenmişsinizdir ve yeni bir şeyler öğrenmişsinizdir. Aşağıdaki yorumlar bölümünde herhangi bir soru sormaktan çekinmeyin ve proje koleksiyonlarımı kontrol etmeyi unutmayın.

Önerilen: