สารบัญ:

การควบคุมการเคลื่อนไหว Gimbal: 12 ขั้นตอน
การควบคุมการเคลื่อนไหว Gimbal: 12 ขั้นตอน

วีดีโอ: การควบคุมการเคลื่อนไหว Gimbal: 12 ขั้นตอน

วีดีโอ: การควบคุมการเคลื่อนไหว Gimbal: 12 ขั้นตอน
วีดีโอ: DJI RS 3 Gimbal Moves - 5 เทคนิคการเคลื่อนที่กิมบอล Cinematic Travel Video 2024, กรกฎาคม
Anonim
Image
Image

สวัสดีทุกคน ฉันชื่อ Harji Nagi ปัจจุบันฉันเป็นนักเรียนปีที่สองที่กำลังศึกษาด้านวิศวกรรมอิเล็กทรอนิกส์และการสื่อสารจากสถาบันเทคโนโลยี Pranveer Singh กานปุระ (UP) ฉันมีความสนใจในด้านวิทยาการหุ่นยนต์ Arduino ปัญญาประดิษฐ์และอุปกรณ์อิเล็กทรอนิกส์แบบแอนะล็อก

คำว่า "gimbal" ถูกกำหนดให้เป็นฐานรองรับที่หมุนได้ของวัตถุใดๆ ในแกนเดียว ดังนั้น gimbal แบบสามแกนจึงยอมให้วัตถุใดๆ ที่ติดตั้งบน gimbal เป็นอิสระจากการเคลื่อนไหวของสิ่งที่ถือ gimbal gimbal กำหนดการเคลื่อนที่ของวัตถุ ไม่ใช่ตัวที่ถือ

ประกอบด้วยเซอร์โวมอเตอร์ MG996R 3 ตัวสำหรับการควบคุมแบบ 3 แกน และฐานสำหรับวางเซ็นเซอร์ MPU6050, Arduino และแบตเตอรี่ ซึ่งใช้เพื่อให้กล้องมีความเสถียรโดยไม่มีการสั่นสะเทือน กิมบอล 3 แกนช่วยให้การเคลื่อนไหวของกล้องมีความเสถียร แม้ว่ากล้องที่ถือกล้องจะขึ้นและลง ซ้ายและขวา ด้านหน้าและด้านหลัง นี่คือสิ่งที่เราเรียกว่า yaw, pitch และ roll stabilization

ขั้นตอนที่ 1: รายการส่วนประกอบ

รายการส่วนประกอบคือ:

1)Arduino Uno

2) 8V, 1.5 แอมป์ แบตเตอรี่ สำหรับจ่ายไฟ Arduino Uno

3) 7805 ตัวควบคุมแรงดันไฟฟ้า Ic หรือคุณสามารถใช้ตัวแปลงบั๊ก

4) MPU 6050

5)3*(MG995 เซอร์โวมอเตอร์)

6)สายจัมเปอร์

อุปกรณ์อื่นๆ:

1) หัวแร้ง

2)ปืนกาว

3)เครื่องเจาะ

4) อาหารกระป๋อง

แทนที่จะใช้ breadborad ฉันใช้บอร์ด coustom perf ขนาดเล็กสำหรับการเชื่อมต่อบัสบวกและลบ

ขั้นตอนที่ 2: การประกอบ

การประกอบ
การประกอบ
การประกอบ
การประกอบ

Foamcore โฟมบอร์ด หรือกระดาษโฟมบอร์ดเป็นวัสดุที่มีน้ำหนักเบาและตัดง่าย ใช้สำหรับติดตั้งเซอร์โวมอเตอร์และสำหรับทำแบบจำลองมาตราส่วน

ประการแรก ฉันทำโครงยึดรูปตัว L DIY เพื่อติดตั้งเซอร์โวมอเตอร์โดยใช้แผ่นโฟม

ขั้นตอนที่ 3:

ภาพ
ภาพ

การประกอบ gimbal นั้นค่อนข้างง่าย ฉันเริ่มต้นด้วยการติดตั้งเซอร์โว Yaw, เซ็นเซอร์ MPU 6050 และสวิตช์เปิด-ปิด ใช้สลักเกลียวและน็อตยึดเข้ากับฐาน

ขั้นตอนที่ 4: ถัดไปโดยใช้วิธีการเดียวกันกับที่ฉันรักษาความปลอดภัยของโรลเซอร์โว ชิ้นส่วนได้รับการออกแบบมาโดยเฉพาะเพื่อให้พอดีกับเซอร์โว MG995 ได้อย่างง่ายดาย

ต่อไปโดยใช้วิธีเดียวกันฉันยึดโรลเซอร์โว ชิ้นส่วนได้รับการออกแบบมาโดยเฉพาะเพื่อให้พอดีกับเซอร์โว MG995 ได้อย่างง่ายดาย
ต่อไปโดยใช้วิธีเดียวกันฉันยึดโรลเซอร์โว ชิ้นส่วนได้รับการออกแบบมาโดยเฉพาะเพื่อให้พอดีกับเซอร์โว MG995 ได้อย่างง่ายดาย

ขั้นตอนที่ 5: ถัดไปโดยใช้วิธีการเดียวกันกับที่ฉันรักษาความปลอดภัยของโรลเซอร์โว ชิ้นส่วนได้รับการออกแบบมาโดยเฉพาะเพื่อให้พอดีกับเซอร์โว MG995 ได้อย่างง่ายดาย

ต่อไปโดยใช้วิธีเดียวกันฉันยึดโรลเซอร์โว ชิ้นส่วนได้รับการออกแบบมาโดยเฉพาะเพื่อให้พอดีกับเซอร์โว MG995 ได้อย่างง่ายดาย
ต่อไปโดยใช้วิธีเดียวกันฉันยึดโรลเซอร์โว ชิ้นส่วนได้รับการออกแบบมาโดยเฉพาะเพื่อให้พอดีกับเซอร์โว MG995 ได้อย่างง่ายดาย

ขั้นตอนที่ 6: การเชื่อมต่อ

การเชื่อมต่อ
การเชื่อมต่อ

ในแผนภาพวงจร คุณสามารถใช้ตัวแปลงบั๊กหรือ 7805 ตัวควบคุมแรงดันไฟฟ้า IC เพื่อแปลง 8V เป็น 5 V ไมโครคอนโทรลเลอร์ที่ได้รับจากแผนภาพวงจรคือ Arduino Nano คุณยังสามารถใช้ Arduino Uno, Arduino Mega ได้

พิน SCL และ SDA ของ MPU 6050 เชื่อมต่อกับ Arduino Analog pin A5 และ A4 (พิน SCL และ SDA อาจแตกต่างกันไป ดังนั้นโปรดตรวจสอบแผ่นข้อมูลสำหรับพิน SCl และ SDA สำหรับไมโครคอนโทรลเลอร์อื่นๆ)

ขั้นตอนที่ 7: การเชื่อมต่อกับตัวควบคุมแรงดันไฟฟ้า 7805 IC

การเชื่อมต่อกับตัวควบคุมแรงดันไฟฟ้า 7805 IC
การเชื่อมต่อกับตัวควบคุมแรงดันไฟฟ้า 7805 IC

แผนภาพวงจรนี้ใช้สำหรับเชื่อมต่อไอซีควบคุมแรงดันไฟฟ้า 7805 ต่อแบตเตอรี่ 8v ที่ Vin แล้วคุณจะได้แรงดันเอาต์พุต 5v

ขั้นตอนที่ 8: การเข้ารหัส

คุณต้องรวมไลบรารีต่อไปนี้:

1)#includeคลิกที่นี่เพื่อดาวน์โหลดไฟล์ zip

2)#includeคลิกที่นี่เพื่อดาวน์โหลดไฟล์ zip

หลังจากดาวน์โหลดไฟล์ zip แล้ว ให้เพิ่มไลบรารี zip ใน arduino sketch

สำหรับรหัส

/*

DIY Gimbal - MPU6050 Arduino Tutorial Code ตามตัวอย่าง MPU6050_DMP6 จากไลบรารี i2cdevlib โดย Jeff Rowberg: https://github.com/jrowberg/i2cdevlib */ // ต้องติดตั้ง I2Cdev และ MPU6050 เป็นไลบรารี มิฉะนั้นจะต้องติดตั้ง.cpp/.h ไฟล์ // สำหรับทั้งสองคลาสต้องอยู่ในเส้นทางรวมของโครงการของคุณ #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" //#include "MPU6050.h" // ไม่จำเป็นหากใช้ MotionApps รวมไฟล์ / / จำเป็นต้องใช้ไลบรารี Arduino Wire หากใช้งาน I2Cdev I2CDEV_ARDUINO_WIRE // ใช้ใน I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // ที่อยู่ I2C เริ่มต้นของคลาสคือ 0x68 // ที่อยู่ I2C เฉพาะอาจเป็น ส่งผ่านเป็นพารามิเตอร์ที่นี่ // AD0 ต่ำ = 0x68 (ค่าเริ่มต้นสำหรับการฝ่าวงล้อม SparkFun และกระดานประเมินผล InvenSense) // AD0 สูง = 0x69 MPU6050 mpu; //MPU6050 mpu(0x69); // <-- ใช้สำหรับ AD0 สูง // กำหนดเซอร์โวมอเตอร์ 3 ตัว Servo servo0; เซอร์โวเซอร์โว1; เซอร์โวเซอร์โว2; ลอยถูกต้อง; int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #define INTERRUPT_PIN 2 // ใช้พิน 2 บน Arduino Uno และบอร์ดส่วนใหญ่ bool blinkState = false; // การควบคุม/สถานะ MPU vars bool dmpReady = false; // ตั้งค่าจริงหาก DMP init สำเร็จ uint8_t mpuIntStatus; // เก็บไบต์สถานะขัดจังหวะจริงจาก MPU uint8_t devStatus; // ส่งคืนสถานะหลังจากการทำงานของอุปกรณ์แต่ละเครื่อง (0 = สำเร็จ, !0 = ข้อผิดพลาด) uint16_t packetSize; // ขนาดแพ็กเก็ต DMP ที่คาดไว้ (ค่าเริ่มต้นคือ 42 ไบต์) uint16_t fifoCount; // นับไบต์ทั้งหมดที่อยู่ใน FIFO uint8_t fifoBuffer[64]; // บัฟเฟอร์การจัดเก็บ FIFO // การวางแนว/การเคลื่อนไหว vars Quaternion q; // [w, x, y, z] คอนเทนเนอร์ quaternion VectorInt16 aa; // [x, y, z] การวัดเซ็นเซอร์เร่ง VectorInt16 aaReal; // [x, y, z] การวัดเซ็นเซอร์คันเร่งแบบไร้แรงโน้มถ่วง VectorInt16 aaWorld; // [x, y, z] การวัดเซ็นเซอร์การเร่งความเร็วของ world-frame แรงโน้มถ่วง VectorFloat; // [x, y, z] แรงโน้มถ่วงเวกเตอร์โฟลตออยเลอร์[3]; // [psi, theta, phi] คอนเทนเนอร์มุมออยเลอร์ float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container และเวกเตอร์แรงโน้มถ่วง // โครงสร้างแพ็คเก็ตสำหรับการสาธิตกาน้ำชา InvenSense uint8_t teapotPacket [14] = { '$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\r', '\n' }; // =============================================== ================ // === รูทีนการตรวจจับการขัดจังหวะ === // ====================== =========================================== บูลระเหย mpuInterrupt = false; // ระบุว่าพินขัดจังหวะ MPU นั้นเป็นโมฆะสูงหรือไม่ dmpDataReady () { mpuInterrupt = true; } // ============================================== ================= // === การตั้งค่าเริ่มต้น === // ======================= ========================================== การตั้งค่าเป็นโมฆะ () { // เข้าร่วมบัส I2C (ไลบรารี I2Cdev ไม่ทำโดยอัตโนมัติ) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin(); Wire.setClock(400000); // นาฬิกา 400kHz I2C แสดงความคิดเห็นบรรทัดนี้หากมีปัญหาในการรวบรวม #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, true); #endif // เริ่มต้นการสื่อสารแบบอนุกรม // (เลือก 115200 เนื่องจากจำเป็นสำหรับเอาต์พุต Teapot Demo แต่ขึ้นอยู่กับคุณจริงๆ ขึ้นอยู่กับโปรเจ็กต์ของคุณ) Serial.begin(38400); ในขณะที่ (!ซีเรียล); // รอการแจงนับของ Leonardo คนอื่นทำต่อทันที // เริ่มต้นอุปกรณ์ //Serial.println(F("กำลังเริ่มต้นอุปกรณ์ I2C…")); mpu.initialize(); โหมดพิน (INTERRUPT_PIN, INPUT); devStatus = mpu.dmp เริ่มต้น (); // จัดหาไจโรออฟเซ็ตของคุณเองที่นี่ ปรับขนาดสำหรับความไวขั้นต่ำ mpu.setXGyroOffset(17); mpu.setYGyroOffset(-69); mpu.setZGyroOffset(27); mpu.setZAccelOffset(1551); // 1688 ค่าเริ่มต้นจากโรงงานสำหรับชิปทดสอบของฉัน // ตรวจสอบให้แน่ใจว่ามันใช้งานได้ (คืนค่า 0 ถ้าใช่) ถ้า (devStatus == 0) { // เปิด DMP ตอนนี้ที่พร้อมแล้ว // Serial.println(F("Enabling) ดีเอ็มพี…")); mpu.setDMPEnabled(จริง); AttachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // ตั้งค่าสถานะ DMP Ready ของเราเพื่อให้ฟังก์ชัน main loop() รู้ว่ามันใช้ได้ //Serial.println(F("DMP ready! Waiting for first interrupt…")); dmpReady = จริง; // รับขนาดแพ็คเก็ต DMP ที่คาดไว้สำหรับการเปรียบเทียบในภายหลัง packetSize = mpu.dmpGetFIFOPacketSize(); } อื่น ๆ { // ข้อผิดพลาด! // 1 = การโหลดหน่วยความจำเริ่มต้นล้มเหลว // 2 = การอัพเดตการกำหนดค่า DMP ล้มเหลว // (หากมันจะพัง โดยปกติรหัสจะเป็น 1) // Serial.print(F("DMP Initialization failed (code ")); //Serial.print(devStatus); //Serial.println(F(")")); //Serial.print(devStatus); //Serial.println(F(")")); } // กำหนดพินที่เชื่อมต่อเซอร์โวมอเตอร์ 3 ตัว servo0.attach(10); servo1.attach(9); servo2.attach(8); } // ============================================== ================= // === โปรแกรมหลัก LOOP === // ===================== =========================================== วงเป็นโมฆะ () { / / หากการเขียนโปรแกรมล้มเหลว อย่าพยายามทำอะไรหาก (!dmpReady) กลับมา; // รอการขัดจังหวะของ MPU หรือแพ็กเก็ตพิเศษในขณะที่ (!mpuInterrupt && fifoCount < packetSize) { if (mpuInterrupt && fifoCount

= 1024) {

// รีเซ็ตเพื่อให้เราสามารถดำเนินการต่อได้อย่างสมบูรณ์ mpu.resetFIFO(); fifoCount = mpu.getFIFOCount(); Serial.println(F("FIFO ล้น!")); // มิฉะนั้น ให้ตรวจสอบข้อมูล DMP พร้อมอินเตอร์รัปต์ (ซึ่งควรเกิดขึ้นบ่อยๆ) } อื่นหาก (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) { // รอความยาวข้อมูลที่ถูกต้อง ควรรอสักครู่ (fifoCount 1 แพ็กเก็ตที่พร้อมใช้งาน / / (สิ่งนี้ทำให้เราอ่านเพิ่มเติมได้ทันทีโดยไม่ต้องรอการขัดจังหวะ) fifoCount -= packetSize; // รับค่า Yaw, Pitch และ Roll #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); // Yaw, Pitch, Roll values - เรเดียนเป็นองศา ypr[0] = ypr[0] * 180 / M_PI; ypr[1] = ypr[1] * 180 / M_PI; ypr[2] = ypr[2] * 180 / M_PI; // ข้าม 300 การอ่าน (กระบวนการสอบเทียบด้วยตนเอง) if (j <= 300) { correct = ypr[0]; // Yaw เริ่มต้นที่ค่าสุ่มดังนั้นเราจึง จับค่าสุดท้ายหลังจากอ่าน 300 ครั้ง j++; } // หลังจากอ่าน 300 ครั้ง อย่างอื่น { ypr[0] = ypr[0] - ถูกต้อง; // ตั้งค่า Yaw เป็น 0 องศา - ลบค่า Yaw แบบสุ่มสุดท้ายออกจากค่าปัจจุบันเพื่อให้ หันเห 0 องศา es // แมปค่าของเซ็นเซอร์ MPU6050 จาก -90 ถึง 90 เป็นค่าที่เหมาะสมสำหรับการควบคุมเซอร์โวตั้งแต่ 0 ถึง 180 int servo0Value = map(ypr[0], -90, 90, 0, 180); int servo1Value = แผนที่ (ypr [1], -90, 90, 0, 180); int servo2Value = แผนที่ (ypr [2], -90, 90, 180, 0); // ควบคุมเซอร์โวตามทิศทางของ MPU6050 servo0.write (servo0Value); servo1.write(servo1Value); servo2.write (servo2Value); } #endif } }

สุดท้ายเมื่อใช้ฟังก์ชันเขียน เราจะส่งค่าเหล่านี้ไปยังเซอร์โวเป็นสัญญาณควบคุม แน่นอน คุณสามารถปิดใช้งานเซอร์โว Yaw ได้หากต้องการเพียงแค่ความเสถียรสำหรับแกน X และ Y และใช้แพลตฟอร์มนี้เป็นกิมบอลของกล้อง

ขั้นตอนที่ 9: เมื่อส่วนประกอบทั้งหมดเชื่อมต่อกัน จะดูเหมือนภาพนี้

เมื่อส่วนประกอบทั้งหมดเชื่อมต่อกัน จะดูเหมือนภาพนี้
เมื่อส่วนประกอบทั้งหมดเชื่อมต่อกัน จะดูเหมือนภาพนี้

ขั้นตอนที่ 10: ตอนนี้ใส่สิ่งพื้นฐานทั้งหมดภายในกระป๋องอาหาร

ตอนนี้ใส่สิ่งพื้นฐานทั้งหมดภายในกระป๋องอาหาร
ตอนนี้ใส่สิ่งพื้นฐานทั้งหมดภายในกระป๋องอาหาร

ขั้นตอนที่ 11: เมื่อวางสายไฟและส่วนประกอบทั้งหมดไว้ในกระป๋องอาหารแล้วจึงใช้ปืนกาวที่ฐานของแผ่นโฟม

เมื่อวางสายไฟและส่วนประกอบทั้งหมดไว้ในกระป๋องอาหารแล้ว ให้ใช้ปืนกาวที่ฐานของแผ่นโฟม
เมื่อวางสายไฟและส่วนประกอบทั้งหมดไว้ในกระป๋องอาหารแล้ว ให้ใช้ปืนกาวที่ฐานของแผ่นโฟม

ขั้นตอนที่ 12: บทสรุป

โปรดทราบว่าสิ่งนี้ห่างไกลจาก gimbal ของกล้องที่ดี การเคลื่อนไหวไม่ราบรื่นเพราะเซอร์โวเหล่านี้ไม่ได้มีไว้สำหรับวัตถุประสงค์ดังกล่าว กิมบอลของกล้องจริงใช้มอเตอร์ BLDC ชนิดพิเศษเพื่อให้การเคลื่อนไหวราบรื่น ดังนั้นให้พิจารณาโครงการนี้เพื่อการศึกษาเท่านั้น

นั่นคือทั้งหมดสำหรับบทช่วยสอนนี้ ฉันหวังว่าคุณจะสนุกกับมันและเรียนรู้สิ่งใหม่ อย่าลังเลที่จะถามคำถามใด ๆ ในส่วนความคิดเห็นด้านล่างและอย่าลืมตรวจสอบคอลเลกชันของโครงการ

แนะนำ: