Агуулгын хүснэгт:

Гимбалын хөдөлгөөн хянах: 12 алхам
Гимбалын хөдөлгөөн хянах: 12 алхам

Видео: Гимбалын хөдөлгөөн хянах: 12 алхам

Видео: Гимбалын хөдөлгөөн хянах: 12 алхам
Видео: Лучший из ЛУЧШИХ???. Радиоприемник TECSUN PL680 ПОЛНЫЙ ОБЗОР!!! #tecsun 2024, Арваннэгдүгээр
Anonim
Image
Image

Сайн байцгаана уу, намайг Харжи Наги гэдэг. Би одоогоор Канпур (UP) дахь Пранвир Сингх Технологийн Институтын электроник, холбооны инженерийн чиглэлээр хоёрдугаар дамжааны оюутан. Би робот техник, ардуино, хиймэл оюун ухаан, аналог электроникийн чиглэлээр их хичээллэдэг.

"Гимбал" гэдэг үгийг аливаа объектыг нэг тэнхлэгт эргүүлэх боломжийг олгодог эргэлтийн тулгуур гэж тодорхойлдог. Тиймээс гурван тэнхлэгтэй gimbal нь gimbal дээр суурилуулсан аливаа объектыг gimbal барьж байгаа хүний хөдөлгөөнөөс хамааралгүй байлгах боломжийг олгодог. Гимбал нь тухайн зүйлийг авч явах биш харин түүний хөдөлгөөнийг зааж өгдөг.

Энэ нь 3 тэнхлэгтэй удирдлагад зориулагдсан 3 MG996R серво мотор, MPU6050 мэдрэгч, Arduino болон батерейг байрлуулах суурьтай бөгөөд камерыг чичиргээгүй тогтвортой байлгахад ашигладаг. Гурван тэнхлэгтэй gimbal нь камерыг барьж байгаа хүн дээш, доош, зүүн, баруун, урд, хойд чиглэлд явж байсан ч гэсэн хөдөлгөөнийг тогтворжуулдаг. Үүнийг бид yaw, pitch, roll stabilization гэж нэрлэдэг.

Алхам 1: Бүрэлдэхүүн хэсгүүдийн жагсаалт

Бүрэлдэхүүн хэсгүүдийн жагсаалт нь:

1) Ардуино Уно

2) Arduino Uno -ийг тэжээх зориулалттай 8V, 1.5 Amp зай

3) 7805 Хүчдэл зохицуулагч Ic эсвэл та buck conveter ашиглаж болно

4) MPU 6050

5) 3*(MG995 SERVO Motors)

6) холбогч утас

Бусад тоног төхөөрөмж:

1) Гагнуурын төмөр

2) Цавуу буу

3) Өрөмдлөгийн машин

4) Хоол хүнс

Breadborad -ийг ашиглахын оронд би автобусны эерэг ба сөрөг холболт хийхэд зориулагдсан жижиг кастомын самбар ашигладаг

Алхам 2: угсрах

Угсарч байна
Угсарч байна
Угсарч байна
Угсарч байна

Хөөсөнцөр, хөөсөнцөр хавтан эсвэл цаасан нүүртэй хөөсөнцөр хавтан нь Servo моторыг суурилуулах, масштабтай загвар хийхэд ашигладаг хөнгөн бөгөөд амархан зүсэгддэг материал юм.

Нэгдүгээрт, би хөөсөн хавтангийн тусламжтайгаар servo мотор суурилуулах DIY L хэлбэрийн хаалт хийв.

Алхам 3:

Зураг
Зураг

Гимбал угсрах нь маш хялбар байсан. Би Yaw servo, MPU 6050 мэдрэгч, ON-OFF унтраалгыг суулгаж эхлэв. Боолт, самар ашиглан би сууринд бэхлэв

Алхам 4: Дараа нь ижил аргыг ашиглан Roll Servo -г хамгааллаа. эд ангиудыг MG995 серверт хялбархан тохируулахаар тусгайлан бүтээсэн болно

Дараа нь ижил аргыг ашиглан Roll Servo -г хамгааллаа. эд ангиудыг MG995 серверт хялбархан тохируулахаар тусгайлан бүтээсэн болно
Дараа нь ижил аргыг ашиглан Roll Servo -г хамгааллаа. эд ангиудыг MG995 серверт хялбархан тохируулахаар тусгайлан бүтээсэн болно

Алхам 5: Дараа нь ижил аргыг ашиглан Roll Servo -г хамгааллаа. эд ангиудыг MG995 серверт хялбархан тохируулахаар тусгайлан бүтээсэн болно

Дараа нь ижил аргыг ашиглан би Roll Servo -г хамгаалсан. эд ангиудыг MG995 серверт хялбархан тохируулахаар тусгайлан бүтээсэн болно
Дараа нь ижил аргыг ашиглан би Roll Servo -г хамгаалсан. эд ангиудыг MG995 серверт хялбархан тохируулахаар тусгайлан бүтээсэн болно

Алхам 6: Холболтууд

Холболтууд
Холболтууд

Цахилгаан диаграммд та 8V -ийг 5V -д хөрвүүлэхийн тулд buck хувиргагч эсвэл 7805 хүчдэлийн зохицуулагч IC -ийг ашиглаж болно. Хэлхээ диаграмыг өгсөн микроконтроллер нь Arduino Nano бөгөөд та Arduino Uno, Arduino Mega -ийг ашиглаж болно.

MPU 6050 -ийн SCL ба SDA тээглүүрүүд нь Arduino аналог A5 ба A4 зүүтэй холбогдсон байдаг. (SCL ба SDA зүү нь өөр байж болох тул бусад микроконтроллерын SCL ба SDA тээглүүрийн мэдээллийн хүснэгтийг үзнэ үү)

Алхам 7: 7805 хүчдэлийн зохицуулагч IC -тай холбох

7805 хүчдэлийн зохицуулагч IC -тай холбох
7805 хүчдэлийн зохицуулагч IC -тай холбох

Энэхүү хэлхээний диаграм нь 7805 хүчдэлийн зохицуулагч ic -ийг холбох зориулалттай бөгөөд 8в батерейг Vin дээр холбосноор та 5V гаралтын хүчдэл авах болно.

Алхам 8: Кодлох

Та дараах номын сангуудыг оруулах ёстой.

1) zip файлыг татаж авахын тулд энд дарна уу

2) #includeЗип файлыг татаж авахын тулд энд дарна уу

Зип файлыг татаж авсны дараа zdu номын санг arduino ноорог дээр нэмнэ үү

Кодын хувьд

/*

DIY Gimbal - Jeff Rowberg -ийн i2cdevlib номын сангийн MPU6050_DMP6 жишээн дээр үндэслэсэн MPU6050 Arduino заавар код: https://github.com/jrowberg/i2cdevlib */// I2Cdev болон MPU6050 -ийг номын сан болгон суулгасан байх ёстой..h файлууд // хоёр ангийн хувьд таны төслийн оруулах замд байх ёстой / I2Cdev.h -д I2Cdev.h #ашиглагдаж байвал Arduino Wire номын сан шаардлагатай болно. I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // ангийн анхдагч I2C хаяг нь 0C68 байж болно // энд параметр болгон оруулсан // AD0 low = 0x68 (SparkFun breakout болон InvenSense үнэлгээний самбарын анхдагч) // AD0 high = 0x69 MPU6050 mpu; // MPU6050 MPU (0x69); // <- AD0 өндөрт ашиглах // 3 servo моторыг тодорхойлно Servo servo0; Servo servo1; Servo servo2; зөв хөвөх; int j = 0; #тодорхойлох OUTPUT_READABLE_YAWPITCHROLL #INTERRUPT_PIN 2 -ийг тодорхойлох // Arduino Uno дээр 2 -р зүү ашиглана уу & ихэнх самбар 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 хадгалах буфер // чиг баримжаа/хөдөлгөөнт хувилбарууд Quaternion q; // [w, x, y, z] quaternion контейнер VectorInt16 аа; // [x, y, z] accel мэдрэгчийн хэмжилт VectorInt16 aaReal; // [x, y, z] таталцалгүй хурдатгалын мэдрэгчийн хэмжилт VectorInt16 aaWorld; // [x, y, z] дэлхийн хүрээний хурдасгуур мэдрэгчийн хэмжилт VectorFloat таталцал; // [x, y, z] таталцлын вектор float euler [3]; // [psi, theta, phi] Эйлерийн өнцгийн контейнер float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll контейнер ба хүндийн хүчний вектор // InvenSense цайны савны demo uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // ================================================ ================ // === ЗӨВЛӨГӨӨ ТОДОРХОЙЛОХ РОТИН === // ==================== ============================================ дэгдэмхий bool mpuInterrupt = false; // нь MPU тасалдлын зүү өндөр хүчингүй болсон эсэхийг заана dmpDataReady () {mpuInterrupt = true; } // =============================================== ================= // === Анхны тохиргоо === // ==================== =========================================== хүчингүй тохиргоо () {// I2C автобусанд нэгдэх (I2Cdev номын сан үүнийг автоматаар хийдэггүй) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400 кГц I2C цаг. Эмхэтгэхэд хүндрэлтэй байгаа бол энэ мөрийг бичнэ үү #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, үнэн); #endif // цуваа холболтыг эхлүүлэх // (115200 нь Teapot Demo гаралтанд шаардлагатай учир сонгосон, гэхдээ энэ нь таны төслөөс хамаарч танд хамаарна) Serial.begin (38400); байхад (! Цуваа); // Леонардогийн тооллогыг хүлээх, бусад нь шууд үргэлжлүүлэх // төхөөрөмжийг эхлүүлэх //Serial.println(F("I2C төхөөрөмжийг эхлүүлэх … ")); mpu.initialize (); pinMode (INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize (); // mpu.setXGyroOffset (17) хамгийн бага мэдрэмтгий байдлын хувьд масштабтай өөрийн гиро офсетыг эндээс нийлүүлнэ үү; mpu.setYGyroOffset (-69); mpu.setZGyroOffset (27); mpu.setZAccelOffset (1551); // Миний туршилтын чипийн хувьд 1688 үйлдвэрийн анхдагч байдал // ажиллаж байсан эсэхийг шалгаарай (хэрэв тэг бол 0 буцаана) хэрэв (devStatus == 0) {// бэлэн болсны дараа DMP -ийг асаана уу // Serial.println (F ("Идэвхжүүлэх DMP … ")); mpu.setDMPEnabled (үнэн); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // манай DMP бэлэн тугийг тохируулаарай, ингэснээр үндсэн loop () функц үүнийг ашиглах нь зөв гэдгийг мэддэг //Serial.println(F("DMP бэлэн байна! Эхний тасалдлыг хүлээж байна … ")); dmpReady = үнэн; // хожим харьцуулахын тулд хүлээгдэж буй DMP пакетийн хэмжээг авах packetSize = mpu.dmpGetFIFOPacketSize (); } өөр {// АЛДАА! // 1 = санах ойн анхны ачаалал амжилтгүй болсон // 2 = DMP тохиргооны шинэчлэлт амжилтгүй болсон // (хэрэв эвдрэх гэж байгаа бол ихэвчлэн код нь 1 болно) // Serial.print (F ("DMP эхлүүлэх амжилтгүй болсон (код")); //Serial.print(devStatus); //Serial.println (F (")")); } // 3 servo мотортой холбогдсон голыг тодорхойлно servo0.attach (10); servo1. хавсаргах (9); servo2.attach (8); } // =============================================== ================= // === Үндсэн програмын эргэлт === // ================== ============================================ void loop () { / / хэрэв програмчлал амжилтгүй болсон бол (! dmpReady) буцаж ирвэл юу ч битгий оролдоорой; // MPU тасалдал эсвэл нэмэлт пакет бэлэн болтол хүлээнэ үү (!

= 1024) {

// дахин тохируулснаар бид цэвэрхэн үргэлжлүүлж чадна mpu.resetFIFO (); fifoCount = mpu.getFIFOCount (); Serial.println (F ("FIFO халих!")); // өөрөөр хэлбэл, DMP өгөгдлийн бэлэн тасалдал байгаа эсэхийг шалгаарай (энэ нь байнга тохиолддог)} өөр тохиолдолд (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// боломжтой байгаа өгөгдлийн уртыг хүлээнэ үү, маш богино хугацаанд хүлээх хэрэгтэй (fifoCount 1 пакет боломжтой / / (энэ нь бидэнд тасалдал хүлээлгүйгээр шууд унших боломжийг олгодог) fifoCount -= packetSize; // Yaw, Pitch and Roll утгуудыг авах #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmp & getGrGity.dmpGetYawPitchRoll (ypr, & q, & gravity); // Yaw, Pitch, Roll утга - Радиан градус хүртэл ypr [0] = ypr [0] * 180 / M_PI; ypr [1] = ypr [1] * 180 / M_PI; ypr [2] = ypr [2] * 180 / M_PI; // Хэрэв (j <= 300) {зөв = ypr [0]; // Yaw нь санамсаргүй утгаар эхэлдэг бол 300 уншилтыг алгасах (өөрөө шалгалт тохируулах үйл явц); 300 уншилтын дараа хамгийн сүүлийн утгыг авах j ++;} // 300 удаа уншсаны дараа {ypr [0] = ypr [0] - зөв; // Yaw -ийг 0 градус болгож тохируулна уу. 0 градус es // MPU6050 мэдрэгчийн утгыг -90-90 -ээс 90 хүртэлх servo0Value = газрын зургийн удирдлагад тохирох утгатай харьцуулна уу (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) дагуу servos -ийг удирдах; servo1.write (servo1Value); servo2.write (servo2Value); } #endif}}

Эцэст нь бичих функцийг ашигласнаар бид эдгээр утгыг servo руу хяналтын дохио болгон илгээдэг. Мэдээжийн хэрэг, хэрэв та X ба Y тэнхлэгийг тогтворжуулахыг хүсч байвал Yaw servo -ийг идэвхгүй болгож, энэ платформыг камерын гимбал болгон ашиглах боломжтой

Алхам 9: Бүх бүрэлдэхүүн хэсгүүд холбогдсон үед энэ зурагтай төстэй харагдаж байна

Бүх бүрэлдэхүүн хэсгүүдийг холбосон тохиолдолд энэ зураг дээрхтэй төстэй харагдаж байна
Бүх бүрэлдэхүүн хэсгүүдийг холбосон тохиолдолд энэ зураг дээрхтэй төстэй харагдаж байна

Алхам 10: Одоо бүх үндсэн хоолыг хүнсний саванд хийнэ

Одоо бүх үндсэн зүйлийг хүнсний лаазанд хийнэ
Одоо бүх үндсэн зүйлийг хүнсний лаазанд хийнэ

Алхам 11: Бүх утас, эд ангиудыг хүнсний дотор байрлуулсны дараа хөөсний хавтан дээр цавуу буу түрхэж болно

Бүх утас, эд ангиудыг хүнсний дотор байрлуулсны дараа хөөсний хавтан дээр цавуу буу түрхэж болно
Бүх утас, эд ангиудыг хүнсний дотор байрлуулсны дараа хөөсний хавтан дээр цавуу буу түрхэж болно

Алхам 12: Дүгнэлт

Үүнийг сайн камерын гимбалаас хол байгааг анхаарна уу. Эдгээр серво нь ийм зорилгоор хийгдээгүй тул хөдөлгөөн нь жигд биш байна. Бодит камерын gimbals нь гөлгөр хөдөлгөөнийг бий болгохын тулд тусгай төрлийн BLDC мотор ашигладаг. Тиймээс энэ төслийг зөвхөн боловсролын зорилгоор авч үзье.

Энэ нь энэ гарын авлагад зориулагдсан болно, танд таалагдсан, шинэ зүйл сурсан гэж найдаж байна. Доорх коммент хэсэгт ямар ч асуулт асууж, төслийн цуглуулгыг шалгахаа бүү мартаарай

Зөвлөмж болгож буй: