Obsah:

Gimbal na ovládanie pohybu: 12 krokov
Gimbal na ovládanie pohybu: 12 krokov

Video: Gimbal na ovládanie pohybu: 12 krokov

Video: Gimbal na ovládanie pohybu: 12 krokov
Video: 🟠 HOTWAV NOTE 12 - ДЕТАЛЬНЫЙ ОБЗОР и ТЕСТЫ 2024, November
Anonim
Image
Image

Ahoj všetci, volám sa Harji Nagi. Momentálne som študentom druhého ročníka študujúcim elektroniku a komunikačné inžinierstvo na Technologickom inštitúte Pranveer Singh v Kanpure (UP). Mám veľký záujem o robotiku, arduino, umelú inteligenciu a analógovú elektroniku.

Slovo „kardan“je definované ako otočná podpera, ktorá umožňuje otáčanie akéhokoľvek objektu v jednej osi. Trojosový záves teda umožňuje, aby akýkoľvek predmet namontovaný na závese bol nezávislý na pohybe toho, ktorý drží záves. Gimbal určuje pohyb predmetu, nie toho, ktorý ho nesie.

Skladá sa z 3 servomotorov MG996R pre 3-osové ovládanie a základne, na ktorej bude umiestnený senzor MPU6050, Arduino a batéria. Slúži na stabilizáciu fotoaparátu bez vibrácií. 3-osý kardan zaisťuje, že pohyb kamery je stabilizovaný, aj keď ten, kto ju drží, ide hore a dole, vľavo a vpravo, vpredu a vzadu. To je to, čo nazývame stabilizácia vybočenia, rozstupu a valenia.

Krok 1: Zoznam komponentov

Zoznam komponentov je:

1) Arduino Uno

2) 8 V, 1,5 A batéria pre napájanie Arduino Uno

3) 7805 Regulátor napätia Ic alebo môžete použiť Buck Converter

4) MPU 6050

5) 3*(Motory MG995 SERVO)

6) Prepojovacie vodiče

Ďalšie vybavenie:

1) Spájkovačka

2) Lepiaca pištoľ

3) Vŕtačka

4) Jedlo môže

Namiesto použitia breadborad som použil malú vlastnú výkonnú dosku na pozitívne a negatívne pripojenie zbernice

Krok 2: Zostavenie

Montáž
Montáž
Montáž
Montáž

Foamcore, penová doska alebo penová doska s papierovým povrchom je ľahký a ľahko rezateľný materiál používaný na montáž servomotora a výrobu zmenšených modelov.

Najprv som vyrobil DIY konzoly v tvare L na montáž servomotora pomocou penovej dosky.

Krok 3:

Obrázok
Obrázok

Zostavenie závesu bolo celkom jednoduché. Začal som s inštaláciou serva Yaw, senzora MPU 6050 a vypínača ON-OFF. Pomocou skrutiek a matíc som ho pripevnil k základni

Krok 4: Ďalej som rovnakou metódou zaistil servo Roll. diely sú špeciálne navrhnuté tak, aby sa dali ľahko namontovať na serva MG995

Ďalej som rovnakou metódou zaistil servo rolky. diely sú špeciálne navrhnuté tak, aby sa dali ľahko namontovať na serva MG995
Ďalej som rovnakou metódou zaistil servo rolky. diely sú špeciálne navrhnuté tak, aby sa dali ľahko namontovať na serva MG995

Krok 5: Ďalej som rovnakou metódou zaistil servo Roll. diely sú špeciálne navrhnuté tak, aby sa dali ľahko namontovať na servá MG995

Ďalej som rovnakou metódou zaistil servo rolky. diely sú špeciálne navrhnuté tak, aby sa dali ľahko namontovať na servá MG995
Ďalej som rovnakou metódou zaistil servo rolky. diely sú špeciálne navrhnuté tak, aby sa dali ľahko namontovať na servá MG995

Krok 6: Pripojenia

Pripojenia
Pripojenia

V schéme zapojenia môžete použiť buď prevodník buck alebo IC regulátor napätia 7805 na konverziu 8 V na 5 V. Mikrokontrolér, ktorému je priradená schéma zapojenia, je Arduino Nano, môžete tiež použiť Arduino Uno, Arduino Mega.

Piny SCL a SDA MPU 6050 sú pripojené k analógovému kolíku Arduino A5 a A4. (Kolíky SCL a SDA sa môžu líšiť, preto si pozrite technický list pinov SCl a SDA pre iný mikrokontrolér)

Krok 7: Pripojenie pomocou integrovaného obvodu regulátora napätia 7805

Pripojenie pomocou integrovaného regulátora napätia 7805
Pripojenie pomocou integrovaného regulátora napätia 7805

Táto schéma zapojenia je na pripojenie ic regulátora napätia 7805, pripojte 8v batériu na Vin a dostanete výstupné napätie 5v.

Krok 8: Kódovanie

Musíte zahrnúť nasledujúce knižnice:

1) #includeKliknutím sem stiahnete súbor zip

2) #includeKliknutím sem stiahnete súbor zip

Po stiahnutí súboru zip pridajte knižnicu zip do skici arduino

Pre kód

/*

DIY Gimbal - výukový kód Arduino MPU6050 na základe príkladu MPU6050_DMP6 z knižnice i2cdevlib od Jeffa Rowberga: https://github.com/jrowberg/i2cdevlib */// I2Cdev a MPU6050 musia byť nainštalované ako knižnice, inak.cpp/.h súbory // pre obidve triedy musia byť v ceste zahrnutia vášho projektu #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // #include "MPU6050.h" // nie je potrebné, ak používate MotionApps zahrnúť súbor / / Knižnica Arduino Wire je potrebná, ak sa v I2Cdev používa implementácia I2Cdev I2CDEV_ARDUINO_WIRE // // #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // predvolená adresa I2C triedy môže byť 0x68 // špecifické adresy I2C môžu byť prešlo ako parameter sem // AD0 low = 0x68 (predvolené pre SparkFun breakout a hodnotiacu dosku InvenSense) // AD0 high = 0x69 MPU6050 mpu; // MPU6050 mpu (0x69); // <- použitie pre AD0 vysoký // Definujte 3 servomotory Servo servo0; Servo servo1; Servo servo2; správne plávať; int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #define INTERRUPT_PIN 2 // použitie pinu 2 na Arduino Uno & väčšina dosiek bool blinkState = false; // MPU control/status vars bool dmpReady = false; // set true, ak bol DMP init úspešný uint8_t mpuIntStatus; // uchováva bajt skutočného stavu prerušenia z MPU uint8_t devStatus; // návrat stavu po každej operácii zariadenia (0 = úspech,! 0 = chyba) uint16_t packetSize; // očakávaná veľkosť paketu DMP (predvolená hodnota je 42 bajtov) uint16_t fifoCount; // počet všetkých bajtov aktuálne vo FIFO uint8_t fifoBuffer [64]; // Vyrovnávacia pamäť FIFO // orientácia/pohyb vars Quaternion q; // [w, x, y, z] kvartérny kontajner VectorInt16 aa; // [x, y, z] merania snímača zrýchlenia VectorInt16 aaReal; // [x, y, z] merania gravitačného senzora zrýchlenia VectorInt16 aaWorld; // [x, y, z] merania snímača zrýchlenia vo svetovom rámci VectorFloat gravitácia; // [x, y, z] gravitačný vektorový plavákový euler [3]; // [psi, theta, phi] Eulerov uholný kontajner float ypr [3]; // [vybočenie, rozstup, zvinutie] vybočenie/rozteč/zvinutie kontajnera a gravitačný vektor // štruktúra paketu pre ukážku čajníka InvenSense uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // ======================================================================== ================> =============================================================================================================================================== // indikuje, či pin prerušenia MPU dosiahol vysokú neplatnosť dmpDataReady () {mpuInterrupt = true; } // ===================================================================== ================== // === Počáteční nastavení === // ======================== ================================================= neplatné nastavenie () {// pripojiť sa na zbernicu I2C (knižnica I2Cdev to nerobí automaticky) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400kHz hodiny I2C. Komentujte tento riadok, ak máte problémy so kompiláciou #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, true); #endif // inicializácia sériovej komunikácie // (115200 zvolených, pretože je to potrebné pre demo výstup Teapot, ale je to // skutočne na vás v závislosti od vášho projektu) Serial.begin (38400); while (! Serial); // počkajte na vyčíslenie Leonarda, ostatní pokračujú ihneď // inicializácia zariadenia //Serial.println(F("inicializácia zariadení I2C … ")); mpu.initialize (); pinMode (INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize (); // tu zadajte svoje vlastné gyroskopy, zmenšené na minimálnu citlivosť mpu.setXGyroOffset (17); mpu.setYGyroOffset (-69); mpu.setZGyroOffset (27); mpu.setZAccelOffset (1551); // 1688 výrobný štandard pre môj testovací čip // uistite sa, že funguje (ak je, vráti 0), ak (devStatus == 0) {// zapnite DMP, keď je pripravený // Serial.println (F ("Povolenie DMP … “)); mpu.setDMPEnabled (true); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // nastavte náš príznak DMP Ready, aby funkcia main loop () vedela, že je v poriadku ho používať //Serial.println(F("DMP pripravený! Čakanie na prvé prerušenie … ")); dmpReady = true; // získať očakávanú veľkosť paketu DMP pre neskoršie porovnanie packetSize = mpu.dmpGetFIFOPacketSize (); } else {// CHYBA! // 1 = úvodné načítanie pamäte zlyhalo // 2 = Aktualizácie konfigurácie DMP zlyhali // (ak sa má prerušiť, zvyčajne bude kód 1) // Serial.print (F ("Inicializácia DMP zlyhala (kód")); //Serial.print(devStatus); //Serial.println (F (")")); } // Definujte kolíky, ku ktorým sú pripojené 3 servomotory servo0.attach (10); servo1.attach (9); servo2.attach (8); } // ===================================================================== ================== //==== HLAVNÁ PROGRAMOVÁ SMYČKA === // ====================== ================================================== prázdna slučka () { / / ak programovanie zlyhalo, nepokúšajte sa urobiť nič, ak sa (! dmpReady) vráti; // počkajte na prerušenie MPU alebo ďalšie pakety dostupné počas (! mpuInterrupt && fifoCount <packetSize) {if (mpuInterrupt && fifoCount

= 1024) {

// reset, aby sme mohli čisto pokračovať mpu.resetFIFO (); fifoCount = mpu.getFIFOCount (); Serial.println (F ("Prepad FIFO!")); // inak skontrolujte prerušenie pripravenosti údajov DMP (to by sa malo často stávať)} inak, ak (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// počkajte na správnu dostupnú dĺžku údajov, malo by to byť VEĽMI krátke čakanie (k dispozícii je paket fifoCount 1 / / (to nám umožní okamžite prečítať viac bez čakania na prerušenie) fifoCount -= packetSize; // Získanie hodnôt vybočenia, rozstupu a rolovania #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravity, & q);.dmpGetYawPitchRoll (ypr, & q, & gravity); // Hodnoty vybočenia, rozstupu a zvitku - radiány v stupňoch ypr [0] = ypr [0] * 180 / M_PI; ypr [1] = ypr [1] * 180 / M_PI; ypr [2] = ypr [2] * 180 / M_PI; // Vynechajte 300 meraní (proces vlastnej kalibrácie), ak (j <= 300) {correct = ypr [0]; // Stáčanie sa začína náhodnou hodnotou, takže zachytiť poslednú hodnotu po 300 odčítaniach j ++;} // Po 300 odčítaniach iné {ypr [0] = ypr [0] - správne; // Nastaviť vybočenie na 0 stupňov - odpočítať poslednú náhodnú hodnotu vybočenia od aktuálnej hodnoty, aby sa Stáčanie 0 stupňov es // Namapujte hodnoty senzora MPU6050 od -90 do 90 na hodnoty vhodné pre ovládanie serva od 0 do 180 int servo0Value = mapa (ypr [0], -90, 90, 0, 180); int servo1Value = mapa (ypr [1], -90, 90, 0, 180); int servo2Value = mapa (ypr [2], -90, 90, 180, 0); // Ovládajte serva podľa orientácie MPU6050 servo0.write (servo0Value); servo1.write (servo1Value); servo2.write (servo2Value); } #koniec Ak } }

Nakoniec pomocou funkcie zápisu pošleme tieto hodnoty na servá ako riadiace signály. Servo Yaw môžete samozrejme deaktivovať, ak chcete iba stabilizáciu pre osi X a Y, a použiť túto platformu ako kardanový záves

Krok 9: Keď sú všetky súčasti prepojené, vyzerá to podobne ako na tomto obrázku

Keď sú všetky súčasti prepojené, vyzerá to podobne ako na tomto obrázku
Keď sú všetky súčasti prepojené, vyzerá to podobne ako na tomto obrázku

Krok 10: Teraz vložte všetky základné veci do nádoby na potraviny

Teraz vložte všetky základné veci do nádoby na potraviny
Teraz vložte všetky základné veci do nádoby na potraviny

Krok 11: Keď sú všetky drôty a súčasti umiestnené vo vnútri potraviny, môže sa na spodok penovej dosky naniesť lepiaca pištoľ

Keď sú všetky drôty a súčasti umiestnené vo vnútri potraviny, môže sa na spodok penovej dosky naniesť lepiaca pištoľ
Keď sú všetky drôty a súčasti umiestnené vo vnútri potraviny, môže sa na spodok penovej dosky naniesť lepiaca pištoľ

Krok 12: Záver

Upozorňujeme, že od dobrého kamerového závesu je to ďaleko. Pohyby nie sú plynulé, pretože tieto servá nie sú určené na takýto účel. Skutočné kardanové kardany používajú na plynulé pohyby špeciálny typ motora BLDC. Považujte tento projekt iba za vzdelávací účel.

To by bolo k tomuto návodu všetko, dúfam, že sa vám páčil a naučili ste sa niečo nové. Neváhajte sa opýtať na čokoľvek v nižšie uvedenej sekcii komentárov a nezabudnite si pozrieť moje zbierky projektu

Odporúča: