Съдържание:

Кардан за управление на движение: 12 стъпки
Кардан за управление на движение: 12 стъпки

Видео: Кардан за управление на движение: 12 стъпки

Видео: Кардан за управление на движение: 12 стъпки
Видео: ПОСЛЕ ЭТОГО АКПП не будет дергаться и пинаться при трогании! 2024, Юли
Anonim
Image
Image

Здравейте всички, казвам се Harji Nagi. В момента съм студент втора година, който изучава електроника и комуникационно инженерство от Технологичния институт Pranveer Singh, Kanpur (UP). Имам силен интерес към роботиката, arduino, изкуствения интелект и аналоговата електроника.

Думата „кардан“се определя като шарнирна опора, която позволява завъртане на всеки обект в една -единствена ос. Така че триосен кардан позволява на всеки обект, монтиран на кардана, да бъде независим от движението на този, който държи кардана. Карданът диктува движението на обекта, а не на този, който го носи.

Състои се от 3 серво мотора MG996R за 3-осно управление и основа, върху която ще бъдат поставени сензорът MPU6050, Arduino и батерията. Използва се за поддържане на стабилизиране на камерата без вибрации. Триосен кардан гарантира, че движението на камерата се стабилизира, дори ако тази, която я държи, се движи нагоре и надолу, наляво и надясно, отпред и отзад. Това е, което ние наричаме стабилизация на криволичене, наклон и преобръщане.

Стъпка 1: Списък на компонентите

Списъкът на компонентите е:

1) Arduino Uno

2) 8V, 1.5 Amp батерия за захранване на Arduino Uno

3) 7805 Регулатор на напрежение Ic или можете да използвате понижаващ конвектор

4) MPU 6050

5) 3*(MG995 SERVO Motors)

6) Джъмперни проводници

Друго оборудване:

1) поялник

2) Пистолет за лепило

3) Пробивна машина

4) Консервна кутия

Вместо да използвам хляб, използвах малка кустова перфорирана дъска за положителна и отрицателна автобусна връзка

Стъпка 2: Сглобяване

Сглобяване
Сглобяване
Сглобяване
Сглобяване

Foamcore, пяна или хартиена пяна е лек и лесен за рязане материал, използван за монтаж на серво мотор и за изработка на мащабни модели.

Първо направих скоби с L-образна форма за монтиране на серво мотор с помощта на пяна.

Стъпка 3:

Образ
Образ

Сглобяването на кардана беше доста лесно. Започнах с инсталирането на Yaw серво, сензор MPU 6050 и превключвател ON-OFF. С помощта на болтове и гайки го закрепих към основата

Стъпка 4: След това, използвайки същия метод, закрепих Roll Servo. частите са специално проектирани за лесно монтиране на сервомоторите MG995

След това, използвайки същия метод, осигурих ролковото серво. частите са специално проектирани да монтират лесно сервомоторите MG995
След това, използвайки същия метод, осигурих ролковото серво. частите са специално проектирани да монтират лесно сервомоторите MG995

Стъпка 5: След това, използвайки същия метод, осигурих ролковото серво. частите са специално проектирани да монтират лесно сервомоторите MG995

След това, използвайки същия метод, осигурих ролковото серво. частите са специално проектирани да монтират лесно сервомоторите MG995
След това, използвайки същия метод, осигурих ролковото серво. частите са специално проектирани да монтират лесно сервомоторите MG995

Стъпка 6: Връзки

Връзки
Връзки

В схемата на веригата можете да използвате или доларов конвертор, или 7805 регулатор на напрежението IC, за да преобразувате 8V в 5 V. Микроконтролерът, който е даден на електрическата схема, е Arduino Nano, можете да използвате и Arduino Uno, Arduino Mega.

Пиновете SCL и SDA на MPU 6050 са свързани към аналоговия щифт A5 и A4 на Arduino. (SCL и SDA щифтът може да варира, затова проверете листа с данни за SCl и SDA щифтове за друг микроконтролер)

Стъпка 7: Свързване с IC регулатор на напрежение 7805

Връзка с IC регулатор на напрежение 7805
Връзка с IC регулатор на напрежение 7805

Тази схема е за свързване на регулатор на напрежение 7805 ic, свържете 8v батерията на Vin и ще получите изходно напрежение 5v.

Стъпка 8: Кодиране

Трябва да включите следните библиотеки:

1) #include Кликнете тук, за да изтеглите zip файл

2) #include Кликнете тук, за да изтеглите zip файл

След като изтеглите zip файла, добавете zip библиотека в скицата на arduino

За код

/*

DIY Gimbal - Учебен код за MPU6050 Arduino, базиран на примера MPU6050_DMP6 от библиотеката i2cdevlib от Джеф Роуберг: https://github.com/jrowberg/i2cdevlib */// I2Cdev и MPU6050 трябва да бъдат инсталирани като библиотеки или иначе.cpp/.h файлове // и за двата класа трябва да са в пътя за включване на вашия проект #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // #include "MPU6050.h" // не е необходимо, ако използвате MotionApps include file / / Библиотеката на Arduino Wire се изисква, ако I2Cdev I2CDEV_ARDUINO_WIRE внедряване // се използва в I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // адресът по подразбиране на I2C е 0x68 // специфичен I предава се като параметър тук // AD0 ниско = 0x68 (по подразбиране за пробив на SparkFun и табло за оценка InvenSense) // AD0 високо = 0x69 MPU6050 mpu; // MPU6050 mpu (0x69); // <- използвайте за AD0 high // Определете 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; // задайте true, ако 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] кватернион контейнер VectorInt16 aa; // [x, y, z] измервания на сензора за ускорение VectorInt16 aaReal; // [x, y, z] измервания на сензора за ускорение без гравитация VectorInt16 aaWorld; // [x, y, z] измервания на сензора за ускорение в световната рамка VectorFloat гравитация; // [x, y, z] гравитационен вектор поплавък euler [3]; // [psi, theta, phi] Ъглов ъглов контейнер поплавък ypr [3]; // [криволичене, стъпка, преобръщане] криволичене/стъпка/ролка контейнер и гравитационен вектор // структура на пакета за демонстрация на чайник InvenSense uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // ================================================ ================ // === ПРОГРАМА ЗА ОТКРИВАНЕ НА ПРЕКРАТИ === // ===================== ============================================ летливи bool mpuInterrupt = false; // указва дали прекъсването на прекъсването на MPU е високо void dmpDataReady () {mpuInterrupt = true; } // ================================================= ================= // === ИНИЦИАЛНА НАСТРОЙКА === // ===================== =========================================== void setup () {// присъединете се към I2C шина (библиотеката I2Cdev не прави това автоматично) #ако I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400kHz I2C часовник. Коментирайте този ред, ако имате затруднения при компилирането #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, вярно); #endif // инициализира серийна комуникация // (115200 избрано, защото е необходимо за изхода на Teapot Demo, но // наистина зависи от вас в зависимост от вашия проект) Serial.begin (38400); while (! Сериен); // изчакваме изброяването на Leonardo, други продължават незабавно // инициализираме устройството //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, ако е така) if (devStatus == 0) {// включете DMP, сега, когато е готов // Serial.println (F ("Активиране DMP … ")); mpu.setDMPEnabled (вярно); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // задаваме флага на DMP Ready, така че функцията main loop () да знае, че е добре да го използваме //Serial.println(F("DMP готов! Изчакване на първо прекъсване … ")); dmpReady = вярно; // получаваме очаквания размер на пакета DMP за по -късно сравнение packetSize = mpu.dmpGetFIFOPacketSize (); } else {// ГРЕШКА! // 1 = първоначално зареждане на паметта неуспешно // 2 = актуализации на конфигурацията на DMP неуспешно // (ако ще се прекъсне, обикновено кодът ще бъде 1) // Serial.print (F ("DMP Initialization failed (code"))); //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 пакет е наличен / / (това ни позволява незабавно да прочетем повече, без да чакаме прекъсване).dmpGetYawPitchRoll (ypr, & q, & gravity); // Стойности на изкривяване, височина, ролка - радиани до градуси 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]; // Отклонението започва на произволна стойност, така че улавяне на последната стойност след 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: Заключение

Моля, обърнете внимание, че това далеч не е добър камерен кардан. Движенията не са плавни, защото тези сервомотори не са предназначени за такава цел. Истинските кардани на камерата използват специален тип BLDC мотор за получаване на плавни движения. Така че, помислете за този проект само с образователна цел.

Това би било всичко за този урок, надявам се да ви е харесал и да сте научили нещо ново. Чувствайте се свободни да зададете всеки въпрос в секцията за коментари по -долу и не забравяйте да проверите моите колекции от проекти

Препоръчано: