Indholdsfortegnelse:

Motion Control Gimbal: 12 trin
Motion Control Gimbal: 12 trin

Video: Motion Control Gimbal: 12 trin

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

Hej allesammen, mit navn er Harji Nagi. Jeg er i øjeblikket en andenårsstuderende, der studerer elektronik og kommunikationsteknik fra Pranveer Singh Institute Of Technology, Kanpur (UP). Jeg har en stor interesse for robotik, arduino, kunstig intelligens og analog elektronik.

Ordet "gimbal" er defineret som en svingbar støtte, der tillader rotation af ethvert objekt i en enkelt akse. Så en tre-akset gimbal tillader ethvert objekt monteret på gimbalen at være uafhængigt af bevægelsen af den, der holder gimbalen. Gimbalen dikterer objektets bevægelse, ikke den, der bærer det.

Den består af 3 MG996R servomotorer til 3-akset styring og en base, hvorpå MPU6050-sensoren, Arduino og batteriet placeres. Det bruges til at holde kameraet stabiliseret uden vibrationer. En 3-akset gimbal sikrer, at kameraets bevægelse stabiliseres, selvom den, der holder det, går op og ned, venstre og højre, for og bag. Dette er det, vi omtaler som stabilisering af gaffel, pitch og rull.

Trin 1: Komponentliste

Komponentlisten er:

1) Arduino Uno

2) 8V, 1,5 Amp batteri til strømforsyning af Arduino Uno

3) 7805 Spændingsregulator Ic eller du kan bruge bukkekonvektor

4) MPU 6050

5) 3*(MG995 SERVO -motorer)

6) Jumper Wires

Andet udstyr:

1) Loddejern

2) Limpistol

3) Boremaskine

4) Maddåse

I stedet for at bruge breadborad har jeg brugt lille coustom perf board til positiv og negativ busforbindelse

Trin 2: Samling

Montering
Montering
Montering
Montering

Foamcore, skumbræt eller skumbræt med papir er et let og letskåret materiale, der bruges til montering af servomotor og til fremstilling af skalamodeller.

For det første lavede jeg en DIY L-formede beslag til montering af servomotor ved hjælp af skumplade.

Trin 3:

Billede
Billede

Det var ganske let at samle gimbalen. Jeg startede med at installere Yaw-servoen, MPU 6050-sensoren og ON-OFF-kontakten. Ved hjælp af bolte og møtrikker fik jeg fastgjort den til basen

Trin 4: Derefter sikrede jeg rulleservoen ved hjælp af den samme metode. delene er specielt designet til let at montere MG995 -servoerne

Derefter sikrede jeg rulleservoen ved hjælp af den samme metode. delene er specifikt designet til let at montere MG995 -servoerne
Derefter sikrede jeg rulleservoen ved hjælp af den samme metode. delene er specifikt designet til let at montere MG995 -servoerne

Trin 5: Derefter sikrede jeg rulleservoen ved hjælp af den samme metode. delene er specielt designet til let at montere MG995 -servoerne

Derefter sikrede jeg rulleservoen ved hjælp af den samme metode. delene er specielt designet til let at montere MG995 -servoerne
Derefter sikrede jeg rulleservoen ved hjælp af den samme metode. delene er specielt designet til let at montere MG995 -servoerne

Trin 6: Forbindelser

Forbindelser
Forbindelser

I kredsløbsdiagrammet kan du enten bruge buck converter eller 7805 spændingsregulator IC til at konvertere 8V til 5 V. Mikrokontrolleren, der får kredsløbsdiagrammet, er Arduino Nano, du kan også bruge Arduino Uno, Arduino Mega.

SCL- og SDA -benene på MPU 6050 er forbundet til Arduino Analog pin A5 og A4. (SCL og SDA pin kan variere, så tjek datablad for SCl og SDA ben til anden mikrokontroller)

Trin 7: Tilslutning med 7805 spændingsregulator IC

Tilslutning med 7805 spændingsregulator IC
Tilslutning med 7805 spændingsregulator IC

Dette kredsløbsdiagram er til tilslutning af 7805 spændingsregulator ic, tilslut 8v batteriet på Vin, og du får en udgangsspænding på 5v.

Trin 8: Kodning

Du skal inkludere følgende biblioteker:

1) #includeKlik her for at downloade zip -fil

2) #includeKlik her for at downloade zip -fil

Efter download af zip -filen skal du tilføje zip -bibliotek i arduino -skitse

For kode

/*

DIY Gimbal - MPU6050 Arduino Tutorial Code baseret på MPU6050_DMP6 -eksemplet fra i2cdevlib -biblioteket af Jeff Rowberg: https://github.com/jrowberg/i2cdevlib */// I2Cdev og MPU6050 skal installeres som biblioteker, ellers skal.cpp/.h filer // for begge klasser skal være i inkluderingsstien til dit projekt #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // #include "MPU6050.h" // ikke nødvendigt, hvis du bruger MotionApps include file / / Arduino Wire -bibliotek er påkrævet, hvis I2Cdev I2CDEV_ARDUINO_WIRE implementering // bruges i I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // class default I2C address is 0x68 // specific I2C bestået som parameter her // AD0 lav = 0x68 (standard for SparkFun breakout og InvenSense evalueringstavle) // AD0 høj = 0x69 MPU6050 mpu; // MPU6050 mpu (0x69); // <- brug til AD0 høj // Definer de 3 servomotorer Servo servo0; Servo servo1; Servo servo2; flyde korrekt; int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #define INTERRUPT_PIN 2 // brug pin 2 på Arduino Uno & de fleste boards bool blinkState = false; // MPU -kontrol/status vars bool dmpReady = false; // sæt sand, hvis DMP init var vellykket uint8_t mpuIntStatus; // holder den faktiske afbrydelsesstatusbyte fra MPU uint8_t devStatus; // returstatus efter hver enhedsoperation (0 = succes,! 0 = fejl) uint16_t packetSize; // forventet DMP -pakkestørrelse (standard er 42 bytes) uint16_t fifoCount; // tæller alle bytes i øjeblikket i FIFO uint8_t fifoBuffer [64]; // FIFO lagringsbuffer // orientering/bevægelse vars Quaternion q; // [w, x, y, z] quaternion container VectorInt16 aa; // [x, y, z] accel sensor målinger VectorInt16 aaReal; // [x, y, z] tyngdekraftsfri accelesensormålinger VectorInt16 aaWorld; // [x, y, z] målinger af accel-sensor i verdensramme VectorFloat tyngdekraft; // [x, y, z] gravitation vektor float euler [3]; // [psi, theta, phi] Euler vinkelbeholder float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll container og tyngdekraftvektor // pakkestruktur til InvenSense tekande demo uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // ==================================================== ===================== AFBrydelsesopdagelsesrutine === // ========================= ============================================ flygtige bool mpuInterrupt = false; // angiver, om MPU -afbrydelsesnål er gået højt tomrum dmpDataReady () {mpuInterrupt = true; } // ================================================== ====================== INDLEDENDE OPSÆTNING === // ======================= ============================================= ugyldig opsætning () {// slutte sig til I2C -bus (I2Cdev -bibliotek gør dette ikke automatisk) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400kHz I2C ur. Kommenter denne linje, hvis du har problemer med kompilering #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, true); #endif // initialiser seriel kommunikation // (115200 valgt, fordi det er påkrævet for Teapot Demo -output, men det er // virkelig op til dig afhængigt af dit projekt) Serial.begin (38400); mens (! Seriel); // vent på Leonardo -optælling, andre fortsætter med det samme // initialiserer enhed //Serial.println(F("Initialiserer I2C -enheder … ")); mpu.initialize (); pinMode (INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize (); // angiv dine egne gyrokompensationer her, skaleret til min følsomhed mpu.setXGyroOffset (17); mpu.setYGyroOffset (-69); mpu.setZGyroOffset (27); mpu.setZAccelOffset (1551); // 1688 fabriksstandard for min testchip // sørg for, at den fungerede (returnerer i givet fald 0) hvis (devStatus == 0) {// tænder DMP, nu hvor den er klar // Serial.println (F ("Aktivering DMP … ")); mpu.setDMPEnabled (true); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // indstil vores DMP Ready -flag, så hovedsløjfen () -funktionen ved, at det er i orden at bruge det //Serial.println(F("DMP klar! Venter på første afbrydelse … ")); dmpReady = sand; // få forventet DMP -pakkestørrelse til senere sammenligning packetSize = mpu.dmpGetFIFOPacketSize (); } andet {// FEJL! // 1 = initial hukommelsesindlæsning mislykkedes // 2 = DMP -konfigurationsopdateringer mislykkedes // (hvis den går i stykker, vil koden normalt være 1) // Serial.print (F ("DMP -initialisering mislykkedes (kode")); //Serial.print(devStatus); //Serial.println (F (")")); } // Definer stifterne, som de 3 servomotorer er tilsluttet servo0.attach (10); servo1. vedhæft (9); servo2. vedhæfte (8); } // =================================================== ====================== HOVEDPROGRAMLØB === // ====================== ============================================== ugyldig loop () { / / hvis programmeringen mislykkedes, prøv ikke at gøre noget, hvis (! dmpReady) vender tilbage; // vent på MPU -afbrydelse eller ekstra pakker, mens (! mpuInterrupt && fifoCount <packetSize) {if (mpuInterrupt && fifoCount

= 1024) {

// nulstil, så vi kan fortsætte rent mpu.resetFIFO (); fifoCount = mpu.getFIFOCount (); Serial.println (F ("FIFO -overløb!")); // ellers skal du kontrollere, om DMP -data er klar til afbrydelse (dette skal ske ofte)} ellers hvis (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// vente på korrekt tilgængelig datalængde, skulle være en MEGET kort ventetid, mens (fifoCount 1 pakke tilgængelig / / (dette lader os straks læse mere uden at vente på en afbrydelse) fifoCount -= packetSize; // Få Yaw, Pitch og Roll værdier #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& magt,.dmpGetYawPitchRoll (ypr, & q, & tyngdekraft); // Yaw, Pitch, Roll værdier - Radianer til grader ypr [0] = ypr [0] * 180 / M_PI; ypr [1] = ypr [1] * 180 / M_PI; ypr [2] = ypr [2] * 180 / M_PI; // Spring 300 aflæsninger (selvkalibreringsproces) over, hvis (j <= 300) {correct = ypr [0]; // Yaw starter med tilfældig værdi, så vi fange sidste værdi efter 300 aflæsninger j ++;} // Efter 300 aflæsninger ellers {ypr [0] = ypr [0] - korrekt; // Indstil Yaw til 0 grader - træk den sidste tilfældige Yaw -værdi fra den aktuelle værdi for at gøre Kæft 0 grader es // Kortlæg værdierne for MPU6050 -sensoren fra -90 til 90 til værdier, der er egnede til servostyringen 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); // Styr servoerne i henhold til MPU6050 -orienteringen servo0.write (servo0Value); servo1.write (servo1Value); servo2.write (servo2Value); } #Afslut Hvis } }

Endelig ved hjælp af skrivefunktionen sender vi disse værdier til servoerne som styresignaler. Selvfølgelig kan du deaktivere Yaw -servoen, hvis du bare vil stabilisere X- og Y -aksen, og bruge denne platform som kameragimbal

Trin 9: Når alle komponenter er tilsluttet, ligner det dette billede

Når alle komponenter er tilsluttet, ligner det dette billede
Når alle komponenter er tilsluttet, ligner det dette billede

Trin 10: Indsæt nu alle basisvarer i madbeholderen

Indsæt nu alle bundstykker inde i madbeholderen
Indsæt nu alle bundstykker inde i madbeholderen

Trin 11: Når alle ledninger og komponenter er placeret inde i en fødevarekande, kan der derefter påføres limpistol i bunden af skumpladen

Når alle ledninger og komponenter er placeret inde i en fødevare kan derefter påført limpistol i bunden af skumpladen
Når alle ledninger og komponenter er placeret inde i en fødevare kan derefter påført limpistol i bunden af skumpladen

Trin 12: Konklusion

Bemærk venligst dette langt fra god kameragimbal. Bevægelserne er ikke glatte, fordi disse servoer ikke er beregnet til et sådant formål. Ægte kamerabøjler bruger en særlig type BLDC -motor til at få glatte bevægelser. Så overvej dette projekt kun til uddannelsesmæssige formål.

Det ville være alt for denne vejledning, jeg håber du nød det og lærte noget nyt. Stil gerne ethvert spørgsmål i kommentarfeltet herunder, og glem ikke at tjekke mine samlinger af projekter

Anbefalede: