Мазмуну:

Motion Control Gimbal: 12 кадам
Motion Control Gimbal: 12 кадам

Video: Motion Control Gimbal: 12 кадам

Video: Motion Control Gimbal: 12 кадам
Video: 220 В от автомобильного генератора переменного тока 12 В с солнечной панелью 2024, Июль
Anonim
Image
Image

Баарына Салам, Менин атым Харжи Наги. Мен учурда Канпурдун (UP) Технология Институтунун электроника жана байланыш инженериясы боюнча экинчи курсунун студентимин. Мен робототехникага, ардуино, Жасалма интеллект жана аналогдук электроникага абдан кызыгам.

"Гимбал" сөзү кандайдыр бир объекттин бир окто айланышына мүмкүндүк берүүчү айланма таяныч катары аныкталат. Ошентип, үч огу бар гимбал гимбалга орнотулган нерсенин гимбалды кармагандын кыймылынан көз карандысыз болушуна мүмкүндүк берет. Гимбал объекттин кыймылын эмес, аны алып жүргөндү башкарат.

Бул 3 огунун көзөмөлү үчүн 3 MG996R серво моторунан жана MPU6050 сенсору, Arduino жана батарея жайгаштырыла турган базадан турат. Бул камераны вибрациясыз стабилдештирүү үчүн колдонулат. 3 октук гимбал камеранын кыймылынын турукташуусун камсыз кылат, аны кармаган адам өйдө-ылдый, солго жана оңго, алдыңкы жана артка карай баратса дагы. Бул биз yaw, pitch жана roll stabilization деп атаган нерсебиз.

1 -кадам: Компоненттердин тизмеси

Компоненттердин тизмеси төмөнкүлөр:

1) Arduino Uno

2) 8V, 1.5 Amp Батарея Arduino Uno иштетүү үчүн

3) 7805 Voltage жөнгө салуучу Ic же сиз buck conveter колдоно аласыз

4) MPU 6050

5) 3*(MG995 SERVO Motors)

6) Jumper Wires

Башка жабдуулар:

1) ширетүүчү темир

2) желим тапанча

3) Бургулоочу машина

4) Тамак -аш

Нанборадды колдонуунун ордуна, мен автобуска оң жана терс байланыш үчүн кичинекей атайын программанын тактасын колдоном

2 -кадам: чогултуу

Чогултуу
Чогултуу
Чогултуу
Чогултуу

Foamcore, пенопласт же кагаз бети көбүк такта-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 Converter же 7805 Voltage Regulator ICди колдоно аласыз. Микроконтроллер схемасы Arduino Nano, сиз Arduino Uno, Arduino Mega да колдоно аласыз.

MPU 6050нин SCL жана SDA төөнөгүчтөрү Arduino Analog pin A5 жана A4 менен туташкан. (SCL жана SDA пини башка болушу мүмкүн, андыктан башка микроконтроллер үчүн SCl жана SDA казыктары үчүн маалымат барагын караңыз)

7 -кадам: 7805 Voltage Regulator IC менен туташуу

7805 Voltage Regulator IC менен туташуу
7805 Voltage Regulator IC менен туташуу

Бул схема 7805 чыңалуу жөндөгүчүнүн ic'ине туташуу үчүн арналган, 8v батарейкасын Винге туташтырыңыз жана сиз 5в вольттук чыңалууга ээ болосуз.

8 -кадам: Коддоо

Сизге төмөнкү китепканалар камтылышы керек:

1) #includeClick Hereto zip файлын жүктөө

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

ZIP файлын жүктөп алгандан кийин, zdu китепканасын arduino эскизине кошуңуз

Код үчүн

/*

DIY Gimbal - MPU6050 Arduino Tutorial Code, 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 дареги I2C болушу мүмкүн бул жерде параметр катары өттү // AD0 төмөн = 0x68 (SparkFun сынуусу жана InvenSense баалоо тактасы үчүн демейки) // AD0 жогорку = 0x69 MPU6050 мпу; // MPU6050 мпу (0x69); // <- AD0 бийиктиги үчүн колдонуу // 3 servo моторун аныктаңыз Servo servo0; Servo servo1; Servo servo2; туура сүзүү; int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #INTERRUPT_PIN 2ди аныктоо // Arduino Uno боюнча 2 -пинди колдонуңуз & көпчүлүк такталар bool blinkState = false; // MPU көзөмөлү/статусу бар 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] төрттүк контейнери 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] 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; } // ============================================== ================= // === БАШТАП Жөнгө салуу === // =================== =========================================== Void setup () {// 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 тандалган, анткени ал Чайнек Демо чыгаруу үчүн талап кылынат, бирок бул чындыгында сиздин долбоорго жараша болот) Serial.begin (38400); while (! Сериялык); // Леонардонун саналышын күтө туруңуз, башкалар дароо улантышат // түзмөктү инициализациялоо //Serial.println(F("I2Initializing 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 Initialization ишке ашкан жок (код")); //Serial.print(devStatus); //Serial.println (F (")"))); } // 3 servo мотор 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 & gretGrGrity;.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го чейин servo башкаруу үчүн ылайыктуу маанилерге караңыз 0 ден 180 int 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) боюнча серволорду көзөмөлдөө; servo1.write (servo1Value); servo2.write (servo2Value); } #endif}}

Акыр -аягы, жазуу функциясын колдонуп, биз бул баалуулуктарды башкаруу сигналдары катары серволорго жөнөтөбүз. Албетте, сиз Yaw сервосун өчүрө аласыз, эгер сиз X жана Y огуна стабилдештирүүнү кааласаңыз жана бул платформаны камера гимбалы катары колдонсоңуз болот

9 -кадам: Бардык компоненттер туташканда, бул сүрөттө окшош

Бардык компоненттер туташканда, бул сүрөттө окшош
Бардык компоненттер туташканда, бул сүрөттө окшош

10 -кадам: Эми бардык базалык нерселерди тамактын ичине салыңыз

Эми бардык базалык нерселерди тамактын ичине салыңыз
Эми бардык базалык нерселерди тамактын ичине салыңыз

11 -кадам: Бардык зымдар жана компоненттер тамактын ичине жайгаштырылганда, анда көбүк тактасынын базасында клей мылтыгын колдонсо болот

Бардык зымдар жана компоненттер тамактын ичине жайгаштырылганда, көбүк тактайынын базасына клей мылтыгын колдонсо болот
Бардык зымдар жана компоненттер тамактын ичине жайгаштырылганда, көбүк тактайынын базасына клей мылтыгын колдонсо болот

12 -кадам: Жыйынтык

Сураныч, муну жакшы камералык гимбалдан алысыраак болгула. Кыймылдар жылмакай эмес, анткени бул серверлер мындай максатта иштелип чыккан эмес. Реалдуу камера гимбалдары жылмакай кыймылдарды алуу үчүн BLDC моторунун өзгөчө түрүн колдонушат. Андыктан, бул долбоорду билим берүү максатында гана караңыз.

Мунун баары окуу куралы үчүн болмок, сизге жакты жана жаңы нерсени үйрөндүңүз деп үмүттөнөм. Төмөндөгү комментарийлер бөлүмүндө кандайдыр бир суроо берүүдөн тартынбаңыз жана долбоордун коллекцияларын текшерүүнү унутпаңыз

Сунушталууда: