Isi kandungan:

Gimbal Kawalan Gerak: 12 Langkah
Gimbal Kawalan Gerak: 12 Langkah

Video: Gimbal Kawalan Gerak: 12 Langkah

Video: Gimbal Kawalan Gerak: 12 Langkah
Video: Wow Stabil banget kaya pake gimbal! Action Mode iPhone 14 Pro 2024, November
Anonim
Image
Image

Halo Semua, Nama saya Harji Nagi. Saya kini merupakan pelajar tahun kedua yang mempelajari kejuruteraan elektronik dan komunikasi dari Institut Teknologi Pranveer Singh, Kanpur (UP). Saya berminat dengan robotik, arduino, Kecerdasan Buatan dan elektronik Analog.

Kata "gimbal" didefinisikan sebagai sokongan berpusing yang memungkinkan putaran objek apa pun dalam satu paksi. Oleh itu, gimbal tiga paksi membolehkan objek yang dipasang di gimbal bebas dari pergerakan orang yang memegang gimbal. Gimbal menentukan pergerakan objek, bukan yang membawanya.

Ini terdiri dari 3 motor servo MG996R untuk kawalan 3-sumbu, dan pangkalan di mana sensor MPU6050, Arduino dan bateri akan ditempatkan. Ia digunakan untuk memastikan kamera stabil tanpa getaran. Gimbal 3 paksi memastikan bahawa gerakan kamera stabil walaupun yang memegangnya naik dan turun, kiri dan kanan, depan dan belakang. Inilah yang kita sebut sebagai penstabilan yaw, pitch, dan roll.

Langkah 1: Senarai Komponen

Senarai komponen adalah:

1) Arduino Uno

2) Bateri 8V, 1.5 Amp untuk menghidupkan Arduino Uno

3) 7805 Voltage regulator Ic atau anda boleh menggunakan buck conveter

4) MPU 6050

5) 3 * (MG995 SERVO Motors)

6) Wayar Pelompat

Peralatan lain:

1) Besi Pematerian

2) Lem Gun

3) Mesin gerudi

4) Makanan Boleh

Daripada menggunakan breadborad, saya menggunakan papan perfom kecil untuk sambungan bas positif dan negatif

Langkah 2: Berkumpul

Berkumpul
Berkumpul
Berkumpul
Berkumpul

Foamcore, papan busa, atau papan busa berwajah kertas adalah bahan ringan dan mudah dipotong yang digunakan untuk memasang motor Servo dan untuk membuat model skala.

Mula-mula saya membuat kurungan bentuk L DIY untuk memasang motor servo dengan bantuan papan busa.

Langkah 3:

Imej
Imej

Pemasangan gimbal agak mudah. Saya bermula dengan memasang servo Yaw, sensor MPU 6050 dan suis ON-OFF. Dengan menggunakan bolt dan mur, saya memasangkannya ke pangkal

Langkah 4: Seterusnya, Menggunakan Kaedah yang Sama Saya Mengamankan Roll Servo. Bahagiannya Direka Khusus untuk Memadankan Servo MG995 dengan Mudah

Seterusnya, Dengan Menggunakan Kaedah yang Sama, Saya Menjamin Roll Servo. Bahagiannya Direka Khusus untuk Memadankan Servo MG995 dengan Mudah
Seterusnya, Dengan Menggunakan Kaedah yang Sama, Saya Menjamin Roll Servo. Bahagiannya Direka Khusus untuk Memadankan Servo MG995 dengan Mudah

Langkah 5: Seterusnya, Menggunakan Kaedah yang Sama Saya Mengamankan Roll Servo. Bahagiannya Direka Khusus untuk Memadankan Servo MG995 dengan Mudah

Seterusnya, Dengan Menggunakan Kaedah yang Sama, Saya Menjamin Roll Servo. Bahagiannya Direka Khusus untuk Memadankan Servo MG995 dengan Mudah
Seterusnya, Dengan Menggunakan Kaedah yang Sama, Saya Menjamin Roll Servo. Bahagiannya Direka Khusus untuk Memadankan Servo MG995 dengan Mudah

Langkah 6: Sambungan

Sambungan
Sambungan

Dalam rajah litar, anda boleh menggunakan penukar buck atau IC pengatur voltan 7805 untuk menukar 8V hingga 5 V. Pengawal mikro yang diberi gambarajah litar ialah Arduino Nano, anda juga boleh menggunakan Arduino Uno, Arduino Mega.

Pin SCL dan SDA MPU 6050 disambungkan ke pin Analog Arduino A5 dan A4. (Pin SCL dan SDA mungkin berbeza-beza jadi periksa lembar data untuk pin SCl dan SDA untuk mikrokontroler lain)

Langkah 7: Sambungan Dengan IC Pengatur Voltan 7805

Sambungan Dengan IC Pengatur Voltan 7805
Sambungan Dengan IC Pengatur Voltan 7805

Gambarajah litar ini adalah untuk sambungan ic pengatur voltan 7805, sambungkan bateri 8v di Vin dan anda akan mendapat voltan keluaran 5v.

Langkah 8: Pengekodan

Anda mesti memasukkan perpustakaan berikut:

1) #includeClick Hereto memuat turun fail zip

2) #includeKlik Di Sini untuk memuat turun fail zip

Setelah memuat turun fail zip, tambahkan perpustakaan zip dalam lakaran arduino

Untuk Kod

/*

DIY Gimbal - MPU6050 Arduino Code Tutorial berdasarkan contoh MPU6050_DMP6 dari perpustakaan i2cdevlib oleh Jeff Rowberg: https://github.com/jrowberg/i2cdevlib * / // I2Cdev dan MPU6050 mesti dipasang sebagai perpustakaan, atau sebaliknya.cpp / fail.h // untuk kedua-dua kelas mesti ada di jalan sertakan projek anda #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // # include "MPU6050.h" // tidak perlu jika menggunakan MotionApps include file / / Arduino Wire library diperlukan jika pelaksanaan I2Cdev I2CDEV_ARDUINO_WIRE // digunakan dalam I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // alamat lalai kelas I2C mungkin 0x68 // khusus lulus sebagai parameter di sini // AD0 rendah = 0x68 (lalai untuk pelarian SparkFun dan papan penilaian InvenSense) // AD0 tinggi = 0x69 MPU6050 mpu; // MPU6050 mpu (0x69); // <- gunakan untuk AD0 tinggi // Tentukan 3 servo motor Servo servo0; Servo servo1; Servo servo2; apungan betul; int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #define INTERRUPT_PIN 2 // gunakan pin 2 pada Arduino Uno & kebanyakan papan bool blinkState = false; // MPU kawalan / status vars bool dmpReady = false; // tetapkan benar sekiranya DMP init berjaya uint8_t mpuIntStatus; // memegang byte status gangguan sebenar dari MPU uint8_t devStatus; // kembali status selepas setiap operasi peranti (0 = berjaya,! 0 = ralat) uint16_t packetSize; // ukuran paket DMP yang dijangkakan (lalai adalah 42 bait) uint16_t fifoCount; // kiraan semua bait yang ada di FIFO uint8_t fifoBuffer [64]; // Penyangga simpanan FIFO // orientasi / gerakan vars Quaternion q; // [w, x, y, z] bekas kuarter VectorInt16 aa; // [x, y, z] pengukuran sensor accel VectorInt16 aaReal; // [x, y, z] pengukuran sensor accel bebas graviti VectorInt16 aaWorld; // [x, y, z] ukuran sensor accel bingkai dunia pengukuran graviti VectorFloat; // [x, y, z] vektor pengapung vektor graviti [3]; // [psi, theta, phi] Pelampung kontena sudut Euler ypr [3]; // [yaw, pitch, roll] yaw / pitch / roll container and gravity vektor // struktur paket untuk demo teko InvenSense uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // ================================================ ================ // === ROUTINE PENETAPAN GANGGUAN === // ===================== =========================================== mpu bool yang tidak menentuInterrupt = false; // menunjukkan sama ada pin interupsi MPU telah hilang tinggi dmpDataReady () {mpuInterrupt = true; } // =============================================== ================= // === PENYEDIAAN AWAL === // ===================== =========================================== batal penyediaan () {// sertai bas I2C (perpustakaan I2Cdev tidak melakukan ini secara automatik) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // Jam 400kHz I2C. Komen baris ini jika menghadapi kesukaran penyusunan #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, true); #endif // inisialisasi komunikasi bersiri // (115200 dipilih kerana diperlukan untuk output Demo Teapot, tetapi // benar-benar terserah kepada anda bergantung pada projek anda) Serial.begin (38400); sementara (! bersiri); // tunggu penghitungan Leonardo, yang lain terus serta-merta // memulakan peranti //Serial.println(F("Memperkenalkan peranti I2C… ")); mpu.initialize (); pinMode (INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize (); // sediakan offset gyro anda sendiri di sini, disesuaikan dengan kepekaan min mpu.setXGyroOffset (17); mpu.setYGyroOffset (-69); mpu.setZGyroOffset (27); mpu.setZAccelOffset (1551); // 1688 lalai kilang untuk cip ujian saya // pastikan ia berfungsi (mengembalikan 0 jika ya) jika (devStatus == 0) {// hidupkan DMP, sekarang sudah siap // Serial.println (F ("Mengaktifkan DMP… ")); mpu.setDMPEnabled (benar); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // tetapkan bendera Sedia DMP kami supaya fungsi gelung utama () tahu tidak mengapa menggunakannya //Serial.println(F("DMP siap! Menunggu gangguan pertama… ")); dmpReady = benar; // dapatkan ukuran paket DMP yang diharapkan untuk perbandingan paket kemudianSize = mpu.dmpGetFIFOPacketSize (); } lain {// KESALAHAN! // 1 = beban memori awal gagal // 2 = Kemas kini konfigurasi DMP gagal // (jika akan rosak, biasanya kodnya akan 1) // Serial.print (F ("Permulaan DMP gagal (kod")); //Serial.print(devStatus); //Serial.println (F (")")); } // Tentukan pin yang disambungkan oleh 3 servo motor servo0.attach (10); servo1.attach (9); servo2.attach (8); } // =============================================== ================= // === LOOP PROGRAM UTAMA === // ==================== ============================================ gelung kosong () {/ / jika pengaturcaraan gagal, jangan cuba melakukan apa-apa sekiranya (! dmpReady) kembali; // tunggu MPU mengganggu atau paket tambahan tersedia semasa (! mpuInterrupt && fifoCount <packetSize) {if (mpuInterrupt && fifoCount

= 1024) {

// tetapkan semula supaya kita dapat meneruskan dengan bersih mpu.resetFIFO (); fifoCount = mpu.getFIFOCount (); Serial.println (F ("Limpahan FIFO!")); // jika tidak, periksa apakah data DMP siap terganggu (ini mesti kerap berlaku)} jika (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// tunggu panjang data yang betul, harus menunggu SANGAT pendek sementara (paket fifoCount 1 tersedia / / (ini membolehkan kita membaca lebih lanjut tanpa menunggu gangguan) fifoCount - = packetSize; // Dapatkan nilai Yaw, Pitch and Roll #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravity, & q);.dmpGetYawPitchRoll (ypr, & q, & gravity); // Nilai Yaw, Pitch, Roll - Radian hingga darjah ypr [0] = ypr [0] * 180 / M_PI; ypr [1] = ypr [1] * 180 / M_PI; ypr [2] = ypr [2] * 180 / M_PI; // Langkau bacaan 300 (proses penentukuran diri) jika (j <= 300) {betul = ypr [0]; // Yaw bermula pada nilai rawak, jadi kami menangkap nilai terakhir selepas 300 bacaan j ++;} // Selepas 300 bacaan lain {ypr [0] = ypr [0] - betul; // Tetapkan Yaw ke 0 deg - tolak nilai Yaw rawak terakhir dari nilai arus untuk membuat Yaw 0 degre es // Petakan nilai sensor MPU6050 dari -90 hingga 90 ke nilai yang sesuai untuk kawalan servo dari 0 hingga 180 int servo0Value = peta (ypr [0], -90, 90, 0, 180); int servo1Value = peta (ypr [1], -90, 90, 0, 180); int servo2Value = peta (ypr [2], -90, 90, 180, 0); // Kawal servo mengikut orientasi MPU6050 servo0.write (servo0Value); servo1.write (servo1Value); servo2.write (servo2Value); } #endif}}

Akhirnya dengan menggunakan fungsi tulis, kami menghantar nilai-nilai ini ke servo sebagai isyarat kawalan. Sudah tentu, anda boleh mematikan servo Yaw jika anda mahukan penstabilan hanya untuk paksi X dan Y, dan menggunakan platform ini sebagai gimbal kamera

Langkah 9: Apabila Semua Komponen Dihubungkan, Rupa-rupanya Mirip dengan Gambar Ini

Apabila Semua Komponen Dihubungkan, Rupa-rupanya Mirip dengan Gambar Ini
Apabila Semua Komponen Dihubungkan, Rupa-rupanya Mirip dengan Gambar Ini

Langkah 10: Sekarang Masukkan Semua Bahan Asas di dalam Tong Makanan

Sekarang Masukkan Semua Bahan Asas Di Dalam Kotak Makanan
Sekarang Masukkan Semua Bahan Asas Di Dalam Kotak Makanan

Langkah 11: Apabila Semua Wayar dan Komponen Diletakkan Di Dalam Makanan Boleh Dilekatkan Gam Lem di Papan Buih

Apabila Semua Wayar dan Komponen Diletakkan Di Dalam Makanan Boleh Dilekatkan Gam Pekat di Papan Buih
Apabila Semua Wayar dan Komponen Diletakkan Di Dalam Makanan Boleh Dilekatkan Gam Pekat di Papan Buih

Langkah 12: Kesimpulannya

Harap maklum ini jauh dari gimbal kamera yang baik. Pergerakan tidak lancar kerana servo ini tidak dimaksudkan untuk tujuan tersebut. Gimbal kamera sebenar menggunakan motor BLDC jenis khas untuk mendapatkan pergerakan yang lancar. Jadi, pertimbangkan projek ini hanya untuk tujuan pendidikan.

Itu sahaja untuk tutorial ini, saya harap anda menikmatinya dan mempelajari sesuatu yang baru. Jangan ragu untuk mengemukakan sebarang pertanyaan di bahagian komen di bawah dan jangan lupa untuk melihat koleksi projek saya

Disyorkan: