Мазмуну:
- 1 -кадам: Компоненттердин тизмеси
- 2 -кадам: чогултуу
- 3 -кадам:
- 4 -кадам: Кийинки, ошол эле ыкманы колдонуу менен мен Roll Servo камсыз кылдым. Бөлүктөр атайын MG995 серволорун оңой орнотуу үчүн иштелип чыккан
- 5 -кадам: Кийинки, ошол эле ыкманы колдонуу менен мен Roll Servo камсыз кылдым. Бөлүктөр атайын MG995 серволорун оңой орнотуу үчүн иштелип чыккан
- 6 -кадам: Байланыштар
- 7 -кадам: 7805 Voltage Regulator IC менен туташуу
- 8 -кадам: Коддоо
- 9 -кадам: Бардык компоненттер туташканда, бул сүрөттө окшош
- 10 -кадам: Эми бардык базалык нерселерди тамактын ичине салыңыз
- 11 -кадам: Бардык зымдар жана компоненттер тамактын ичине жайгаштырылганда, анда көбүк тактасынын базасында клей мылтыгын колдонсо болот
- 12 -кадам: Жыйынтык
Video: Motion Control Gimbal: 12 кадам
2024 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2024-01-30 10:36
Баарына Салам, Менин атым Харжи Наги. Мен учурда Канпурдун (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 серволорун оңой орнотуу үчүн иштелип чыккан
5 -кадам: Кийинки, ошол эле ыкманы колдонуу менен мен 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 чыңалуу жөндөгүчүнүн 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 моторунун өзгөчө түрүн колдонушат. Андыктан, бул долбоорду билим берүү максатында гана караңыз.
Мунун баары окуу куралы үчүн болмок, сизге жакты жана жаңы нерсени үйрөндүңүз деп үмүттөнөм. Төмөндөгү комментарийлер бөлүмүндө кандайдыр бир суроо берүүдөн тартынбаңыз жана долбоордун коллекцияларын текшерүүнү унутпаңыз
Сунушталууда:
Gimbal Stabilizer Project: 9 Кадам (Сүрөттөр менен)
Gimbal Stabilizer Project: Gimbal кантип жасалат? Сиздин камераңыз үчүн 2 октук гимбал жасоону үйрөнүңүз Бүгүнкү күндө биз маданиятты баарыбыз видеого тартып, көз ирмемдерди тартып алууну жакшы көрөбүз, айрыкча мен сыяктуу контент жаратуучу болгондо, сиз, албетте, ушундай титиреген видео
Micro менен жөнөкөй Gimbal: бит жана 2 сервос: 4 кадам
Simple Gimbal with Micro: bit and 2 Servos: Hi! Бүгүн мен сизге жөнөкөй гимбал стабилизаторун кантип жасоону көрсөтөм. Сиз YouTube видеосун бул жерден көрө аласыз. Ал жарык камерасын кармайт. Бирок, эгер сиз күчтүү сервос жана структураны койсоңуз, анда ал смартфонуңузду, же туура камераңызды кармап турушу мүмкүн
Time Lapse Rail үчүн Motion Control Slider: 10 кадам (Сүрөттөр менен)
Time Lapse Rail үчүн Motion Control Slider: Бул үйрөткүч Arduino башкарган тепкич моторун колдонуп, убакыттын өтүү темир жолун моторлоштурууну түшүндүрөт. Биз, негизинен, сизде моторлоштурууну каалаган темир жол бар деп ойлогон тепкич моторун кыймылга келтирүүчү кыймылдаткычка токтолобуз
GoPro Arduino колдонуу үчүн Roll and Pitch Axis Gimbal - Servo жана MPU6050 Gyro: 4 кадам
GoPro Arduino - Servo жана MPU6050 Gyro колдонуу үчүн Roll and Pitch Axis Gimbal: Бул көрсөтмө Түштүк Флорида университетинин Макекурсунун долбоорунун талабын аткаруу үчүн түзүлгөн (www.makecourse.com) Бул долбоордун максаты - GoPro үчүн 3 огу Gimbal Arduino нано + 3 серво кыймылдаткычтарын колдонуу менен
Киришүү - DIY Gimbal Mount Gopro Session, ж.б .: 5 кадам (Сүрөттөр менен)
Киришүү - DIY Gimbal Mount for Gopro Session, ж.б .: Мен ар кандай уюлдук телефон гимбал менен иштей турган чечимди издөөгө өтө көп убакыт короттум - GoPro сессиясын орнотуунун жолу. Акыры өзүмдүкүн жасоону чечтим. Ушул эле монтаж башка GoPro камералары үчүн да иштейт - жөн эле резина боолор менен орнотуңуз. Мен