สารบัญ:
- ขั้นตอนที่ 1: รายการส่วนประกอบ
- ขั้นตอนที่ 2: การประกอบ
- ขั้นตอนที่ 3:
- ขั้นตอนที่ 4: ถัดไปโดยใช้วิธีการเดียวกันกับที่ฉันรักษาความปลอดภัยของโรลเซอร์โว ชิ้นส่วนได้รับการออกแบบมาโดยเฉพาะเพื่อให้พอดีกับเซอร์โว MG995 ได้อย่างง่ายดาย
- ขั้นตอนที่ 5: ถัดไปโดยใช้วิธีการเดียวกันกับที่ฉันรักษาความปลอดภัยของโรลเซอร์โว ชิ้นส่วนได้รับการออกแบบมาโดยเฉพาะเพื่อให้พอดีกับเซอร์โว MG995 ได้อย่างง่ายดาย
- ขั้นตอนที่ 6: การเชื่อมต่อ
- ขั้นตอนที่ 7: การเชื่อมต่อกับตัวควบคุมแรงดันไฟฟ้า 7805 IC
- ขั้นตอนที่ 8: การเข้ารหัส
- ขั้นตอนที่ 9: เมื่อส่วนประกอบทั้งหมดเชื่อมต่อกัน จะดูเหมือนภาพนี้
- ขั้นตอนที่ 10: ตอนนี้ใส่สิ่งพื้นฐานทั้งหมดภายในกระป๋องอาหาร
- ขั้นตอนที่ 11: เมื่อวางสายไฟและส่วนประกอบทั้งหมดไว้ในกระป๋องอาหารแล้วจึงใช้ปืนกาวที่ฐานของแผ่นโฟม
- ขั้นตอนที่ 12: บทสรุป
วีดีโอ: การควบคุมการเคลื่อนไหว Gimbal: 12 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:03
สวัสดีทุกคน ฉันชื่อ 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 ได้อย่างง่ายดาย
ขั้นตอนที่ 5: ถัดไปโดยใช้วิธีการเดียวกันกับที่ฉันรักษาความปลอดภัยของโรลเซอร์โว ชิ้นส่วนได้รับการออกแบบมาโดยเฉพาะเพื่อให้พอดีกับเซอร์โว 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 ต่อแบตเตอรี่ 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 ชนิดพิเศษเพื่อให้การเคลื่อนไหวราบรื่น ดังนั้นให้พิจารณาโครงการนี้เพื่อการศึกษาเท่านั้น
นั่นคือทั้งหมดสำหรับบทช่วยสอนนี้ ฉันหวังว่าคุณจะสนุกกับมันและเรียนรู้สิ่งใหม่ อย่าลังเลที่จะถามคำถามใด ๆ ในส่วนความคิดเห็นด้านล่างและอย่าลืมตรวจสอบคอลเลกชันของโครงการ
แนะนำ:
โครงการ Gimbal Stabilizer: 9 ขั้นตอน (พร้อมรูปภาพ)
โครงการ Gimbal Stabilizer: วิธีสร้าง Gimbal เรียนรู้วิธีสร้าง gimbal แบบ 2 แกนสำหรับกล้องแอคชั่นของคุณ ในวัฒนธรรมปัจจุบันเราทุกคนชอบบันทึกวิดีโอและจับภาพช่วงเวลาต่างๆ โดยเฉพาะอย่างยิ่งเมื่อคุณเป็นผู้สร้างเนื้อหาเช่นฉัน คุณคงประสบปัญหา วิดีโอสั่นคลอนดังกล่าว
Gyroscope Platform/ Camera Gimbal: 5 ขั้นตอน (พร้อมรูปภาพ)
Gyroscope Platform/ Camera Gimbal: คำแนะนำนี้ถูกสร้างขึ้นเพื่อตอบสนองความต้องการของโครงการ Makecourse ที่มหาวิทยาลัย South Florida (www.makecourse.com)
Gimbal กล้องพิมพ์ 3 มิติ (การประกวด Tinkercad): 6 ขั้นตอน
3D Printed Camera Gimbal (การประกวด Tinkercad): สวัสดี นี่คือ gimbal ของกล้องที่ฉันออกแบบใน Tinkercad gimbal หลักทำมาจาก This Jar Handle และ gimbal / gyro 5 วงซึ่งฉันไม่พบอีกต่อไป การออกแบบ Tinkercad สามารถพบได้ที่นี่ นี้ถูกออกแบบมาเพื่อทำงานกับ Powers
ไฟล์แบทช์: การควบคุมการเคลื่อนไหว: 3 ขั้นตอน
ไฟล์แบทช์: การควบคุมการเคลื่อนไหว: เมื่อฉันค้นหาวิธีสร้างการควบคุมการเคลื่อนไหวใน CMD ฉันไม่พบผลลัพธ์ที่ถูกต้อง ดังนั้นฉันจึงตัดสินใจสร้างการควบคุมของตัวเองที่ทำงานกับปุ่ม WASD สำหรับการเคลื่อนไหวและ 1234 ปุ่มสำหรับการเลี้ยว
Gimbal อย่างง่ายด้วย Micro:bit และ 2 Servos: 4 ขั้นตอน
Gimbal อย่างง่ายด้วย Micro:bit และ 2 Servos: สวัสดี! วันนี้ผมจะแสดงให้คุณเห็นถึงวิธีการสร้าง gimbal stabilizer แบบง่ายๆ คุณสามารถดูวิดีโอ YouTube ได้ที่นี่ โดยจะมีกล้องติดตัวไว้ แต่ถ้าคุณใส่เซอร์โวและโครงสร้างที่ทรงพลังกว่า ก็สามารถถือสมาร์ทโฟนของคุณหรือแม้แต่กล้องที่เหมาะสมได้ ในขั้นตอนต่อไป