Turinys:

Gimbalinis judesio valdymas: 12 žingsnių
Gimbalinis judesio valdymas: 12 žingsnių

Video: Gimbalinis judesio valdymas: 12 žingsnių

Video: Gimbalinis judesio valdymas: 12 žingsnių
Video: „DJI Mavic2“ aštuonios naudingos, bet mažai žinomos funkcijos (iš Pietų Korėjos) 2024, Liepa
Anonim
Image
Image

Sveiki visi, mano vardas Harji Nagi. Šiuo metu esu antro kurso studentas, studijuojantis elektroniką ir komunikacijų inžineriją iš Pranveer Singh technologijos instituto, Kanpuras (UP). Mane labai domina robotika, arduino, dirbtinis intelektas ir analoginė elektronika.

Žodis „gimbal“yra apibrėžtas kaip pasukama atrama, leidžianti pasukti bet kurį objektą vienoje ašyje. Taigi trijų ašių kardanas leidžia bet kuriam ant kardano pritvirtintam objektui būti nepriklausomam nuo kardaną laikančio objekto judesio. Gimbalas diktuoja objekto judėjimą, o ne jį nešantį.

Jį sudaro 3 MG996R servo varikliai, skirti 3 ašių valdymui, ir pagrindas, ant kurio bus dedamas MPU6050 jutiklis, „Arduino“ir baterija. Jis naudojamas, kad fotoaparatas būtų stabilizuotas be vibracijos. 3 ašių kardanas užtikrina, kad fotoaparato judesys būtų stabilizuotas, net jei jį laikantis asmuo eina aukštyn ir žemyn, kairėn ir dešinėn, priekyje ir gale. Tai vadiname posūkio, posūkio ir riedėjimo stabilizavimu.

1 žingsnis: komponentų sąrašas

Komponentų sąrašas yra:

1) „Arduino Uno“

2) 8 V, 1,5 amperų baterija, skirta „Arduino Uno“maitinti

3) 7805 įtampos reguliatorius Ic arba galite naudoti buck conveter

4) MPU 6050

5) 3*(„MG995 SERVO Motors“)

6) jungiamieji laidai

Kita įranga:

1) Lituoklis

2) Klijų pistoletas

3) gręžimo mašina

4) Maisto skardinė

Užuot naudojęs „breadborad“, naudoju mažą „coustom perf“plokštę teigiamam ir neigiamam autobusų ryšiui

2 žingsnis: Surinkimas

Surinkimas
Surinkimas
Surinkimas
Surinkimas

„Foamcore“, putplasčio plokštė arba putplasčio plokštė su popieriumi yra lengva ir lengvai pjaunama medžiaga, naudojama servo varikliui montuoti ir masto modeliams gaminti.

Pirmiausia padariau „pasidaryk pats“L formos laikiklius, skirtus montuoti servo variklį putplasčio plokštės pagalba.

3 žingsnis:

Vaizdas
Vaizdas

Ginklo surinkimas buvo gana lengvas. Pradėjau nuo Yaw servo, MPU 6050 jutiklio ir ON-OFF jungiklio įdiegimo. Naudodamas varžtus ir veržles, pritvirtinau jį prie pagrindo

4 žingsnis: Toliau, naudodamas tą patį metodą, pritvirtinau ritininį servo. dalys yra specialiai suprojektuotos taip, kad lengvai pritaikytų „MG995“servus

Tada, naudodamas tą patį metodą, pritvirtinau ritininį servo. dalys yra specialiai suprojektuotos taip, kad lengvai pritaikytų „MG995“servus
Tada, naudodamas tą patį metodą, pritvirtinau ritininį servo. dalys yra specialiai suprojektuotos taip, kad lengvai pritaikytų „MG995“servus

5 žingsnis: Toliau, naudodamas tą patį metodą, aš pritvirtinau ritininį servo. dalys yra specialiai suprojektuotos taip, kad lengvai pritaikytų „MG995“servus

Tada, naudodamas tą patį metodą, pritvirtinau ritininį servo. dalys yra specialiai suprojektuotos taip, kad lengvai pritaikytų „MG995“servus
Tada, naudodamas tą patį metodą, pritvirtinau ritininį servo. dalys yra specialiai suprojektuotos taip, kad lengvai pritaikytų „MG995“servus

6 žingsnis: jungtys

Sujungimai
Sujungimai

Grandinės schemoje galite naudoti „Buck“keitiklį arba 7805 įtampos reguliatoriaus IC, kad paverstumėte 8 V į 5 V. Mikrovaldiklis, pateiktas grandinės schemoje, yra „Arduino Nano“, taip pat galite naudoti „Arduino Uno“, „Arduino Mega“.

MPU 6050 SCL ir SDA kaiščiai yra prijungti prie Arduino analoginio kaiščio A5 ir A4. (SCL ir SDA kaištis gali skirtis, todėl patikrinkite kito mikrovaldiklio SCl ir SDA kaiščių duomenų lapą)

7 veiksmas: prijungimas naudojant 7805 įtampos reguliatoriaus IC

Jungtis naudojant 7805 įtampos reguliatorių IC
Jungtis naudojant 7805 įtampos reguliatorių IC

Ši schema skirta prijungti 7805 įtampos reguliatorių ic, prijunkite 8 V bateriją prie Vin ir gausite 5 V išėjimo įtampą.

8 žingsnis: kodavimas

Turite įtraukti šias bibliotekas:

1) #includeSpustelėkite čia norėdami atsisiųsti zip failą

2) #includeSpustelėkite čia, kad atsisiųstumėte ZIP failą

Atsisiuntę ZIP failą, pridėkite ZIP biblioteką arduino eskize

Dėl kodo

/*

„Pasidaryk pats“- „MPU6050 Arduino“mokymo kodas, pagrįstas Jeffo Rowbergo „i2cdevlib“bibliotekos MPU6050_DMP6 pavyzdžiu: https://github.com/jrowberg/i2cdevlib */// „I2Cdev“ir „MPU6050“turi būti įdiegtos kaip bibliotekos, kitaip „.cpp“.h failai // abiem klasėms turi būti jūsų projekto įtraukimo kelyje #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // #include "MPU6050.h" // nebūtina, jei naudojamas "MotionApps include file" / / „Arduino Wire“biblioteka reikalinga, jei „I2Cdev I2CDEV_ARDUINO_WIRE“įgyvendinama // naudojama I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // klasės numatytasis I2C adresas yra 0x68 // gali būti I2C adresai čia perduotas kaip parametras // AD0 low = 0x68 (numatytasis SparkFun breakout ir InvenSense vertinimo lenta) // AD0 high = 0x69 MPU6050 mpu; // MPU6050 mpu (0x69); // <- naudoti AD0 aukštai // Apibrėžkite 3 servo variklius Servo servo0; Servo servo1; Servo servo2; teisingai plūduriuoti; int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #define INTERRUPT_PIN 2 // naudokite 2 kaištį „Arduino Uno“ir dauguma plokščių bool blinkState = false; // MPU kontrolė/būsena vars bool dmpReady = false; // nustatyti tiesa, jei DMP init buvo sėkmingas uint8_t mpuIntStatus; // turi faktinį pertraukimo būsenos baitą iš MPU uint8_t devStatus; // grąžinti būseną po kiekvienos įrenginio operacijos (0 = sėkmė,! 0 = klaida) uint16_t packetSize; // numatomas DMP paketo dydis (numatytasis yra 42 baitai) uint16_t fifoCount; // visų baitų skaičius šiuo metu FIFO uint8_t fifoBuffer [64]; // FIFO saugojimo buferis // orientacija/judesys vars Quaternion q; // [w, x, y, z] kvaterniono konteineris VectorInt16 aa; // [x, y, z] accel jutiklio matavimai VectorInt16 aaReal; // [x, y, z] be gravitacijos accel jutiklio matavimai VectorInt16 aaWorld; // [x, y, z] pasaulio rėmo akselio jutiklio matavimai VectorFloat gravity; // [x, y, z] gravitacijos vektoriaus plūdės euleris [3]; // [psi, teta, phi] Eulerio kampo konteineris plūdė ypr [3]; // [pasukimas, pakrypimas, pasukimas] pasukimas/pakilimas/ritininis konteineris ir gravitacijos vektorius // „InvenSense“arbatinuko demonstracinės versijos paketas „uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // ================================================ ================ // === PERJUNGIMO ATSISAKYMO ĮVADAS === // ===================== =========================================== nepastovus bool mpuInterrupt = false; // nurodo, ar MPU pertraukimo smeigtukas tapo labai tuščias dmpDataReady () {mpuInterrupt = true; } // ================================================ ================= // === PIRMINĖS SĄRANGOS === // ===================== =========================================== negaliojanti sąranka () {// prisijungti prie I2C magistralės („I2Cdev“biblioteka to nedaro automatiškai) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400 kHz I2C laikrodis. Komentuokite šią eilutę, jei turite kompiliavimo sunkumų #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, tiesa); #endif // inicijuoti nuoseklųjį ryšį // (115200 pasirinktas, nes jis reikalingas arbatinuko demonstracinei išvestims, bet tai // tikrai priklauso nuo jūsų projekto) Serial.begin (38400); while (! Serial); // laukti Leonardo išvardijimo, kiti iškart tęsia // inicijuoti įrenginį //Serial.println(F("I2C įrenginių inicijavimas … ")); mpu.initialize (); pinMode (INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize (); // čia pateikite savo giroskopo poslinkius, skalę pagal minimalų jautrumą mpu.setXGyroOffset (17); mpu.setYGyroOffset (-69); mpu.setZGyroOffset (27); mpu.setZAccelOffset (1551); // 1688 gamyklinė numatytoji mano bandymo mikroschema // įsitikinkite, kad ji veikė (grąžina 0, jei taip), jei (devStatus == 0) {// įjunkite DMP dabar, kai jis paruoštas // Serial.println (F ("Įgalinimas DMP … ")); mpu.setDMPEnabled (tiesa); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // nustatykite mūsų DMP Ready vėliavą, kad pagrindinė ciklo () funkcija žinotų, jog ją naudoti yra gerai //Serial.println(F("DMP paruošta! Laukiama pirmo pertraukimo … ")); dmpReady = tiesa; // gauti laukiamą DMP paketo dydį vėlesniam palyginimui packetSize = mpu.dmpGetFIFOPacketSize (); } else {// KLAIDA! // 1 = nepavyko įkelti pradinės atminties // 2 = nepavyko atnaujinti DMP konfigūracijos // (jei ji nutrūks, dažniausiai kodas bus 1) // Serial.print (F ("DMP inicijavimas nepavyko (kodas")); //Serial.print(devStatus); //Serial.println (F (")")); } // Apibrėžkite kaiščius, prie kurių prijungti 3 servo varikliai servo0.attach (10); servo1.attach (9); servo2.attach (8); } // ================================================ ================= // === PAGRINDINĖS PROGRAMOS LOPAS === // ==================== ============================================ void loop () { / / jei programavimas nepavyko, nebandykite nieko daryti, jei (! dmpReady) grįš; // laukti MPU pertraukimo arba papildomo paketo (-ų), kol (! mpuInterrupt && fifoCount <packetSize) {if (mpuInterrupt && fifoCount

= 1024) {

// atstatyti, kad galėtume švariai tęsti mpu.resetFIFO (); fifoCount = mpu.getFIFOCount (); Serial.println (F ("FIFO perpildymas!")); // priešingu atveju patikrinkite, ar DMP duomenys yra paruošti pertraukimui (tai turėtų nutikti dažnai)} else if (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// laukite teisingo turimo duomenų ilgio, turėtų būti LABAI trumpas laukimas, kol („fifoCount 1“paketas yra prieinamas / / (tai leidžia mums nedelsiant skaityti daugiau, nelaukiant pertraukos) fifoCount -= packetSize; // Gaukite posūkio, posūkio ir ritinio reikšmes #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravity).dmpGetYawPitchRoll (ypr, & q, & gravity); // Pasukimas, žingsnis, ritinio reikšmės - radianai iki ypr laipsnių [0] = ypr [0] * 180 / M_PI; ypr [1] = ypr [1] * 180 / M_PI; ypr [2] = ypr [2] * 180 / M_PI; // Praleisti 300 rodmenų (savaiminio kalibravimo procesas), jei (j <= 300) {correct = ypr [0]; // Pasukimas prasideda atsitiktine verte, todėl užfiksuoti paskutinę vertę po 300 rodmenų j ++;} // Po 300 rodmenų kitaip {ypr [0] = ypr [0] - teisinga; // Nustatykite posūkį į 0 laipsnių - atimkite paskutinę atsitiktinę posūkio reikšmę iš srovės vertės, kad Sukimas 0 laipsnių es // Susieti MPU6050 jutiklio reikšmes nuo -90 iki 90 iki verčių, tinkamų servo valdymui nuo 0 iki 180 int servo0Value = map (ypr [0], -90, 90, 0, 180); int servo1Value = žemėlapis (ypr [1], -90, 90, 0, 180); int servo2Value = žemėlapis (ypr [2], -90, 90, 180, 0); // Valdykite servos pagal MPU6050 orientaciją servo0.write (servo0Value); servo1.write (servo1Value); servo2.write (servo2Value); } #endif}}

Galiausiai, naudodamiesi rašymo funkcija, šias vertes siunčiame į servos kaip valdymo signalus. Žinoma, galite išjungti „Yaw“servo, jei norite tik X ir Y ašies stabilizavimo, ir naudoti šią platformą kaip kameros kampą

9 veiksmas: prijungus visus komponentus, jis atrodo panašus į šį paveikslėlį

Prijungus visus komponentus, jis atrodo panašus į šį paveikslėlį
Prijungus visus komponentus, jis atrodo panašus į šį paveikslėlį

10 žingsnis: Dabar į maisto skardinę įdėkite visus pagrindinius daiktus

Dabar įdėkite visus pagrindinius daiktus į maisto skardinę
Dabar įdėkite visus pagrindinius daiktus į maisto skardinę

11 veiksmas: kai visi laidai ir komponentai yra įdėti į maistą, tada putų plokštės pagrinde galima uždėti klijų pistoletą

Kai visi laidai ir komponentai yra dedami į maistą, putų plokštės pagrinde galima uždėti klijų pistoletą
Kai visi laidai ir komponentai yra dedami į maistą, putų plokštės pagrinde galima uždėti klijų pistoletą

12 žingsnis: Išvada

Atkreipkite dėmesį, kad tai toli gražu nėra gera kameros jungtis. Judesiai nėra lygūs, nes šie servai nėra skirti šiam tikslui. Tikros kameros gimbaliai naudoja specialų BLDC variklį, kad judesiai būtų sklandūs. Taigi, apsvarstykite šį projektą tik švietimo tikslais.

Tai būtų viskas šiai pamokai, tikiuosi, kad jums patiko ir sužinojote kažką naujo. Nesivaržykite užduoti bet kokį klausimą komentarų skiltyje žemiau ir nepamirškite patikrinti mano projekto kolekcijų

Rekomenduojamas: