Obsah:

Motion Control Gimbal: 12 kroků
Motion Control Gimbal: 12 kroků

Video: Motion Control Gimbal: 12 kroků

Video: Motion Control Gimbal: 12 kroků
Video: DJI RS 3 Gimbal Tutorial 1: Running, Flashlight, FPV, 3D 360 Roll 2024, Červenec
Anonim
Image
Image

Ahoj všichni, jmenuji se Harji Nagi. V současné době jsem studentem druhého ročníku studia elektroniky a komunikačního inženýrství na Pranveer Singh Institute Of Technology, Kanpur (UP). Mám velký zájem o robotiku, arduino, umělou inteligenci a analogovou elektroniku.

Slovo „kardan“je definováno jako otočná podpora, která umožňuje otáčení jakéhokoli objektu v jedné ose. Tříosý závěs tedy umožňuje, aby jakýkoli předmět namontovaný na závěsu byl nezávislý na pohybu toho, který držel závěs. Gimbal diktuje pohyb předmětu, ne toho, který ho nese.

Skládá se ze 3 servomotorů MG996R pro 3osé ovládání a základny, na kterou bude umístěn senzor MPU6050, Arduino a baterie. Slouží k udržení kamery stabilizované bez vibrací. 3osý kardan zajišťuje, že pohyb kamery je stabilizován, i když ten, kdo ji drží, jde nahoru a dolů, doleva a doprava, vpředu a vzadu. To je to, čemu říkáme stabilizace vybočení, stoupání a náklonu.

Krok 1: Seznam součástí

Seznam součástí je:

1) Arduino Uno

2) 8V, 1,5 A baterie pro napájení Arduino Uno

3) 7805 Regulátor napětí Ic nebo můžete použít buck conveter

4) MPU 6050

5) 3*(Motory MG995 SERVO)

6) Propojovací vodiče

Další vybavení:

1) Páječka

2) Lepicí pistole

3) Vrtačka

4) Potravinová plechovka

Místo použití breadborad jsem použil malou vlastní perf desku pro pozitivní a negativní připojení sběrnice

Krok 2: Sestavení

Sestavování
Sestavování
Sestavování
Sestavování

Foamcore, pěnová deska nebo pěnová deska potažená papírem je lehký a snadno řezatelný materiál používaný k montáži servomotoru a výrobě zmenšených modelů.

Nejprve jsem vyrobil držáky ve tvaru písmene L pro montáž servomotoru pomocí pěnové desky.

Krok 3:

obraz
obraz

Sestavení závěsu bylo celkem snadné. Začal jsem instalací serva Yaw, snímače MPU 6050 a přepínače ON-OFF. Pomocí šroubů a matic jsem jej zajistil k základně

Krok 4: Dále jsem stejnou metodou zajistil Roll Servo. díly jsou speciálně navrženy tak, aby snadno pasovaly na serva MG995

Dále jsem stejnou metodou zajistil Roll Servo. díly jsou speciálně navrženy tak, aby snadno pasovaly na serva MG995
Dále jsem stejnou metodou zajistil Roll Servo. díly jsou speciálně navrženy tak, aby snadno pasovaly na serva MG995

Krok 5: Dále jsem stejnou metodou zajistil Roll Servo. díly jsou speciálně navrženy tak, aby snadno pasovaly na serva MG995

Dále jsem stejnou metodou zajistil Roll Servo. díly jsou speciálně navrženy tak, aby snadno pasovaly na serva MG995
Dále jsem stejnou metodou zajistil Roll Servo. díly jsou speciálně navrženy tak, aby snadno pasovaly na serva MG995

Krok 6: Připojení

Připojení
Připojení

Ve schématu zapojení můžete použít buď převodník buck nebo IC regulátor napětí 7805 k převodu 8 V na 5 V. Mikrokontrolér, kterému je přiřazeno schéma zapojení je Arduino Nano, můžete také použít Arduino Uno, Arduino Mega.

Piny SCL a SDA MPU 6050 jsou připojeny k analogovému kolíku Arduino A5 a A4. (Pin SCL a SDA se může lišit, proto si v datovém listu vyhledejte piny SCl a SDA pro jiný mikrokontrolér)

Krok 7: Připojení pomocí integrovaného regulátoru napětí 7805

Připojení pomocí integrovaného regulátoru napětí 7805
Připojení pomocí integrovaného regulátoru napětí 7805

Toto schéma zapojení je pro připojení ic regulátoru napětí 7805, připojte 8v baterii na Vin a získáte výstupní napětí 5v.

Krok 8: Kódování

Musíte zahrnout následující knihovny:

1) #includeClick Chcete -li stáhnout zip soubor

2) #includeKliknutím sem stáhnete soubor zip

Po stažení souboru zip přidejte knihovnu zip do skici arduino

Pro kód

/*

DIY Gimbal - výukový kód Arduino MPU6050 na základě příkladu MPU6050_DMP6 z knihovny i2cdevlib od Jeffa Rowberga: https://github.com/jrowberg/i2cdevlib */// I2Cdev a MPU6050 musí být nainstalovány jako knihovny, jinak.cpp/.h soubory // pro obě třídy musí být v cestě zahrnutí vašeho projektu #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // #include "MPU6050.h" // není nutné, pokud používáte MotionApps zahrnout soubor / / Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation // is used in I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // class default I2C address is 0x68 // specific I2C addresses may be předáno jako parametr zde // AD0 low = 0x68 (výchozí pro SparkFun breakout a InvenSense hodnotící tabule) // AD0 high = 0x69 MPU6050 mpu; // MPU6050 mpu (0x69); // <- použití pro AD0 high // Definujte 3 servomotory Servo servo0; Servo servo1; Servo servo2; plavat správně; int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #define INTERRUPT_PIN 2 // použijte pin 2 na Arduino Uno & většina desek bool blinkState = false; // MPU control/status vars bool dmpReady = false; // set true, pokud byl DMP init úspěšný uint8_t mpuIntStatus; // uchovává skutečný stavový byte přerušení z MPU uint8_t devStatus; // návrat stavu po každé operaci zařízení (0 = úspěch,! 0 = chyba) uint16_t packetSize; // očekávaná velikost paketu DMP (výchozí hodnota je 42 bajtů) uint16_t fifoCount; // počet všech bytů aktuálně ve FIFO uint8_t fifoBuffer [64]; // Vyrovnávací paměť FIFO // orientace/pohyb vars Quaternion q; // [w, x, y, z] čtveřičný kontejner VectorInt16 aa; // [x, y, z] měření senzoru zrychlení VectorInt16 aaReal; // [x, y, z] měření gravitačního snímače zrychlení VectorInt16 aaWorld; // [x, y, z] měření zrychleného snímače světového rámce VectorFloat gravitace; // [x, y, z] gravitační vektor float euler [3]; // [psi, theta, phi] Eulerův úhlový kontejner float ypr [3]; // [stáčení, stoupání, svinutí] stáčení/stoupání/svinutí kontejneru a gravitační vektor // struktura paketu pro ukázku čajníku InvenSense uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // ===================================================================== ================/ ============================================================================================= // indikuje, zda pin přerušení MPU dosáhl vysoké hodnoty neplatné dmpDataReady () {mpuInterrupt = true; } // =================================================================== ================== // === Počáteční nastavení === // ======================== ================================================= neplatné nastavení () {// připojit se ke sběrnici I2C (knihovna I2Cdev to nedělá automaticky) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400kHz I2C hodiny. Komentujte tento řádek, pokud máte potíže s kompilací #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, true); #endif // inicializace sériové komunikace // (115200 zvoleno, protože je vyžadováno pro ukázkový výstup Teapot, ale je to // opravdu na vás v závislosti na vašem projektu) Serial.begin (38400); while (! Serial); // počkejte na výčet Leonarda, ostatní pokračují okamžitě // inicializace zařízení //Serial.println(F("Initializing I2C devices… ")); mpu.initialize (); pinMode (INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize (); // zde zadejte své vlastní gyro offsety, zmenšené na minimální citlivost mpu.setXGyroOffset (17); mpu.setYGyroOffset (-69); mpu.setZGyroOffset (27); mpu.setZAccelOffset (1551); // 1688 tovární nastavení mého testovacího čipu // ujistěte se, že to fungovalo (vrací 0, pokud ano), pokud (devStatus == 0) {// zapněte DMP, když je připraven // Serial.println (F ("Povolení DMP… “)); mpu.setDMPEnabled (true); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // nastavte náš příznak DMP Ready, aby funkce main loop () věděla, že je v pořádku jej používat //Serial.println(F("DMP připraven! Čekání na první přerušení … ")); dmpReady = true; // získat očekávanou velikost DMP paketu pro pozdější srovnání packetSize = mpu.dmpGetFIFOPacketSize (); } else {// CHYBA! // 1 = počáteční načtení paměti se nezdařilo // 2 = Aktualizace konfigurace DMP selhaly // (pokud dojde k přerušení, obvykle bude kód 1) // Serial.print (F ("Inicializace DMP selhala (kód")); //Serial.print(devStatus); //Serial.println (F (")")); } // Definujte piny, ke kterým jsou připojeny 3 servomotory servo0.attach (10); servo1.attach (9); servo2.attach (8); } // =================================================================== ================== // === HLAVNÍ PROGRAMOVÁ Smyčka === // ======================= ================================================== prázdná smyčka () { / / pokud se programování nezdařilo, nepokoušejte se nic dělat, pokud se (! dmpReady) vrátí; // počkejte na přerušení MPU nebo další pakety dostupné při (! mpuInterrupt && fifoCount <packetSize) {if (mpuInterrupt && fifoCount

= 1024) {

// reset, abychom mohli čistě pokračovat mpu.resetFIFO (); fifoCount = mpu.getFIFOCount (); Serial.println (F („Přetečení FIFO!“)); // jinak zkontrolujte přerušení připravenosti dat DMP (to by se mělo často stát)} else if (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// počkejte na správnou dostupnou délku dat, mělo by to být VELMI krátké čekání, zatímco (paket fifoCount 1 k dispozici / / (to nám umožní okamžitě přečíst více bez čekání na přerušení) fifoCount -= packetSize; // Získejte hodnoty vybočení, rozteče a převrácení #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravity, & q);.dmpGetYawPitchRoll (ypr, & q, & gravity); // Hodnoty vybočení, rozteče, svinutí - radiány na stupně ypr [0] = ypr [0] * 180 / M_PI; ypr [1] = ypr [1] * 180 / M_PI; ypr [2] = ypr [2] * 180 / M_PI; // Přeskočení 300 naměřených hodnot (proces vlastní kalibrace) if (j <= 300) {correct = ypr [0]; // Zatáčení začíná na náhodné hodnotě, takže zachytit poslední hodnotu po 300 odečtech j ++;} // Po 300 odečtech jinak {ypr [0] = ypr [0] - správně; // Nastavit vybočení na 0 stupňů - odečíst poslední náhodnou hodnotu vybočení od aktuální hodnoty, aby se Zatáčet 0 stupňů es // Namapujte hodnoty snímače MPU6050 od -90 do 90 na hodnoty vhodné pro ovládání servo 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ádejte serva podle orientace MPU6050 servo0.write (servo0Value); servo1.write (servo1Value); servo2.write (servo2Value); } #endif}}

Nakonec pomocí funkce zápisu tyto hodnoty posíláme na serva jako řídicí signály. Samozřejmě můžete deaktivovat serva Yaw, pokud chcete pouze stabilizaci pro osy X a Y, a použít tuto platformu jako kardanový závěs

Krok 9: Když jsou všechny součásti propojeny, vypadá podobně jako na tomto obrázku

Když jsou všechny součásti propojeny, vypadá podobně jako tento obrázek
Když jsou všechny součásti propojeny, vypadá podobně jako tento obrázek

Krok 10: Nyní vložte všechny základní věci do plechovky s jídlem

Nyní vložte všechny základní věci dovnitř nádoby na potraviny
Nyní vložte všechny základní věci dovnitř nádoby na potraviny

Krok 11: Když jsou všechny dráty a součásti umístěny uvnitř potraviny, lze na základnu pěnové desky nanést lepicí pistoli

Když jsou všechny dráty a součásti umístěny uvnitř potraviny, lze na základnu pěnové desky nanést lepicí pistoli
Když jsou všechny dráty a součásti umístěny uvnitř potraviny, lze na základnu pěnové desky nanést lepicí pistoli

Krok 12: Závěr

Vezměte prosím na vědomí, že daleko od dobrého kardanového závěsu. Pohyby nejsou plynulé, protože tato serva nejsou k tomuto účelu určena. Skutečné kardanové závěsy používají pro hladký pohyb speciální typ motoru BLDC. Zvažte tedy tento projekt pouze pro vzdělávací účely.

To by bylo pro tento tutoriál vše, doufám, že se vám to líbilo a dozvěděli jste se něco nového. Neváhejte se na cokoli zeptat v sekci komentáře níže a nezapomeňte zkontrolovat mé sbírky projektu

Doporučuje: