Innholdsfortegnelse:

Motion Control Gimbal: 12 trinn
Motion Control Gimbal: 12 trinn

Video: Motion Control Gimbal: 12 trinn

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

Hei alle sammen, jeg heter Harji Nagi. Jeg er for tiden andreårsstudent som studerer elektronikk og kommunikasjonsteknikk fra Pranveer Singh Institute Of Technology, Kanpur (UP). Jeg har en stor interesse for robotikk, arduino, kunstig intelligens og analog elektronikk.

Ordet "gimbal" er definert som en svingbar støtte som tillater rotasjon av ethvert objekt i en enkelt akse. Så en tre-akset gimbal tillater ethvert objekt montert på gimbalen å være uavhengig av bevegelsen til den som holder gimbalen. Gimbalen dikterer objektets bevegelse, ikke den som bærer den.

Den består av 3 MG996R servomotorer for 3-akset kontroll, og en base som MPU6050-sensoren, Arduino og batteriet skal plasseres på. Den brukes til å holde kameraet stabilisert uten vibrasjoner. En 3-akset gimbal sørger for at kameraets bevegelse stabiliseres selv om den som holder det går opp og ned, venstre og høyre, foran og bak. Dette er det vi omtaler som gjeving, stigning og rullestabilisering.

Trinn 1: Komponentliste

Komponentlisten er:

1) Arduino Uno

2) 8V, 1,5 Amp batteri for å drive Arduino Uno

3) 7805 Spenningsregulator Ic eller du kan bruke bukkekonvektor

4) MPU 6050

5) 3*(MG995 SERVO -motorer)

6) Jumper Wires

Annet utstyr:

1) Loddejern

2) Limpistol

3) Boremaskin

4) Matboks

I stedet for å bruke breadborad har jeg brukt et lite, tilpasset perf -bord for positiv og negativ bussforbindelse

Trinn 2: Montering

Montering
Montering
Montering
Montering

Foamcore, foamboard, eller paper-faced foamboard er et lett og lett kuttet materiale som brukes til montering av servomotor og for å lage skalamodeller.

For det første laget jeg en DIY L-formet brakett for å montere servomotor ved hjelp av skumplate.

Trinn 3:

Bilde
Bilde

Å montere gimbalen var ganske enkelt. Jeg begynte med å installere Yaw-servoen, MPU 6050-sensoren og PÅ-AV-bryteren. Ved hjelp av bolter og muttere festet jeg den til basen

Trinn 4: Deretter sikret jeg rulleservoen med samme metode. delene er spesielt designet for å enkelt montere MG995 -servoene

Deretter sikret jeg rulleservoen med samme metode. delene er spesielt designet for å enkelt montere MG995 -servoene
Deretter sikret jeg rulleservoen med samme metode. delene er spesielt designet for å enkelt montere MG995 -servoene

Trinn 5: Deretter sikret jeg rulleservoen med samme metode. delene er spesielt designet for å enkelt montere MG995 -servoene

Deretter sikret jeg rulleservoen med samme metode. delene er spesielt designet for å enkelt montere MG995 -servoene
Deretter sikret jeg rulleservoen med samme metode. delene er spesielt designet for å enkelt montere MG995 -servoene

Trinn 6: Tilkoblinger

Tilkoblinger
Tilkoblinger

I kretsdiagrammet kan du enten bruke buck -omformer eller 7805 spenningsregulator IC til å konvertere 8V til 5 V. Mikrokontrolleren som er gitt kretsdiagrammet er Arduino Nano, du kan også bruke Arduino Uno, Arduino Mega.

SCL- og SDA -pinnene på MPU 6050 er koblet til Arduino Analog pin A5 og A4. (SCL og SDA pin kan variere, så sjekk databladet for SCl og SDA pins for annen mikrokontroller)

Trinn 7: Tilkobling med 7805 spenningsregulator IC

Tilkobling med 7805 spenningsregulator IC
Tilkobling med 7805 spenningsregulator IC

Dette kretsdiagrammet er for tilkobling av 7805 spenningsregulator ic, koble 8v batteriet på Vin, og du får en utgangsspenning på 5v.

Trinn 8: Koding

Du må inkludere følgende biblioteker:

1) #includeKlikk her for å laste ned zip -fil

2) #includeKlikk her for å laste ned zip -fil

Etter at du har lastet ned zip -filen, legger du til zip -bibliotek i arduino -skisse

For kode

/*

DIY Gimbal - MPU6050 Arduino Tutorial Code basert på MPU6050_DMP6 -eksemplet fra i2cdevlib -biblioteket av Jeff Rowberg: https://github.com/jrowberg/i2cdevlib */// I2Cdev og MPU6050 må installeres som biblioteker, ellers.cpp/.h filer // for begge klasser må være i inkluderingsbanen til prosjektet ditt #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // #include "MPU6050.h" // ikke nødvendig hvis du bruker MotionApps include file / / Arduino Wire -bibliotek er påkrevd hvis I2Cdev I2CDEV_ARDUINO_WIRE -implementering // brukes i I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // class default I2C address is 0x68 // specific I2C bestått som parameter her // AD0 lav = 0x68 (standard for SparkFun breakout og InvenSense evalueringstavle) // AD0 høy = 0x69 MPU6050 mpu; // MPU6050 mpu (0x69); // <- bruk for AD0 høy // Definer de 3 servomotorene Servo servo0; Servo servo1; Servo servo2; flyte riktig; int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #define INTERRUPT_PIN 2 // bruk pin 2 på Arduino Uno & de fleste tavler bool blinkState = false; // MPU -kontroll/status vars bool dmpReady = false; // satt true hvis DMP init var vellykket uint8_t mpuIntStatus; // holder faktisk avbruddsstatusbyte fra MPU uint8_t devStatus; // returstatus etter hver enhetsoperasjon (0 = suksess,! 0 = feil) uint16_t packetSize; // forventet DMP -pakkestørrelse (standard er 42 byte) uint16_t fifoCount; // telling av alle byte som for øyeblikket er i FIFO uint8_t fifoBuffer [64]; // FIFO lagringsbuffer // orientering/bevegelse vars Quaternion q; // [w, x, y, z] quaternion container VectorInt16 aa; // [x, y, z] målinger av akselsensorer VectorInt16 aaReal; // [x, y, z] tyngdekraftsfrie akselsensormålinger VectorInt16 aaWorld; // [x, y, z] målinger av accel-sensorer i verdensramme VectorFloat tyngdekraft; // [x, y, z] gravity vector float euler [3]; // [psi, theta, phi] Euler vinkelbeholder float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll container og tyngdekraftvektor // pakkestruktur for InvenSense tekanne demo uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // =================================================== ===================== AVBRYTDETEKSJONSRUTINE === // ======================= =========================================== flyktig bool mpuInterrupt = false; // angir om MPU -avbruddsnålen har gått høyt tomrom dmpDataReady () {mpuInterrupt = true; } // ================================================== ================= // === INITIAL OPPSETT === // ======================= ============================================= ugyldig oppsett () {// bli med i I2C -buss (I2Cdev -biblioteket gjør ikke dette automatisk) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400kHz I2C klokke. Kommenter denne linjen hvis du har problemer med kompilering #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, true); #endif // initialiser seriell kommunikasjon // (115200 valgt fordi det er nødvendig for tekanne -demoutgang, men det er // virkelig opp til deg avhengig av prosjektet ditt) Serial.begin (38400); mens (! Seriell); // vent på Leonardo -oppregning, andre fortsetter umiddelbart // initialiserer enheten //Serial.println(F("Initialiserer I2C -enheter … ")); mpu.initialize (); pinMode (INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize (); // levere dine egne gyro -forskyvninger her, skalert for min følsomhet mpu.setXGyroOffset (17); mpu.setYGyroOffset (-69); mpu.setZGyroOffset (27); mpu.setZAccelOffset (1551); // 1688 fabrikkstandard for testbrikken min // sørg for at den fungerte (returnerer 0 i så fall) hvis (devStatus == 0) {// slår på DMP, nå som den er klar // Serial.println (F ("Aktiverer DMP … ")); mpu.setDMPEnabled (true); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // sett vårt DMP Ready -flagg slik at hovedsløyfen () -funksjonen vet at det er greit å bruke det //Serial.println(F("DMP klar! Venter på første avbrudd … ")); dmpReady = true; // få forventet DMP -pakkestørrelse for senere sammenligning packetSize = mpu.dmpGetFIFOPacketSize (); } annet {// FEIL! // 1 = initial minnelast mislyktes // 2 = DMP -konfigurasjonsoppdateringer mislyktes // (hvis den skal gå i stykker, vil koden vanligvis være 1) // Serial.print (F ("DMP -initialisering mislyktes (kode")); //Serial.print(devStatus); //Serial.println (F (")")); } // Definer pinnene som de 3 servomotorene er koblet til servo0.attach (10); servo1. fest (9); servo2. fest (8); } // ================================================== ================= // === HOVEDPROGRAMLØP === // ====================== ============================================= ugyldig loop () { / / hvis programmeringen mislyktes, ikke prøv å gjøre noe hvis (! dmpReady) kommer tilbake; // vent på MPU -avbrudd eller ekstra pakke (r) tilgjengelig mens (! mpuInterrupt && fifoCount <packetSize) {if (mpuInterrupt && fifoCount

= 1024) {

// tilbakestill slik at vi kan fortsette rent mpu.resetFIFO (); fifoCount = mpu.getFIFOCount (); Serial.println (F ("FIFO -overløp!")); // ellers, se etter DMP -data klar avbrudd (dette skal skje ofte)} ellers hvis (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// vent på riktig tilgjengelig datalengde, bør være en VELDIG kort ventetid mens (fifoCount 1 pakke tilgjengelig / / (dette lar oss umiddelbart lese mer uten å vente på et avbrudd) fifoCount -= packetSize; // Få Yaw, Pitch and Roll -verdier #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& mv,.dmpGetYawPitchRoll (ypr, & q, & gravity); // Yaw, Pitch, Roll -verdier - Radianer til grader ypr [0] = ypr [0] * 180 / M_PI; ypr [1] = ypr [1] * 180 / M_PI; ypr [2] = ypr [2] * 180 / M_PI; // Hopp over 300 avlesninger (selvkalibreringsprosess) hvis (j <= 300) {correct = ypr [0]; // Yaw starter med tilfeldig verdi, så vi fange siste verdi etter 300 avlesninger j ++;} // Etter 300 avlesninger annet {ypr [0] = ypr [0] - riktig; // Sett Yaw til 0 grader - trekk den siste tilfeldige Yaw -verdien fra gjeldende verdi for å gjøre Gjev 0 grader es // Kart verdiene til MPU6050 -sensoren fra -90 til 90 til verdier som egner seg for servokontrollen fra 0 til 180 int servo0Value = map (ypr [0], -90, 90, 0, 180); int servo1Value = map (ypr [1], -90, 90, 0, 180); int servo2Value = map (ypr [2], -90, 90, 180, 0); // Kontroller servoene i henhold til MPU6050 -orienteringen servo0.write (servo0Value); servo1.write (servo1Value); servo2.write (servo2Value); } #slutt om } }

Til slutt ved å bruke skrivefunksjonen, sender vi disse verdiene til servoene som styresignaler. Selvfølgelig kan du deaktivere Yaw -servoen hvis du bare vil stabilisere X- og Y -aksen, og bruke denne plattformen som kameragimbal

Trinn 9: Når alle komponentene er tilkoblet, ser det ut som dette bildet

Når alle komponentene er tilkoblet, ser det ut som dette bildet
Når alle komponentene er tilkoblet, ser det ut som dette bildet

Trinn 10: Sett nå alt grunnstoff i matboksen

Sett nå alt grunnstoff i matboksen
Sett nå alt grunnstoff i matboksen

Trinn 11: Når alle ledningene og komponentene er plassert inne i en matboks, kan du deretter påføre limpistolen på bunnen av skumplaten

Når alle ledninger og komponenter er plassert inne i en matvare, kan limpistolen påføres på basen av skumplaten
Når alle ledninger og komponenter er plassert inne i en matvare, kan limpistolen påføres på basen av skumplaten

Trinn 12: Konklusjon

Vær oppmerksom på at dette langt fra er en god kameragimbal. Bevegelsene er ikke jevne fordi disse servoene ikke er ment for et slikt formål. Ekte kameraklokker bruker en spesiell type BLDC -motor for å få jevne bevegelser. Så vurder dette prosjektet bare for utdanningsformål.

Det ville være alt for denne opplæringen, jeg håper du likte den og lærte noe nytt. Still gjerne spørsmål i kommentarfeltet nedenfor, og ikke glem å sjekke mine samlinger av prosjekter

Anbefalt: