Բովանդակություն:

Motion Control Gimbal: 12 քայլ
Motion Control Gimbal: 12 քայլ

Video: Motion Control Gimbal: 12 քայլ

Video: Motion Control Gimbal: 12 քայլ
Video: DJI RS 3 Gimbal Tutorial 1: Running, Flashlight, FPV, 3D 360 Roll 2024, Սեպտեմբեր
Anonim
Image
Image

Ողջույն բոլորին, իմ անունը Հարջի Նագի է: Ես այժմ երկրորդ կուրսի ուսանող եմ, ով սովորում է էլեկտրոնիկա և հաղորդակցության ճարտարագիտություն Pranveer Singh Institute of Technology, Kanpur (UP) - ից: Ես մեծ հետաքրքրություն ունեմ ռոբոտաշինության, arduino- ի, արհեստական բանականության և անալոգային էլեկտրոնիկայի նկատմամբ:

«Գիմբալ» բառը սահմանվում է որպես առանցքային հենարան, որը թույլ է տալիս պտտել ցանկացած առարկա մեկ առանցքում: Այսպիսով, երեք առանցքի գիմբալը թույլ է տալիս, որ գիմբալի վրա տեղադրված ցանկացած առարկա անկախ լինի գիմբալը պահողի շարժումից: Գիմբալը թելադրում է ոչ թե այն կրող, այլ օբյեկտի շարժումը:

Այն բաղկացած է 3 առանցքի կառավարման 3 MG996R servo շարժիչներից և հիմքից, որի վրա տեղադրվելու են MPU6050 սենսորը, Arduino- ն և մարտկոցը: Այն օգտագործվում է տեսախցիկը կայունացնելու համար ՝ առանց թրթռումների: 3 առանցքի գիմբալը երաշխավորում է, որ տեսախցիկի շարժումը կայունանում է, նույնիսկ եթե այն բռնողը վեր ու վար է գնում, ձախ և աջ, առջև և հետև: Սա այն է, ինչ մենք անվանում ենք yaw, pitch և roll կայունացում:

Քայլ 1: Բաղադրիչների ցուցակ

Բաղադրիչների ցանկն են ՝

1) Arduino Uno

2) 8V, 1.5 Amp մարտկոց Arduino Uno- ն սնուցելու համար

3) 7805 Լարման կարգավորիչ Ic կամ կարող եք օգտագործել կոնվեկտոր

4) MPU 6050

5) 3*(MG995 SERVO Motors)

6) Jumper լարերը

Այլ սարքավորումներ

1) Sոդման երկաթ

2) Սոսինձ ատրճանակ

3) Հորատման մեքենա

4) Սննդամթերք

Հացաբուլկեղեն օգտագործելու փոխարեն, ես օգտագործում եմ փոքրիկ պաստառային տախտակ `դրական և բացասական ավտոբուսային միացման համար:

Քայլ 2: հավաքում

Հավաքում
Հավաքում
Հավաքում
Հավաքում

Փրփուրը, փրփուրի տախտակը կամ թղթի երեսպատված փրփուրը թեթև և հեշտությամբ կտրվող նյութ է, որն օգտագործվում է Servo շարժիչը տեղադրելու և մասշտաբի մոդելներ պատրաստելու համար:

Սկզբում ես փրփուր տախտակի օգնությամբ servo շարժիչ տեղադրելու համար պատրաստեցի DI-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: Միացումներ

Միացումներ
Միացումներ

Շղթայական դիագրամում կարող եք օգտագործել կամ փոխարկիչ, կամ 7805 Լարման կարգավորիչ IC ՝ 8 Վ -ը 5 Վ փոխարկելու համար: Միկրոկոնտրոլերը, որին տրված է սխեմայի սխեման, Arduino Nano- ն է, կարող եք նաև օգտագործել Arduino Uno, Arduino Mega:

MPU 6050 -ի SCL և SDA կապերը միացված են Arduino Analog A5 և A4 կապին: (SCL և SDA քորոցները կարող են տարբեր լինել, այնպես որ ստուգեք SCl և SDA կապերի տվյալների թերթիկը այլ միկրոկոնտրոլերի համար)

Քայլ 7: Միացում 7805 Լարման կարգավորիչ IC- ի հետ

Միացում 7805 Լարման կարգավորիչ IC- ի հետ
Միացում 7805 Լարման կարգավորիչ IC- ի հետ

Այս սխեմայի դիագրամը նախատեսված է 7805 լարման կարգավորիչի ic- ի միացման համար, միացրեք 8 վ մարտկոցը Vin- ում և կստանաք 5 վ ելքային լարում:

Քայլ 8: Կոդավորում

Դուք պետք է ներառեք հետևյալ գրադարանները.

1) #includeClick Heret ՝ zip ֆայլը ներբեռնելու համար

2) #include Սեղմեք այստեղ ՝ zip ֆայլը ներբեռնելու համար

ZIP ֆայլը ներբեռնելուց հետո ավելացրեք zip գրադարան arduino ուրվագծում

Կոդի համար

/*

DIY Gimbal - MPU6050 Arduino ձեռնարկի ծածկագիր ՝ հիմնված MPU6050_DMP6 օրինակի վրա i2cdevlib գրադարանից ՝ ffեֆ Ռոուբերգի կողմից. Https://github.com/jrowberg/i2cdevlib */// I2Cdev և MPU6050 պետք է տեղադրվեն որպես գրադարաններ, կամ..h ֆայլերը // երկու դասերի համար էլ պետք է լինեն ձեր նախագծի ներառման ուղու մեջ #ներառել «I2Cdev.h» #ներառել «MPU6050_6Axis_MotionApps20.h» // #ներառել «MPU6050.h» // անհրաժեշտ չէ, եթե օգտագործում եք MotionApps ֆայլը / / Arduino Wire գրադարանը պահանջվում է, եթե I2Cdev I2CDEV_ARDUINO_WIRE իրականացումը // օգտագործվում է I2Cdev.h #եթե I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // դասի կանխադրված I2C հասցեն կարող է լինել 0x68 // հատուկ I անցել է որպես պարամետր այստեղ // AD0 ցածր = 0x68 (կանխադրված SparkFun- ի ճեղքման և InvenSense գնահատման տախտակի համար) // AD0 բարձր = 0x69 MPU6050 mpu; // MPU6050 մպ (0x69); // <- օգտագործել բարձր AD0- ի համար // Սահմանել 3 servo շարժիչներ Servo servo0; Servo servo1; Servo servo2; բոցը ճիշտ է; int j = 0; #սահմանեք OUTPUT_READABLE_YAWPITCHROLL #սահմանեք 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 պահեստավորման բուֆեր // կողմնորոշում/շարժում vars Quaternion q; // [w, x, y, z] քառորդ կոնտեյներ VectorInt16 aa; // [x, y, z] accel տվիչ չափումներ VectorInt16 aaReal; // [x, y, z] առանց ինքնահոս արագացման տվիչների չափումներ VectorInt16 aaWorld; // [x, y, z] համաշխարհային շրջանակի արագացուցիչ սենսորային չափումներ VectorFloat gravity; // [x, y, z] ինքնահոս վեկտորը float euler [3]; // [psi, theta, phi] Euler angle container container float ypr [3]; /, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // ================================================ ================= ============================================ անկայուն բոլ mpuInterrupt = false; // ցույց է տալիս, արդյոք MPU- ի ընդհատման քորոցը բարձր է անվավեր dmpDataReady () {mpuInterrupt = true; } // =============================================== ================= // === Նախնական կարգավորումներ === // ===================== =========================================== անվավեր կարգավորում () {// միանալ I2C ավտոբուսին (I2Cdev գրադարանը դա ինքնաբերաբար չի անում) #եթե I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400kHz I2C ժամացույց: Մեկնաբանեք այս տողը, եթե կազմման դժվարություններ ունեք #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, true); #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 ("Enabling DMP… ")); mpu.setDMP Միացված է (ճշմարիտ); 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 failed (code")); //Serial.print(devStatus); //Serial.println (F (")")); } // Սահմանեք այն կապերը, որոնց միացված են 3 servo շարժիչները servo0.attach (10); servo1.attach (9); servo2.attach (8); } // =============================================== ================= // === ՀԻՄՆԱԿԱՆ GRՐԱԳՐԻ LՐԱԳԻՐ === // ==================== ============================================ դատարկ հանգույց () { / / եթե ծրագրավորումը ձախողվեց, մի փորձեք որևէ բան անել, եթե (! dmpReady) վերադառնա; // սպասեք MPU- ի ընդհատմանը կամ լրացուցիչ փաթեթին (ներին) մինչև (! mpuInterrupt && fifoCount <packetSize) {if (mpuInterrupt && fifoCount

= 1024) {

// վերականգնել, որպեսզի կարողանանք մաքուր շարունակել mpu.resetFIFO (); fifoCount = mpu.getFIFOCount (); Serial.println (F ("FIFO overflow!")); // հակառակ դեպքում, ստուգեք DMP տվյալների պատրաստ ընդհատումը (դա պետք է հաճախ տեղի ունենա)} այլ դեպքում, եթե (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// սպասեք տվյալների հասանելի ճիշտ երկարությանը, պետք է լինի շատ կարճ սպասելիս (հասանելի է FiveoCount 1 փաթեթ /) / (սա թույլ է տալիս մեզ անմիջապես կարդալ ավելին ՝ առանց ընդմիջման սպասելու) fifoCount -= packetSize; // Get Yaw, Pitch and Roll արժեքները #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGuity &);: 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 = սերվոյի կառավարման համար պիտանի արժեքներ = քարտեզ (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 servo- ն, եթե ցանկանում եք պարզապես կայունացում X և Y առանցքների համար և օգտագործել այս հարթակը որպես խցիկի գիմբալ:

Քայլ 9. Երբ բոլոր բաղադրիչները միացված են, դրա տեսքը նման է այս նկարին

Երբ բոլոր բաղադրիչները միացված են, դրա տեսքը նման է այս նկարին
Երբ բոլոր բաղադրիչները միացված են, դրա տեսքը նման է այս նկարին

Քայլ 10: Այժմ տեղադրեք ամբողջ հիմքը սննդի տարայի ներսում

Այժմ տեղադրեք բոլոր հիմնական իրերը սննդի տարայի ներսում
Այժմ տեղադրեք բոլոր հիմնական իրերը սննդի տարայի ներսում

Քայլ 11. Երբ բոլոր լարերը և բաղադրիչները տեղադրվեն սննդի ներսում, այնուհետև կարող են սոսինձ կիրառել փրփուրի հիմքի վրա:

Երբ բոլոր լարերը և բաղադրիչները տեղադրվում են սննդի ներսում, այնուհետև կարող եք կիրառել սոսինձ ատրճանակ `փրփուրի հիմքի վրա
Երբ բոլոր լարերը և բաղադրիչները տեղադրվում են սննդի ներսում, այնուհետև կարող եք կիրառել սոսինձ ատրճանակ `փրփուրի հիմքի վրա

Քայլ 12: Եզրակացություն

Խնդրում ենք նկատի ունենալ, որ սա հեռու է լավ տեսախցիկի հնարքից: Շարժումները հարթ չեն, քանի որ այդ սերվոները նախատեսված չեն նման նպատակի համար: Իրական տեսախցիկի գիմբալները սահուն շարժումներ կատարելու համար օգտագործում են BLDC շարժիչի հատուկ տեսակ: Այսպիսով, հաշվի առեք այս նախագիծը միայն կրթական նպատակով:

Սա ամեն ինչ կլիներ այս ձեռնարկի համար: Հուսով եմ, որ այն ձեզ դուր եկավ և ինչ -որ նոր բան սովորեցիք: Ազատորեն տվեք ցանկացած հարց ստորև բերված մեկնաբանությունների բաժնում և մի մոռացեք ստուգել նախագծի հավաքածուները

Խորհուրդ ենք տալիս: