Sisällysluettelo:

Liikeohjauskimbaali: 12 vaihetta
Liikeohjauskimbaali: 12 vaihetta

Video: Liikeohjauskimbaali: 12 vaihetta

Video: Liikeohjauskimbaali: 12 vaihetta
Video: iPhone 12 mini and OM5 gimbal 2024, Marraskuu
Anonim
Image
Image

Hei kaikki, nimeni on Harji Nagi. Olen tällä hetkellä toisen vuoden opiskelija, joka opiskelen elektroniikkaa ja viestintätekniikkaa Pranveer Singhin teknillisestä instituutista, Kanpurista (UP).

Sana "gimbal" on määritelty kääntyväksi tueksi, joka mahdollistaa minkä tahansa esineen pyörimisen yhdellä akselilla. Kolmen akselin kardaanin ansiosta kaikki kardaaniin asennetut esineet voivat olla riippumattomia kardaania pitävän kohteen liikkeistä. Gimbaali sanelee kohteen liikkeen, ei sen kantavan.

Se koostuu kolmesta MG996R-servomoottorista 3-akselista ohjausta varten ja alustasta, johon MPU6050-anturi, Arduino ja akku sijoitetaan. Sitä käytetään pitämään kamera vakaana ilman tärinää. 3-akselinen kardaani varmistaa, että kameran liike on vakaa, vaikka sitä pitävä liikkuu ylös ja alas, vasemmalle ja oikealle, eteen ja taakse. Tätä me kutsumme kääntymisen, nousun ja vierintävakautukseksi.

Vaihe 1: Komponenttiluettelo

Komponenttiluettelo ovat:

1) Arduino Uno

2) 8 V, 1,5 ampeerin akku Arduino Unon virransyöttöön

3) 7805 Jännitesäädin Ic tai voit käyttää buck conveteria

4) MPU 6050

5) 3*(MG995 SERVO -moottorit)

6) Jännitejohdot

Muut varusteet:

1) Juotosrauta

2) Liimapistooli

3) porakone

4) Ruoka voi

Leipäboradin käyttämisen sijaan olen käyttänyt pientä coustom -peruskorttia positiiviseen ja negatiiviseen väyläyhteyteen

Vaihe 2: Kokoaminen

Kokoaminen
Kokoaminen
Kokoaminen
Kokoaminen

Foamcore, vaahtolevy tai paperipinnoitettu vaahtolevy on kevyt ja helposti leikattava materiaali, jota käytetään servomoottorin asentamiseen ja pienoismallien valmistukseen.

Ensinnäkin tein DIY L-muotoiset kiinnikkeet servomoottorin asentamiseksi vaahtolevyn avulla.

Vaihe 3:

Kuva
Kuva

Gimbalin kokoaminen oli melko helppoa. Aloitin asentamalla Yaw-servon, MPU 6050 -anturin ja ON-OFF-kytkimen. Kiinnitin sen pohjaan ruuveilla ja muttereilla

Vaihe 4: Seuraavaksi, käyttäen samaa menetelmää, varmistin rullaservon. osat on suunniteltu erityisesti sovittamaan helposti MG995 -servot

Seuraavaksi kiinnitin rullaservon samalla menetelmällä. osat on suunniteltu erityisesti sovittamaan helposti MG995 -servot
Seuraavaksi kiinnitin rullaservon samalla menetelmällä. osat on suunniteltu erityisesti sovittamaan helposti MG995 -servot

Vaihe 5: Seuraavaksi, käyttäen samaa menetelmää, varmistin rullaservon. osat on suunniteltu erityisesti sovittamaan helposti MG995 -servot

Seuraavaksi kiinnitin rullaservon samalla menetelmällä. osat on suunniteltu erityisesti sovittamaan helposti MG995 -servot
Seuraavaksi kiinnitin rullaservon samalla menetelmällä. osat on suunniteltu erityisesti sovittamaan helposti MG995 -servot

Vaihe 6: Liitännät

Liitännät
Liitännät

Kytkentäkaaviossa voit käyttää joko buck -muunninta tai 7805 -jännitesäädintä IC 8V: n muuntamiseksi 5 V: ksi. Piirikaavion antama mikrokontrolleri on Arduino Nano, voit käyttää myös Arduino Unoa, Arduino Megaa.

MPU 6050: n SCL- ja SDA -nastat on kytketty Arduinon analogisiin nastoihin A5 ja A4. (SCL- ja SDA -nastat voivat vaihdella, joten tarkista muiden mikro -ohjaimien SCl- ja SDA -nastojen tietolomake)

Vaihe 7: Liitäntä 7805 -jännitesäätimellä

Liitäntä 7805 jännitesäätimellä IC
Liitäntä 7805 jännitesäätimellä IC

Tämä kytkentäkaavio on tarkoitettu 7805 -jännitesäätimen ic liittämiseen, kytke 8 voltin akku Viniin ja saat 5 voltin lähtöjännitteen.

Vaihe 8: Koodaus

Sinun on sisällytettävä seuraavat kirjastot:

1) #includeLataa zip -tiedosto napsauttamalla tätä

2) #includeLataa zip -tiedosto napsauttamalla tätä

Kun olet ladannut zip -tiedoston, lisää zip -kirjasto arduino -luonnokseen

Koodille

/*

DIY Gimbal - MPU6050 Arduino -opetuskoodi, joka perustuu Jeff Rowbergin i2cdevlib -kirjaston MPU6050_DMP6 -esimerkkiin: https://github.com/jrowberg/i2cdevlib */// I2Cdev ja MPU6050 on asennettava kirjastoina, tai muuten.cpp/.h -tiedostojen // molempien luokkien on oltava projektisi sisällytyspolussa #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // #include "MPU6050.h" // ei välttämätön, jos käytetään MotionApps include file / / Arduino Wire -kirjasto vaaditaan, jos I2Cdev I2CDEV_ARDUINO_WIRE -toteutusta // käytetään I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // luokan oletus I2C -osoite on 0x68 // voi olla I2C -osoite hyväksytty tässä parametrina // AD0 low = 0x68 (oletusarvo SparkFun -katkaisulle ja InvenSense -arviointikortille) // AD0 korkea = 0x69 MPU6050 mpu; // MPU6050 mpu (0x69); // <- käytä AD0 high // Määritä 3 servomoottoria Servo servo0; Servoservo1; Servoservo2; kellua oikein; int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #define INTERRUPT_PIN 2 // käytä nasta 2 Arduino Unossa ja useimmat levyt bool blinkState = false; // MPU -ohjaus/tila vars bool dmpReady = false; // aseta tosi, jos DMP -aloitus onnistui uint8_t mpuIntStatus; // omistaa todellisen keskeytystilan tavun MPU: sta uint8_t devStatus; // palautustila jokaisen laitteen käytön jälkeen (0 = onnistunut,! 0 = virhe) uint16_t packetSize; // odotettu DMP -paketin koko (oletus on 42 tavua) uint16_t fifoCount; // kaikkien tällä hetkellä FIFO: ssa olevien tavujen määrä uint8_t fifoBuffer [64]; // FIFO -tallennuspuskuri // suunta/liike vars Quaternion q; // [w, x, y, z] kvaternionisäiliö VectorInt16 aa; // [x, y, z] accel -anturin mittaukset VectorInt16 aaReal; // [x, y, z] painovoimattomat akselimittaukset VectorInt16 aaWorld; // [x, y, z] maailmankehyksen accel-anturin mittaukset VectorFloat gravity; // [x, y, z] painovoimavektori float euler [3]; // [psi, teeta, phi] Euler -kulmasäiliön uimuri ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll säiliö ja painovoimavektori // pakettirakenne InvenSense -teekannun demolle uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // ================================================ ================ // === KESKEYTYKSEN TUNNISTUSRUTIINI === // ===================== =========================================== haihtuva bool mpuInterrupt = false; // osoittaa, onko MPU -keskeytysnasta mennyt korkeaksi void dmpDataReady () {mpuInterrupt = true; } // ================================================== ================= // === ALKUPERÄINEN ASETUS === // ===================== =========================================== tyhjä asennus () {// liittyä I2C -väylään (I2Cdev -kirjasto ei tee tätä automaattisesti) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400 kHz I2C -kello. Kommentoi tätä riviä, jos sinulla on kokoamisvaikeuksia #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, true); #endif // sarjaliikenteen alustaminen // (115200 on valittu, koska se vaaditaan teekannujen demolähtöön, mutta se on // todella sinun tehtäväsi mukaan) Serial.begin (38400); while (! Sarja); // odota Leonardo -luetteloa, muut jatkavat heti // alustavat laitteen //Serial.println(F("I2C -laitteiden alustus… ")); mpu.initialize (); pinMode (INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize (); // anna omat gyroskooppisiirrot täällä, skaalattuna min. herkkyyden mukaan mpu.setXGyroOffset (17); mpu.setYGyroOffset (-69); mpu.setZGyroOffset (27); mpu.setZAccelOffset (1551); // testisiruni tehdasasetus 1688 // varmista, että se toimi (palauttaa 0, jos on) jos (devStatus == 0) {// kytke DMP päälle nyt, kun se on valmis // Serial.println (F ("Käytössä DMP … ")); mpu.setDMPEnabled (tosi); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // aseta DMP Ready -lippumme niin, että pääsilmukka () -toiminto tietää, että sen käyttö on ok //Serial.println(F("DMP valmis! Odotetaan ensimmäistä keskeytystä … ")); dmpReady = totta; // saat odotetun DMP -paketin koon myöhempää vertailua varten packetSize = mpu.dmpGetFIFOPacketSize (); } muu {// VIRHE! // 1 = alustava muistin lataus epäonnistui // 2 = DMP -määrityspäivitykset epäonnistui // (jos se katkeaa, koodi on yleensä 1) // Serial.print (F ("DMP -alustus epäonnistui (koodi")); //Serial.print(devStatus); //Serial.println (F (")")); } // Määritä nastat, joihin 3 servomoottoria on kytketty servo0.attach (10); servo1.kiinnitys (9); servo2.liitin (8); } // ================================================ ================= // === PÄÄOHJELMAN LOOP === // ==================== ============================================ void loop () { / / jos ohjelmointi epäonnistui, älä yritä tehdä mitään, jos (! dmpReady) palaa; // odota MPU -keskeytystä tai lisäpaketteja, kun (! mpuInterrupt && fifoCount <packetSize) {if (mpuInterrupt && fifoCount

= 1024) {

// nollaa, jotta voimme jatkaa puhtaasti mpu.resetFIFO (); fifoCount = mpu.getFIFOCount (); Serial.println (F ("FIFO -ylivuoto!")); // muussa tapauksessa tarkista, onko DMP -tiedot valmiina keskeytetty (tämän pitäisi tapahtua usein)} else if (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// odota oikeaa käytettävissä olevaa datapituutta, odotetaan ERITTÄIN lyhyesti, kun (fifoCount 1 -paketti saatavilla / / (tämän avulla voimme lukea lisää heti odottamatta keskeytystä) fifoCount -= packetSize; // Hanki kääntymis-, piki ja rulla -arvot #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravity).dmpGetYawPitchRoll (ypr, & q, & gravity); // Yaw, Pitch, Roll arvot - Radiaanit asteisiin ypr [0] = ypr [0] * 180 / M_PI; ypr [1] = ypr [1] * 180 / M_PI; ypr [2] = ypr [2] * 180 / M_PI; // Ohita 300 lukemaa (itsekalibrointiprosessi), jos (j <= 300) {correct = ypr [0]; // Kääntyminen alkaa satunnaisarvosta, joten kaapata viimeinen arvo 300 lukeman jälkeen j ++;} // 300 lukemisen jälkeen muut {ypr [0] = ypr [0] - oikein; // Aseta kääntö 0 astetta - vähennä viimeinen satunnainen kääntymisarvo nykyisestä arvosta Kallistus 0 astetta es // Yhdistä MPU6050 -anturin arvot välillä -90 -90 servo -ohjaukseen sopiviin arvoihin 0-180 int servo0Value = map (ypr [0], -90, 90, 0, 180); int servo1Value = kartta (ypr [1], -90, 90, 0, 180); int servo2Value = kartta (ypr [2], -90, 90, 180, 0); // Hallitse servoja MPU6050 -suunnan mukaan servo0.write (servo0Value); servo1.write (servo1Value); servo2.write (servo2Value); } #loppu Jos } }

Lopuksi käyttämällä kirjoitustoimintoa, lähetämme nämä arvot servoille ohjaussignaaleina. Voit tietysti poistaa Yaw -servon käytöstä, jos haluat vain vakautta X- ja Y -akselille, ja käyttää tätä alustaa kameran gimbalina

Vaihe 9: Kun kaikki komponentit on kytketty, se näyttää samanlaiselta kuin tämä kuva

Kun kaikki komponentit on kytketty, se näyttää samanlaiselta kuin tämä kuva
Kun kaikki komponentit on kytketty, se näyttää samanlaiselta kuin tämä kuva

Vaihe 10: Aseta nyt kaikki pohjatavarat elintarvikepurkin sisään

Aseta nyt kaikki pohjatavarat elintarvikepurkin sisään
Aseta nyt kaikki pohjatavarat elintarvikepurkin sisään

Vaihe 11: Kun kaikki johdot ja komponentit on sijoitettu elintarvikkeen sisälle, voidaan sitten levittää liimapistooli vaahtomuovilevyn pohjaan

Kun kaikki johdot ja komponentit on sijoitettu ruoan sisälle, voidaan liimapistooli levittää vaahtomuovilevyn pohjaan
Kun kaikki johdot ja komponentit on sijoitettu ruoan sisälle, voidaan liimapistooli levittää vaahtomuovilevyn pohjaan

Vaihe 12: Johtopäätös

Huomaa tämä kaukana hyvästä kameran gimbalista. Liikkeet eivät ole sujuvia, koska näitä servoja ei ole tarkoitettu tällaiseen tarkoitukseen. Todelliset kameran gimbaalit käyttävät erityistä BLDC -moottoria tasaisten liikkeiden saamiseksi. Joten harkitse tätä projektia vain opetustarkoituksessa.

Siinä kaikki tässä opetusohjelmassa, toivottavasti pidit siitä ja opit jotain uutta. Voit vapaasti esittää kysymyksiä alla olevissa kommenttiosioissa ja älä unohda tarkistaa projektikokoelmiani

Suositeltava: