INHOUDSOPGAWE:

Motion Control Gimbal: 12 stappe
Motion Control Gimbal: 12 stappe

Video: Motion Control Gimbal: 12 stappe

Video: Motion Control Gimbal: 12 stappe
Video: STOP USING GIMBALS (all the time) 2024, Julie
Anonim
Image
Image

Hallo almal, my naam is Harji Nagi. Ek is tans 'n tweedejaarstudent wat elektronika en kommunikasie -ingenieurswese studeer aan die Pranveer Singh Institute Of Technology, Kanpur (UP). Ek het 'n groot belangstelling in robotika, arduino, kunsmatige intelligensie en analoog elektronika.

Die woord "gimbal" word gedefinieer as 'n draaibare steun wat enige voorwerp in 'n enkele as kan draai. 'N Drie-as-gimbal laat dus toe dat enige voorwerp wat op die gimbal gemonteer is, onafhanklik is van die beweging van die een wat die gimbal vashou. Die gimbal bepaal die beweging van die voorwerp, nie die een wat dit dra nie.

Dit bestaan uit 3 MG996R-servomotore vir die 3-as-bestuur, en 'n basis waarop die MPU6050-sensor, die Arduino en die battery geplaas word. Dit word gebruik om die kamera sonder trillings te laat stabiliseer. 'N Drie-as gimbal verseker dat die beweging van die kamera gestabiliseer word, selfs al gaan die een wat dit vashou, links en regs, voor en agter. Dit is waarna ons verwys as stabilisering van gaas, toonhoogte en rol.

Stap 1: Lys met komponente

Die lys van komponente is:

1) Arduino Uno

2) 8V, 1,5 ampère battery vir die voeding van Arduino Uno

3) 7805 Spanningsreguleerder Ic, of u kan 'n bokkonveter gebruik

4) MPU 6050

5) 3*(MG995 SERVO Motors)

6) Jumper Wires

Ander toerusting:

1) soldeerbout

2) Plakgeweer

3) Boormasjien

4) Kosblik

In plaas daarvan om broodborad te gebruik, gebruik ek 'n klein, aangepaste perf -bord vir positiewe en negatiewe busverbindings

Stap 2: Monteer

Montering
Montering
Montering
Montering

Foamcore, skuimplank of skuimbord met papierkant is 'n liggewig en maklik gesnyde materiaal wat gebruik word vir die montering van Servomotor en vir die maak van skaalmodelle.

Eerstens het ek 'n DIY L-vormige hakies gemaak om die servomotor te monteer met behulp van skuimplank.

Stap 3:

Beeld
Beeld

Die samestelling van die gimbal was redelik maklik. Ek het begin met die installering van die Yaw servo, MPU 6050 sensor en AAN-UIT skakelaar. Met boute en moere het ek dit aan die voet vasgemaak

Stap 4: Volgende, met dieselfde metode, het ek die rol -servo beveilig. die onderdele is spesifiek ontwerp om die MG995 -servo's maklik te pas

Vervolgens het ek die rol -servo met dieselfde metode beveilig. die onderdele is spesifiek ontwerp om die MG995 -servo's maklik te pas
Vervolgens het ek die rol -servo met dieselfde metode beveilig. die onderdele is spesifiek ontwerp om die MG995 -servo's maklik te pas

Stap 5: Gebruik die dieselfde metode om die rol -servo te beveilig. die onderdele is spesifiek ontwerp om die MG995 -servo's maklik te pas

Vervolgens het ek die rol -servo met dieselfde metode beveilig. die onderdele is spesifiek ontwerp om die MG995 -servo's maklik te pas
Vervolgens het ek die rol -servo met dieselfde metode beveilig. die onderdele is spesifiek ontwerp om die MG995 -servo's maklik te pas

Stap 6: Verbindings

Verbindings
Verbindings

In die kringdiagram kan u óf 'n omskakelaar óf 'n 7805 spanningsreguleerder IC gebruik om 8V na 5 V. te omskakel.

Die SCL- en SDA -penne van MPU 6050 is gekoppel aan Arduino Analog -pen A5 en A4. (SCL- en SDA -pen kan wissel, kyk na die datablad vir SCl- en SDA -penne vir ander mikrobeheerder)

Stap 7: Aansluiting met 7805 spanningsreguleerder IC

Aansluiting met 7805 spanningsreguleerder IC
Aansluiting met 7805 spanningsreguleerder IC

Hierdie stroomdiagram is vir die aansluiting van die 7805 spanningsreguleerder ic, koppel die 8v -battery by Vin en u kry 'n uitsetspanning van 5v.

Stap 8: Kodering

U moet die volgende biblioteke insluit:

1) #includeKlik hier om die zip -lêer af te laai

2) #includeKlik hier om die zip -lêer af te laai

Nadat u die zip -lêer afgelaai het, voeg die zip -biblioteek by die arduino -skets by

Vir Kode

/*

DIY Gimbal - MPU6050 Arduino -tutoriaalkode gebaseer op die MPU6050_DMP6 -voorbeeld uit die i2cdevlib -biblioteek deur Jeff Rowberg: https://github.com/jrowberg/i2cdevlib */// I2Cdev en MPU6050 moet geïnstalleer word as biblioteke, of anders.cpp/.h -lêers // vir beide klasse moet in die insluit -pad van u projek wees #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // #include "MPU6050.h" // nie nodig as u MotionApps include file gebruik nie / / Arduino Wire -biblioteek is nodig as I2Cdev I2CDEV_ARDUINO_WIRE implementering // gebruik word in I2Cdev.h #as I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #sluit "Wire.h" #endif #include // class default I2C address is 0x68 // specific I2 in as parameter hier deurgegee // AD0 laag = 0x68 (standaard vir SparkFun -uitbreek- en InvenSense -evalueringsbord) // AD0 hoog = 0x69 MPU6050 mpu; // MPU6050 mpu (0x69); // <- gebruik vir AD0 hoog // Definieer die 3 servomotore Servo servo0; Servo servo1; Servo servo2; dryf korrek; int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #define INTERRUPT_PIN 2 // gebruik pen 2 op Arduino Uno & die meeste borde bool blinkState = false; // MPU -beheer/status vars bool dmpReady = vals; // stel waar as DMP init suksesvol was uint8_t mpuIntStatus; // hou die werklike onderbrekingsstatusbyte van MPU uint8_t devStatus; // terugkeerstatus na elke apparaatbewerking (0 = sukses,! 0 = fout) uint16_t packetSize; // verwagte DMP -pakkiegrootte (standaard is 42 grepe) uint16_t fifoCount; // telling van alle grepe wat tans in FIFO uint8_t fifoBuffer [64] is; // FIFO -stoorbuffer // oriëntasie/beweging vars Quaternion q; // [w, x, y, z] quaternion houer VectorInt16 aa; // [x, y, z] accel sensor metings VectorInt16 aaReal; // [x, y, z] swaartekragvrye versnellingsmeters metings VectorInt16 aaWorld; // [x, y, z] wêreld-raam accel sensor metings VectorFloat swaartekrag; // [x, y, z] gravitasievektor float euler [3]; // [psi, theta, phi] Euler hoekhouer float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vector // packet structure for InvenSense theepot demo uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // =================================================== ===================== ONDERBREKOPDETEKSIE ROUTINE === // ======================== ============================================ vlugtige bool mpuInterrupt = vals; // dui aan of MPU -onderbrekingspen hoog geraak het dmpDataReady () {mpuInterrupt = true; } // =================================================== ====================== OORSPRONKLIKE INSTELLING === // ======================= ============================================= ongeldige opstelling () {// sluit aan by I2C -bus (I2Cdev -biblioteek doen dit nie outomaties nie) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400kHz I2C klok. Lewer kommentaar op hierdie reël as u probleme met die opstel het #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, true); #endif // initialiseer reekskommunikasie // (115200 gekies omdat dit nodig is vir Teapot Demo -uitvoer, maar dit is // afhangend van u projek) Serial.begin (38400); terwyl (! Serial); // wag vir Leonardo se opsomming, ander gaan onmiddellik voort // begin toestel //Serial.println(F("Initialiseer I2C -toestelle … ")); mpu.initialize (); pinMode (INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize (); // verskaf u eie gyro -offset hier, afgeskaal vir min sensitiwiteit mpu.setXGyroOffset (17); mpu.setYGyroOffset (-69); mpu.setZGyroOffset (27); mpu.setZAccelOffset (1551); // 1688 fabrieksinstellings vir my toetsskyf DMP … ")); mpu.setDMPEnabled (waar); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // stel ons DMP Ready -vlag in sodat die hooflus () -funksie weet dat dit goed is om dit te gebruik //Serial.println(F("DMP gereed! Wag vir eerste onderbreking … ")); dmpReady = waar; // kry verwagte DMP -pakkiegrootte vir latere vergelyking packetSize = mpu.dmpGetFIFOPacketSize (); } anders {// FOUT! // 1 = aanvanklike geheue laai misluk // 2 = DMP -konfigurasie -opdaterings misluk // (as dit gaan breek, is die kode gewoonlik 1) // Serial.print (F ("DMP -inisialisering misluk (kode")); //Serial.print(devStatus); //Serial.println (F (")"))); } // Definieer die penne waarop die 3 servomotore gekoppel is servo0.attach (10); servo1.aanheg (9); servo2.aanheg (8); } // =================================================== ====================== HOOFPROGRAMLOOP === // ====================== ============================================== leegloop () { / / As die programmering misluk, probeer niks doen as (! dmpReady) terugkeer nie; // wag vir MPU -onderbreking of ekstra pakkie (s) beskikbaar terwyl (! mpuInterrupt && fifoCount <packetSize) {if (mpuInterrupt && fifoCount

= 1024) {

// herstel sodat ons skoon kan voortgaan mpu.resetFIFO (); fifoCount = mpu.getFIFOCount (); Serial.println (F ("FIFO -oorloop!")); // kyk anders of DMP -data gereed is om te onderbreek (dit moet gereeld gebeur)} anders as (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// wag vir die korrekte beskikbare datalengte, 'n BAIE kort wag moet wag (fifoCount 1 pakkie beskikbaar / / (hiermee kan ons onmiddellik meer lees sonder om op 'n onderbreking te wagte) fifoCount -= packetSize; // Kry Yaw-, Pitch- en Roll -waardes #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& mw,.dmpGetYawPitchRoll (ypr, & q, & gravity); // Yaw, Pitch, Roll waardes - Radiale tot grade ypr [0] = ypr [0] * 180 / M_PI; ypr [1] = ypr [1] * 180 / M_PI; ypr [2] = ypr [2] * 180 / M_PI; // Slaan 300 lesings (selfkalibrasieproses) oor as (j <= 300) {correct = ypr [0]; // Yaw begin met ewekansige waarde, so ons vang laaste waarde na 300 lesings j ++;} // Na 300 lesings anders {ypr [0] = ypr [0] - korrek; // Stel die Yaw op 0 grade - trek die laaste ewekansige Yaw -waarde af van die huidige waarde om die Gaaf 0 grade es // Kaart die waardes van die MPU6050 sensor van -90 tot 90 na waardes wat geskik is vir die servobesturing van 0 tot 180 int servo0Value = map (ypr [0], -90, 90, 0, 180); int servo1Value = kaart (ypr [1], -90, 90, 0, 180); int servo2Value = kaart (ypr [2], -90, 90, 180, 0); // Beheer die servo's volgens die MPU6050 -oriëntasie servo0.write (servo0Value); servo1.write (servo1Value); servo2.write (servo2Value); } #endif}}

Uiteindelik, met behulp van die skryffunksie, stuur ons hierdie waardes as bedieningsseine na die servo's. U kan die Yaw -servo natuurlik deaktiveer as u net stabilisering vir die X- en Y -as wil hê, en hierdie platform as kamera -gimbal kan gebruik

Stap 9: As al die komponente verbind is, lyk dit soos hierdie prent

As al die komponente verbind is, lyk dit soos hierdie prent
As al die komponente verbind is, lyk dit soos hierdie prent

Stap 10: Plaas nou al die basiese goed in die blik

Plaas nou al die basiese goed in die blik
Plaas nou al die basiese goed in die blik

Stap 11: As al die drade en komponente in 'n voedselblik geplaas word, kan 'n lijmpistool aan die onderkant van die skuimplaat aangebring word

As al die drade en komponente in 'n kos geplaas word, kan 'n lijmpistool aan die onderkant van die skuimplaat aangebring word
As al die drade en komponente in 'n kos geplaas word, kan 'n lijmpistool aan die onderkant van die skuimplaat aangebring word

Stap 12: Gevolgtrekking

Let asseblief daarop dat dit nie 'n goeie kamera is nie. Die bewegings is nie glad nie, want hierdie servo's is nie bedoel vir so 'n doel nie. Regte kamera -gimbels gebruik 'n spesiale tipe BLDC -motor om gladde bewegings te kry. Beskou hierdie projek dus slegs vir opvoedkundige doeleindes.

Dit is alles vir hierdie tutoriaal; ek hoop dat u dit geniet het en iets nuuts geleer het. Stel gerus enige vrae in die kommentaarafdeling hieronder en moenie vergeet om my versamelings van die projek na te gaan nie

Aanbeveel: