Kazalo:

Gimbal za nadzor gibanja: 12 korakov
Gimbal za nadzor gibanja: 12 korakov

Video: Gimbal za nadzor gibanja: 12 korakov

Video: Gimbal za nadzor gibanja: 12 korakov
Video: ЗАПРЕЩЁННЫЕ ТОВАРЫ с ALIEXPRESS 2023 ШТРАФ и ТЮРЬМА ЛЕГКО! 2024, Julij
Anonim
Image
Image

Pozdravljeni vsi, moje ime je Harji Nagi. Trenutno sem študent drugega letnika študija elektronike in komunikacijskega inženiringa na Tehnološkem inštitutu Pranveer Singh v Kanpurju (UP). Zelo me zanimajo robotika, arduino, umetna inteligenca in analogna elektronika.

Beseda "gimbal" je opredeljena kot vrtljiva podpora, ki omogoča vrtenje katerega koli predmeta na eni osi. Tako triosni kardan omogoča, da je kateri koli predmet, nameščen na kardanu, neodvisen od gibanja tistega, ki drži kardan. Gimbal narekuje gibanje predmeta, ne tistega, ki ga nosi.

Sestavljen je iz 3 servo motorjev MG996R za 3-osno krmiljenje in podlage, na katero bodo nameščeni senzor MPU6050, Arduino in baterija. Uporablja se za stabilizacijo kamere brez vibracij. 3-osni gimbal zagotavlja, da se gibanje kamere stabilizira, tudi če se tista, ki jo drži, premika gor in dol, levo in desno, spredaj in zadaj. To imenujemo stabilizacija nihanja, nagiba in premikanja.

1. korak: Seznam komponent

Seznam komponent je naslednji:

1) Arduino Uno

2) 8V, 1.5 Amp baterija za napajanje Arduino Uno

3) 7805 Regulator napetosti Ic ali pa uporabite baker

4) MPU 6050

5) 3*(MG995 SERVO motorji)

6) Mostične žice

Druga oprema:

1) Spajkalnik

2) Pištola za lepilo

3) Vrtalni stroj

4) Posoda za hrano

Namesto krompirja sem uporabil majhno coustom perf ploščo za pozitivno in negativno avtobusno povezavo

2. korak: Sestavljanje

Sestavljanje
Sestavljanje
Sestavljanje
Sestavljanje

Foamcore, penasta plošča ali penasta plošča iz papirja je lahek in enostavno rezljiv material, ki se uporablja za montažo servo motorja in za izdelavo maket.

Najprej sem izdelal nosilce v obliki črke L za montažo servo motorja s pomočjo pene.

3. korak:

Slika
Slika

Sestavljanje karbona je bilo precej enostavno. Začel sem z nameščanjem servomotorja Yaw, senzorja MPU 6050 in stikala ON-OFF. Z vijaki in maticami sem ga pritrdil na podlago

4. korak: Nato sem z isto metodo zavaroval servo zvitek. deli so posebej zasnovani za enostavno namestitev servomotorjev MG995

Nato sem z isto metodo zavaroval servo zvitek. deli so posebej zasnovani za enostavno namestitev servomotorjev MG995
Nato sem z isto metodo zavaroval servo zvitek. deli so posebej zasnovani za enostavno namestitev servomotorjev MG995

5. korak: Nato sem z isto metodo zavaroval servo zvitek. deli so posebej zasnovani za enostavno namestitev servomotorjev MG995

Nato sem z isto metodo zavaroval Roll Servo. deli so posebej zasnovani za enostavno namestitev servomotorjev MG995
Nato sem z isto metodo zavaroval Roll Servo. deli so posebej zasnovani za enostavno namestitev servomotorjev MG995

6. korak: Povezave

Povezave
Povezave

V diagramu vezja lahko uporabite pretvornik dolarja ali pretvornik napetosti IC 7805 za pretvorbo 8 V v 5 V. Mikrokrmilnik, ki je podan diagramu vezja, je Arduino Nano, lahko uporabite tudi Arduino Uno, Arduino Mega.

Zatiči SCL in SDA MPU 6050 so priključeni na analogni pin A5 in A4 Arduino. (Zatiči SCL in SDA se lahko razlikujejo, zato preverite podatkovni list za nožice SCl in SDA za drug mikrokrmilnik)

Korak 7: Povežite z IC regulatorja napetosti 7805

Povezava z regulatorjem napetosti 7805 IC
Povezava z regulatorjem napetosti 7805 IC

Ta shema vezja je za priključitev regulatorja napetosti 7805 ic, priključite 8v baterijo na Vin in dobili boste izhodno napetost 5v.

8. korak: Kodiranje

Vključiti morate naslednje knjižnice:

1) #include Kliknite tukaj, če želite prenesti datoteko zip

2) #includeKliknite tukaj za prenos zip datoteke

Ko prenesete datoteko zip, dodajte knjižnico zip v skico arduino

Za kodo

/*

DIY Gimbal - MPU6050 Arduino vadniška koda, ki temelji na primeru MPU6050_DMP6 iz knjižnice i2cdevlib Jeffa Rowberga: https://github.com/jrowberg/i2cdevlib */// I2Cdev in MPU6050 morata biti nameščeni kot knjižnici ali pa.cpp/.h datoteke // za oba razreda morata biti na poti vključevanja vašega projekta #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // #include "MPU6050.h" // ni potrebno, če uporabljate MotionApps include file / / Knjižnica Arduino Wire je potrebna, če se I2Cdev I2CDEV_ARDUINO_WIRE izvaja //, če se uporablja v I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // Privzeti naslov I2C je 0x68 // specifičen I2 tukaj podano kot parameter // AD0 nizek = 0x68 (privzeto za prelom SparkFun in ocenjevalno ploščo InvenSense) // AD0 visok = 0x69 MPU6050 mpu; // MPU6050 mpu (0x69); // <- uporabite za AD0 visoko // Določite 3 servo motorje Servo servo0; Servo servo1; Servo servo2; float pravilno; int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #define INTERRUPT_PIN 2 // uporabite pin 2 na Arduino Uno in večina plošč bool blinkState = false; // Nadzor MPU/status vars bool dmpReady = false; // nastavimo na true, če je bil init DMP uspešen uint8_t mpuIntStatus; // vsebuje dejanski bajt stanja prekinitve iz MPU uint8_t devStatus; // vrne stanje po vsaki operaciji naprave (0 = uspeh,! 0 = napaka) uint16_t packetSize; // pričakovana velikost paketa DMP (privzeto je 42 bajtov) uint16_t fifoCount; // štetje vseh bajtov, ki so trenutno v FIFO uint8_t fifoBuffer [64]; // pomnilnik za shranjevanje FIFO // orientacija/gibanje varia Quaternion q; // [w, x, y, z] kvaterionski vsebnik VectorInt16 aa; // [x, y, z] meritve senzorja pospeška VectorInt16 aaReal; // [x, y, z] meritve senzorja pospeška brez gravitacije VectorInt16 aaWorld; // [x, y, z] meritve senzorja pospeška v svetovnem okviru VectorFloat gravitacija; // [x, y, z] gravitacijski vektor float euler [3]; // [psi, theta, phi] Euler kotni plavajoči kontejner ypr [3]; // [nihanje, nagib, zvitek] zavrtite/naklonite/zavrtite vsebnik in gravitacijski vektor // struktura paketov za demo čajnika InvenSense demo uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // ================================================ ================ // === RUTINA DETEKCIJE PREKINITEV === // ===================== ============================================ hlapni bool mpuInterrupt = false; // označuje, ali je prekinitveni pin MPU previsok. dmpDataReady () {mpuInterrupt = true; } // =============================================== ================= // === ZAČETNE NASTAVITVE === // ===================== ========================================== void setup () {// pridružite se vodilu I2C (knjižnica I2Cdev tega ne stori samodejno) #če I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // Ura I2C 400kHz. Komentirajte to vrstico, če imate težave pri sestavljanju #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, res); #endif // inicializirajte serijsko komunikacijo // (115200 izbrano, ker je to potrebno za demo izhod Teapot Demo, vendar je // odvisno od vas, odvisno od vašega projekta) Serial.begin (38400); while (! Serijski); // počakajte na Leonardovo naštevanje, drugi nadaljujejo takoj // inicializirajte napravo //Serial.println(F("Inicializiranje naprav I2C … ")); mpu.initialize (); pinMode (INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize (); // tukaj vnesete lastne odmike žiroskopov, prilagojene za minimalno občutljivost mpu.setXGyroOffset (17); mpu.setYGyroOffset (-69); mpu.setZGyroOffset (27); mpu.setZAccelOffset (1551); // 1688 tovarniško privzeto za moj preskusni čip // poskrbite, da je deloval (vrne 0, če je tako) if (devStatus == 0) {// vklopite DMP, zdaj ko je pripravljen // Serial.println (F ("Omogočanje DMP… ")); mpu.setDMPEnabled (true); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // nastavimo zastavo DMP Ready, tako da funkcija main loop () ve, da jo je v redu uporabiti //Serial.println(F("DMP pripravljen! Čakanje na prvo prekinitev … ")); dmpReady = res; // dobimo pričakovano velikost paketa DMP za kasnejšo primerjavo packetSize = mpu.dmpGetFIFOPacketSize (); } else {// NAPAKA! // 1 = začetna obremenitev pomnilnika ni uspela // 2 = posodobitve konfiguracije DMP niso uspele // (če se bo prekinil, bo običajno koda 1) // Serial.print (F ("DMP Initialization failed (code"))); //Serial.print(devStatus); //Serial.println (F (")")); } // Določimo nožice, na katere so priključeni 3 servo motorji servo0.attach (10); servo1.priključek (9); servo2.priključek (8); } // ================================================= ================= // === GLAVNI ZAKON PROGRAMA === // ==================== ========================================== void loop () { / / če programiranje ni uspelo, ne poskušajte storiti nič, če se vrne (! dmpReady); // počakajte na prekinitev MPU ali dodatne pakete, medtem ko je (! mpuInterrupt && fifoCount <packetSize) {if (mpuInterrupt && fifoCount

= 1024) {

// ponastavimo, da lahko nadaljujemo čisto mpu.resetFIFO (); fifoCount = mpu.getFIFOCount (); Serial.println (F ("FIFO preliv!")); // v nasprotnem primeru preverite, ali so podatki DMP pripravljeni na prekinitev (to se mora pogosto dogajati)} drugače če (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// počakate na pravilno dolžino razpoložljivih podatkov, naj bo ZELO kratko čakanje (paket fifoCount 1 na voljo / / (to nam omogoča, da takoj preberemo več, ne da bi čakali na prekinitev).dmpGetYawPitchRoll (ypr, & q, & gravity); // vrednosti nihanja, nagiba, zvitka - radiani na stopinje ypr [0] = ypr [0] * 180 / M_PI; ypr [1] = ypr [1] * 180 / M_PI; ypr [2] = ypr [2] * 180 / M_PI; // Preskočite 300 odčitkov (postopek samokalibracije), če (j <= 300) {pravilno = ypr [0]; // Zagon se začne pri naključni vrednosti, zato zajem zadnje vrednosti po 300 odčitkih j ++;} // Po 300 odčitkih drugje {ypr [0] = ypr [0] - pravilno; // Nastavi Yaw na 0 stopinj - od trenutne vrednosti odštej zadnjo naključno vrednost Yaw, da bo Nihaj 0 stopinj es // Preslikajte vrednosti senzorja MPU6050 od -90 do 90 na vrednosti, primerne za krmiljenje servo od 0 do 180 int servo0Value = map (ypr [0], -90, 90, 0, 180); int servo1Value = zemljevid (ypr [1], -90, 90, 0, 180); int servo2Value = zemljevid (ypr [2], -90, 90, 180, 0); // krmilimo servomotorje v skladu z orientacijo MPU6050 servo0.write (servo0Value); servo1.write (servo1Value); servo2.write (servo2Value); } #endif}}

Na koncu s funkcijo pisanja te vrednosti pošljemo servomotorjem kot krmilne signale. Seveda, če želite samo stabilizacijo osi X in Y, lahko onemogočite servo Yaw in to platformo uporabite kot ogrodje kamere

9. korak: Ko so vse komponente povezane, je videti podobno tej sliki

Ko so vse komponente povezane, je videti podobno tej sliki
Ko so vse komponente povezane, je videti podobno tej sliki

10. korak: Zdaj vstavite vse osnovne stvari v posodo za hrano

Zdaj vstavite vse osnovne stvari v posodo za hrano
Zdaj vstavite vse osnovne stvari v posodo za hrano

11. korak: Ko so vse žice in sestavni deli nameščeni v notranjost živila, lahko nato nalepite lepilno pištolo na dno pene

Ko so vse žice in sestavni deli postavljeni v notranjost živila, lahko nato nalepite lepilno pištolo na dno pene
Ko so vse žice in sestavni deli postavljeni v notranjost živila, lahko nato nalepite lepilno pištolo na dno pene

12. korak: Zaključek

Upoštevajte, da to še zdaleč ni dober fotoaparat. Premiki niso gladki, ker ti servomotorji niso namenjeni takemu namenu. Pravi gimbali za fotoaparate uporabljajo posebno vrsto motorja BLDC za nemoteno gibanje. Zato razmislite o tem projektu samo v izobraževalne namene.

To bi bilo vse za to vadnico, upam, da ste uživali in se naučili kaj novega. V spodnjem razdelku za komentarje lahko postavite kakršno koli vprašanje in ne pozabite preveriti mojih zbirk projektov

Priporočena: