Мазмұны:

Гимбал қозғалысын басқару: 12 қадам
Гимбал қозғалысын басқару: 12 қадам

Бейне: Гимбал қозғалысын басқару: 12 қадам

Бейне: Гимбал қозғалысын басқару: 12 қадам
Бейне: Дженнифер Пан I Тозақтағы қызым I шынайы қылмыс туралы ... 2024, Шілде
Anonim
Image
Image

Барлығына сәлем, менің атым Харджи Наги. Мен қазір Канпур пранвир Сингх технологиялық институтының электроника және байланыс инженериясында оқитын екінші курста оқимын. Мен робототехникаға, ардуиноға, жасанды интеллектке және аналогтық электроникаға қызығушылық танытамын.

«Гимбал» сөзі кез келген объектіні бір осьте айналдыруға мүмкіндік беретін айналмалы тірек ретінде анықталады. Үш осьті гимбаль гимбалға бекітілген кез келген заттың гимбалды ұстаушының қозғалысына тәуелсіз болуына мүмкіндік береді. Гимбал заттың қозғалысын емес, оны алып жүретінді айтады.

Ол 3 осьті басқаруға арналған 3 MG996R сервоқозғалтқыштарынан және MPU6050 датчигі, Arduino мен аккумулятор орнатылатын негізден тұрады. Ол камераны дірілсіз тұрақтандыруға мүмкіндік береді. 3 осьті гимбал камераның қозғалысы тұрақтандырылуын қамтамасыз етеді, тіпті оны ұстап тұрған адам жоғары және төмен, солға және оңға, алдыңғы және артқа қарай жүрсе де. Бұл біз иіру, қадам және айналдыру тұрақтылығы деп атаймыз.

1 -қадам: компоненттер тізімі

Компоненттер тізімі:

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

2) Arduino Uno -ны қуаттауға арналған 8В, 1,5 амперлік батарея

3) 7805 Ic кернеу реттегіші немесе сіз конверттерді қолдана аласыз

4) MPU 6050

5) 3*(MG995 SERVO Motors)

6) Өтпелі сымдар

Басқа жабдықтар:

1) Пісіру үтігі

2) желімдеу пистолеті

3) Бұрғылау машинасы

4) Тамақтануға болады

Нанборадты пайдаланудың орнына, мен автобустың оң және теріс қосылуы үшін кішкене арнайы тақтаны қолданамын

2 -қадам: жинау

Жинау
Жинау
Жинау
Жинау

Foamcore, көбік тақтасы немесе қағаздан жасалған көбік тақтасы-бұл жеңіл және оңай кесілетін материал, Servo қозғалтқышын монтаждау үшін және шкалалы модельдер жасау үшін қолданылады.

Алдымен мен көбік тақтасының көмегімен сервоқозғалтқышты орнату үшін L-тәрізді DIY жақша жасадым.

3 -қадам:

Кескін
Кескін

Гимбалды жинау өте оңай болды. Мен Yaw servo, MPU 6050 сенсоры мен ON-OFF қосқышын орнатудан бастадым. Бұрандалар мен гайкаларды қолданып, оны негізге бекітіп қойдым

4 -қадам: Әрі қарай, сол әдісті қолдана отырып, мен айналдыру сервисін бекіттім. бөлшектер MG995 серверлерін оңай орналастыру үшін арнайы жасалған

Әрі қарай, сол әдісті қолдана отырып, мен айналдыру сервисін бекіттім. бөлшектер MG995 серверлерін оңай орналастыру үшін арнайы жасалған
Әрі қарай, сол әдісті қолдана отырып, мен айналдыру сервисін бекіттім. бөлшектер MG995 серверлерін оңай орналастыру үшін арнайы жасалған

5 -қадам: Әрі қарай, сол әдісті қолдана отырып, мен роллды сақтадым. бөлшектер MG995 серверлерін оңай орналастыру үшін арнайы жасалған

Әрі қарай, сол әдісті қолдана отырып, мен айналдыру сервисін бекіттім. бөлшектер MG995 серверлерін оңай орналастыру үшін арнайы жасалған
Әрі қарай, сол әдісті қолдана отырып, мен айналдыру сервисін бекіттім. бөлшектер MG995 серверлерін оңай орналастыру үшін арнайы жасалған

6 -қадам: Қосылымдар

Қосылымдар
Қосылымдар

Электр схемасында сіз 8V -ны 5 В -қа түрлендіру үшін buck түрлендіргішін немесе 7805 кернеу реттегішін қолдана аласыз. Микроконтроллер схемасы Arduino Nano, сіз Arduino Uno, Arduino Mega -ды қолдана аласыз.

MPU 6050 SCL және SDA түйреуіштері Arduino Analog A5 және A4 түйреуішіне қосылады. (SCL мен SDA түйрегіші әр түрлі болуы мүмкін, сондықтан басқа микроконтроллер үшін SCl мен SDA түйреуіштерінің деректер кестесін қараңыз)

7 -қадам: IC 7805 кернеу реттегішімен байланыс

7805 кернеу реттегіші IC көмегімен қосылу
7805 кернеу реттегіші IC көмегімен қосылу

Бұл схема 7805 кернеу реттегішін қосуға арналған, 8в батареяны Винге қосыңыз, сонда сіз 5в шығыс кернеуін аласыз.

8 -қадам: кодтау

Сіз келесі кітапханаларды қосуыңыз керек:

1) zip файлын жүктеу үшін осы жерді басыңыз

2) #includeЗип файлын жүктеу үшін мына жерді басыңыз

ZIP файлын жүктегеннен кейін zdu кітапханасын arduino эскизіне қосыңыз

Код үшін

/*

DIY Gimbal - MPU6050 Arduino оқулық коды, Jeff Rowberg i2cdevlib кітапханасынан MPU6050_DMP6 үлгісіне негізделген: 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 -де қолданылса, егер I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include «Wire.h» #endif #include // сыныптың әдепкі I2C мекенжайы 0C68 // болуы мүмкін мұнда параметр ретінде жіберілді // AD0 төмен = 0x68 (SparkFun және InvenSense бағалау тақтасы үшін әдепкі) // AD0 жоғары = 0x69 MPU6050 мпу; // MPU6050 мпу (0x69); // <- AD0 жоғары үшін пайдалану // Серво servo0 3 серво қозғалтқышын анықтаңыз; Servo servo1; Servo servo2; дұрыс жүзу; int j = 0; #deutine OUTPUT_READABLE_YAWPITCHROLL #INTERRUPT_PIN 2 анықтаңыз // Arduino Uno -да 2 -істікті қолданыңыз & көптеген тақталар bool blinkState = false; // MPU басқару/күйі vars bool dmpReady = false; // егер DMP init сәтті болса, true орнатыңыз 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] төрттік контейнер VectorInt16 аа; // [x, y, z] аксел сенсорының өлшемдері VectorInt16 aaReal; // [x, y, z] ауыртпалықсыз аксель датчигінің өлшемдері VectorInt16 aaWorld; // [x, y, z] аккумулятордың әлемдік өлшемді өлшемдері VectorFloat гравитациясы; // [x, y, z] гравитациялық вектор қалқыма эйлер [3]; // [psi, theta, phi] Эйлер бұрыштық контейнер float ypr [3]; // [аю, қадам, орау] yaw/pitch/roll контейнері және гравитация векторы // InvenSense шайнек демонстрациясының пакеттік құрылымы 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, true); #endif // сериялық байланысты инициализациялау // (115200 таңдалды, себебі ол Teapot Demo шығысы үшін қажет, бірақ бұл сіздің жобаңызға байланысты // сізге байланысты) Serial.begin (38400); while (! сериялық); // Леонардо санауды күтіңіз, басқалары бірден жалғастырады // құрылғыны инициализациялау //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 Ready жалаушасын орнатыңыз, осылайша негізгі 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 серво қозғалтқышы қосылған түйреуіштерді анықтаңыз servo0.attach (10); servo1.attach (9); servo2.attach (8); } // =============================================== ================= // === НЕГІЗГІ БАҒДАРЛАМАЛЫҚ ЦИКЛ === // ================== ============================================= void 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; // Get 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; // 300 оқуды өткізіп жіберіңіз (өзін-өзі калибрлеу процесі), егер (j <= 300) {дұрыс = 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); // servo0.write (servo0Value) MPU6050 бағдарына сәйкес сервистерді басқару; servo1.write (servo1Value); servo2.write (servo2Value); } #endif}}

Ақырында жазу функциясын қолдана отырып, біз бұл мәндерді басқару сигналдары ретінде сервоға жібереміз. Әрине, егер сіз X және Y осіне тұрақтандыруды қаласаңыз және Yaw сервосын өшіре аласыз және бұл платформаны камералық гимбал ретінде қолдансаңыз

9 -қадам: Барлық компоненттер қосылған кезде, ол осы суретке ұқсайды

Барлық компоненттер қосылған кезде, ол осы суретке ұқсайды
Барлық компоненттер қосылған кезде, ол осы суретке ұқсайды

10 -қадам: Енді барлық негізгі заттарды тағамдық ыдыстың ішіне салыңыз

Енді барлық негізгі заттарды тағамдық контейнерге салыңыз
Енді барлық негізгі заттарды тағамдық контейнерге салыңыз

11 -қадам: Барлық сымдар мен компоненттерді тағамның ішіне орналастырған кезде көбік тақтасының негізіне желім пистолетін қолдануға болады

Барлық сымдар мен компоненттерді тағамның ішіне орналастырған кезде көбік тақтасының негізіне желім пистолетін қолдануға болады
Барлық сымдар мен компоненттерді тағамның ішіне орналастырған кезде көбік тақтасының негізіне желім пистолетін қолдануға болады

12 -қадам: Қорытынды

Назар аударыңыз, бұл жақсы камералық гимбалдан алыс. Қозғалыстар тегіс емес, себебі бұл серво мұндай мақсатқа арналмаған. Нағыз камералық гимбальдар тегіс қозғалыстар үшін BLDC моторының арнайы түрін пайдаланады. Сонымен, бұл жобаны тек білім беру мақсатында қарастырыңыз.

Бұл оқулық үшін бәрі жақсы болар еді, сізге ұнады деп үміттенемін және жаңа нәрсе білдіңіз. Төмендегі түсініктемелер бөлімінде кез -келген сұрақ қоюға болады және жобаның жинақтарын тексеруді ұмытпаңыз

Ұсынылған: