Mục lục:

Gimbal điều khiển chuyển động: 12 bước
Gimbal điều khiển chuyển động: 12 bước

Video: Gimbal điều khiển chuyển động: 12 bước

Video: Gimbal điều khiển chuyển động: 12 bước
Video: 5 bài tập gimbal cho người mới // ft.RS 3 Mini 2024, Tháng bảy
Anonim
Image
Image

Xin chào mọi người, Tên tôi là Harji Nagi, tôi hiện đang là sinh viên năm thứ hai theo học ngành điện tử và truyền thông của Học viện Công nghệ Pranveer Singh, Kanpur (UP).

Từ “gimbal” được định nghĩa là một hỗ trợ xoay cho phép quay bất kỳ đối tượng nào theo một trục duy nhất. Vì vậy, gimbal ba trục cho phép bất kỳ đối tượng nào được gắn trên gimbal độc lập với chuyển động của vật đang giữ gimbal. Gimbal ra lệnh cho chuyển động của đối tượng, không phải của vật mang nó.

Nó bao gồm 3 động cơ servo MG996R để điều khiển 3 trục và một cơ sở để đặt cảm biến MPU6050, Arduino và pin. Nó được sử dụng để giữ cho máy ảnh ổn định mà không bị rung. Gimbal 3 trục đảm bảo rằng chuyển động của máy ảnh được ổn định ngay cả khi người cầm nó lên và xuống, trái và phải, trước và sau. Đây là những gì chúng tôi gọi là ổn định ngáp, cao độ và cuộn.

Bước 1: Danh sách thành phần

Danh sách thành phần là:

1) Arduino Uno

2) Pin 8V, 1,5 Amp để cấp nguồn cho Arduino Uno

3) Ic điều chỉnh điện áp 7805 hoặc bạn có thể sử dụng bộ chuyển đổi buck

4) MPU 6050

5) 3 * (Động cơ SERVO MG995)

6) Dây nhảy

Các thiết bị khác:

1) Sắt hàn

2) Súng bắn keo

3) Máy khoan

4) Thức ăn có thể

Thay vì sử dụng breadborad, tôi đã sử dụng bảng mạch nhỏ coustom perf cho kết nối xe buýt tích cực và tiêu cực

Bước 2: Lắp ráp

Lắp ráp
Lắp ráp
Lắp ráp
Lắp ráp

Mút xốp, ván xốp, hoặc ván xốp mặt giấy là vật liệu nhẹ và dễ cắt được sử dụng để lắp động cơ Servo và để chế tạo các mô hình cân.

Đầu tiên, tôi đã tự làm một giá đỡ hình chữ L để gắn động cơ servo với sự trợ giúp của bảng xốp.

Bước 3:

Hình ảnh
Hình ảnh

Việc lắp ráp gimbal khá dễ dàng. Tôi bắt đầu với việc cài đặt servo Yaw, cảm biến MPU 6050 và công tắc BẬT-TẮT. Sử dụng bu lông và đai ốc, tôi đã cố định nó vào đế

Bước 4: Tiếp theo, sử dụng cùng một phương pháp mà tôi đã bảo mật cho Roll Servo. các bộ phận được thiết kế đặc biệt để dễ dàng lắp Servos MG995

Tiếp theo, sử dụng cùng một phương pháp tôi đã bảo vệ Servo cuộn. các bộ phận được thiết kế đặc biệt để dễ dàng lắp Servos MG995
Tiếp theo, sử dụng cùng một phương pháp tôi đã bảo vệ Servo cuộn. các bộ phận được thiết kế đặc biệt để dễ dàng lắp Servos MG995

Bước 5: Tiếp theo, sử dụng cùng một phương pháp mà tôi đã bảo mật cho Roll Servo. các bộ phận được thiết kế đặc biệt để dễ dàng lắp Servos MG995

Tiếp theo, sử dụng cùng một phương pháp tôi đã bảo vệ Servo cuộn. các bộ phận được thiết kế đặc biệt để dễ dàng lắp Servos MG995
Tiếp theo, sử dụng cùng một phương pháp tôi đã bảo vệ Servo cuộn. các bộ phận được thiết kế đặc biệt để dễ dàng lắp Servos MG995

Bước 6: Kết nối

Kết nối
Kết nối

Trong sơ đồ mạch, bạn có thể sử dụng bộ chuyển đổi buck hoặc IC điều chỉnh điện áp 7805 để chuyển đổi 8V thành 5 V. Bộ vi điều khiển được cung cấp cho sơ đồ mạch là Arduino Nano, bạn cũng có thể sử dụng Arduino Uno, Arduino Mega.

Các chân SCL và SDA của MPU 6050 được kết nối với chân Arduino Analog A5 và A4. (Chân SCL và SDA có thể khác nhau, vì vậy hãy kiểm tra biểu dữ liệu cho các chân SCl và SDA cho vi điều khiển khác)

Bước 7: Kết nối với IC ổn áp 7805

Kết nối với IC điều chỉnh điện áp 7805
Kết nối với IC điều chỉnh điện áp 7805

Sơ đồ mạch này dùng để đấu nối ic ổn áp 7805, đấu nối pin 8v ở Vin bạn sẽ nhận được điện áp ra là 5v.

Bước 8: Mã hóa

Bạn phải bao gồm các thư viện sau:

1) #includeNhấp vào đây để tải xuống tệp zip

2) #includeNhấp vào đây để tải xuống tệp zip

Sau khi tải xuống tệp zip, hãy thêm thư viện zip trong bản phác thảo arduino

Đối với mã

/*

Tự làm Gimbal - Mã hướng dẫn MPU6050 Arduino dựa trên ví dụ MPU6050_DMP6 từ thư viện i2cdevlib của Jeff Rowberg: https://github.com/jrowberg/i2cdevlib * // I2Cdev và MPU6050 phải được cài đặt dưới dạng thư viện hoặc.cpp / Các tệp.h // cho cả hai lớp phải nằm trong đường dẫn bao gồm trong dự án của bạn #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // # include "MPU6050.h" // không cần thiết nếu sử dụng MotionApps include file / / Thư viện Arduino Wire là bắt buộc nếu triển khai I2Cdev I2CDEV_ARDUINO_WIRE // được sử dụng trong I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // địa chỉ I2C mặc định của lớp là 0x68 // địa chỉ I2C mặc định của lớp được truyền dưới dạng tham số ở đây // AD0 low = 0x68 (mặc định cho SparkFun breakout và bảng đánh giá InvenSense) // AD0 high = 0x69 MPU6050 mpu; // MPU6050 mpu (0x69); // <- sử dụng cho AD0 cao // Xác định 3 động cơ servo Servo servo0; Servo servo1; Servo servo2; float đúng; int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #define INTERRUPT_PIN 2 // sử dụng chân 2 trên Arduino Uno & hầu hết các bảng bool flashState = false; // MPU control / status vars bool dmpReady = false; // đặt true nếu DMP init thành công uint8_t mpuIntStatus; // giữ byte trạng thái ngắt thực tế từ MPU uint8_t devStatus; // trả về trạng thái sau mỗi hoạt động của thiết bị (0 = thành công,! 0 = lỗi) uint16_t packetSize; // kích thước gói tin DMP dự kiến (mặc định là 42 byte) uint16_t FifoCount; // đếm tất cả các byte hiện có trong FIFO uint8_t FifoBuffer [64]; // Bộ đệm lưu trữ FIFO // định hướng / chuyển động vars Quaternion q; // [w, x, y, z] vùng chứa quaternion VectorInt16 aa; // [x, y, z] cộng các phép đo cảm biến VectorInt16 aaReal; // [x, y, z] các phép đo cảm biến accel không trọng lực VectorInt16 aaWorld; // [x, y, z] các phép đo cảm biến accel world-frame trọng lực VectorFloat; // [x, y, z] vector trọng lực float euler [3]; // [psi, theta, phi] Euler angle container float ypr [3]; // thùng chứa [yaw, pitch, roll] yaw / pitch / roll và vector trọng lực // cấu trúc gói cho bản trình diễn ấm trà InvenSense uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // ================================================ ================ // === TUYẾN PHÁT HIỆN INTERRUPT === // ===================== =========================================== dễ bay hơi bool mpuInterrupt = false; // cho biết chân ngắt MPU có tăng cao hay không void dmpDataReady () {mpuInterrupt = true; } // =============================================== ================= // === THIẾT LẬP BAN ĐẦU === // ===================== =========================================== void setup () {// tham gia bus I2C (thư viện I2Cdev không tự động làm việc này) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // Đồng hồ I2C 400kHz. Nhận xét dòng này nếu gặp khó khăn khi biên dịch #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, true); #endif // khởi tạo giao tiếp nối tiếp // (chọn 115200 vì nó được yêu cầu cho đầu ra Teapot Demo, nhưng // thực sự tùy thuộc vào bạn tùy thuộc vào dự án của bạn) Serial.begin (38400); while (! nối tiếp); // đợi Leonardo liệt kê, những người khác tiếp tục ngay lập tức // khởi tạo thiết bị //Serial.println(F("Initializing I2C devices… ")); mpu.initialize (); pinMode (INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize (); // cung cấp hiệu số con quay hồi chuyển của riêng bạn ở đây, được chia tỷ lệ cho độ nhạy tối thiểu mpu.setXGyroOffset (17); mpu.setYGyroOffset (-69); mpu.setZGyroOffset (27); mpu.setZAccelOffset (1551); // 1688 mặc định ban đầu cho chip thử nghiệm của tôi // đảm bảo rằng nó hoạt động (trả về 0 nếu vậy) if (devStatus == 0) {// bật DMP, bây giờ nó đã sẵn sàng // Serial.println (F ("Đang bật DMP… ")); mpu.setDMPEnabled (true); AttachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // đặt cờ Sẵn sàng cho DMP của chúng ta để hàm main loop () biết là có thể sử dụng nó //Serial.println(F("DMP đã sẵn sàng! Đang đợi ngắt đầu tiên… ")); dmpReady = true; // lấy kích thước gói DMP dự kiến để so sánh sau đó packetSize = mpu.dmpGetFIFOPacketSize (); } else {// LỖI! // 1 = tải bộ nhớ ban đầu không thành công // 2 = Cập nhật cấu hình DMP không thành công // (nếu nó bị hỏng, thông thường mã sẽ là 1) // Serial.print (F ("Khởi tạo DMP không thành công (mã")); //Serial.print(devStatus); //Serial.println (F (")")); } // Xác định các chân mà 3 động cơ servo được kết nối servo0.attach (10); servo1.attach (9); servo2.attach (8); } // =============================================== ================= // === ĐĂNG NHẬP CHƯƠNG TRÌNH CHÍNH === // ==================== ============================================ void loop () {/ / nếu lập trình không thành công, đừng cố làm bất cứ điều gì if (! dmpReady) return; // đợi MPU ngắt hoặc (các) gói bổ sung khả dụng trong khi (! mpuInterrupt && FifoCount <packetSize) {if (mpuInterrupt && FifoCount

= 1024) {

// thiết lập lại để chúng ta có thể tiếp tục hoàn toàn mpu.resetFIFO (); FifoCount = mpu.getFIFOCount (); Serial.println (F ("FIFO tràn!")); // nếu không, hãy kiểm tra xem có ngắt sẵn sàng dữ liệu DMP không (điều này thường xuyên xảy ra)} else if (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// đợi độ dài dữ liệu có sẵn chính xác, phải đợi RẤT ngắn trong khi (có sẵn số lượng 1 gói dữ liệu năm mươi / / (điều này cho phép chúng tôi đọc nhiều hơn ngay lập tức mà không cần chờ ngắt quãng)..dmpGetYawPitchRoll (ypr, & q, &vity); // Giá trị Ypr, Pitch, Roll - Radian sang độ ypr [0] = ypr [0] * 180 / M_PI; ypr [1] = ypr [1] * 180 / M_PI; ypr [2] = ypr [2] * 180 / M_PI; // Bỏ qua 300 lần đọc (quá trình tự hiệu chỉnh) if (j <= 300) {correct = ypr [0]; // Yaw bắt đầu ở giá trị ngẫu nhiên, vì vậy chúng tôi nắm bắt giá trị cuối cùng sau 300 lần đọc j ++;} // Sau 300 lần đọc else {ypr [0] = ypr [0] - đúng; // Đặt Yaw thành 0 độ - trừ giá trị Yaw ngẫu nhiên cuối cùng khỏi giá trị currrent để tạo Yaw 0 độ es // Ánh xạ các giá trị của cảm biến MPU6050 từ -90 đến 90 thành các giá trị phù hợp với điều khiển servo từ 0 đến 180 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); // Điều khiển servo theo định hướng MPU6050 servo0.write (servo0Value); servo1.write (servo1Value); servo2.write (servo2Value); } #endif}}

Cuối cùng bằng cách sử dụng chức năng ghi, chúng tôi gửi các giá trị này đến các servo dưới dạng tín hiệu điều khiển. Tất nhiên, bạn có thể tắt servo Yaw nếu bạn chỉ muốn ổn định cho trục X và Y và sử dụng nền tảng này làm gimbal cho máy ảnh

Bước 9: Khi tất cả các thành phần được kết nối, nó trông tương tự như hình ảnh này

Khi tất cả các thành phần được kết nối, nó trông tương tự như hình ảnh này
Khi tất cả các thành phần được kết nối, nó trông tương tự như hình ảnh này

Bước 10: Bây giờ hãy chèn tất cả các thứ cơ bản vào bên trong hộp thực phẩm

Bây giờ hãy chèn tất cả các thứ cơ bản vào bên trong hộp thực phẩm
Bây giờ hãy chèn tất cả các thứ cơ bản vào bên trong hộp thực phẩm

Bước 11: Khi tất cả các dây và các thành phần được đặt bên trong thực phẩm thì có thể sử dụng súng bắn keo ở đế tấm xốp

Khi tất cả các dây và các thành phần được đặt bên trong thực phẩm thì có thể sử dụng súng bắn keo ở đế tấm xốp
Khi tất cả các dây và các thành phần được đặt bên trong thực phẩm thì có thể sử dụng súng bắn keo ở đế tấm xốp

Bước 12: Kết luận

Xin lưu ý điều này khác xa với gimbal máy ảnh tốt. Các chuyển động không trơn tru bởi vì những Servos này không được thiết kế cho mục đích như vậy. Gimbal máy ảnh thực sử dụng loại động cơ BLDC đặc biệt để có được các chuyển động mượt mà. Vì vậy, hãy coi dự án này chỉ dành cho mục đích giáo dục.

Đó sẽ là tất cả cho hướng dẫn này, tôi hy vọng bạn thích nó và học được điều gì đó mới. Vui lòng đặt bất kỳ câu hỏi nào trong phần nhận xét bên dưới và đừng quên kiểm tra các bộ sưu tập dự án của tôi

Đề xuất: