Innehållsförteckning:

Motion Control Gimbal: 12 steg
Motion Control Gimbal: 12 steg

Video: Motion Control Gimbal: 12 steg

Video: Motion Control Gimbal: 12 steg
Video: How to setup and use PNY Mobee GIMBAL STABILIZER FOR SMARTPHONE 2024, Juli
Anonim
Image
Image

Hej alla, jag heter Harji Nagi. Jag studerar för närvarande andra året på elektronik och kommunikationsteknik från Pranveer Singh Institute Of Technology, Kanpur (UP). Jag har ett stort intresse för robotik, arduino, artificiell intelligens och analog elektronik.

Ordet "gimbal" definieras som ett svängbart stöd som möjliggör rotation av alla objekt i en enda axel. Så en tre-axlig gimbal tillåter alla föremål som är monterade på gimbalen att vara oberoende av rörelsen hos den som håller i gimbalen. Gimbalen dikterar föremålets rörelse, inte den som bär det.

Den består av 3 MG996R-servomotorer för 3-axlig styrning och en bas på vilken MPU6050-sensorn, Arduino och batteriet kommer att placeras. Den används för att hålla kameran stabil utan vibrationer. En 3-axlig gimbal säkerställer att kamerans rörelse stabiliseras även om den som håller den går upp och ner, vänster och höger, fram och bak. Detta är vad vi kallar stabilisering av gaffel, tonhöjd och rullning.

Steg 1: Komponentlista

Komponentlistan är:

1) Arduino Uno

2) 8V, 1,5 ampere batteri för att driva Arduino Uno

3) 7805 Spänningsregulator Ic eller så kan du använda buckkonvektor

4) MPU 6050

5) 3*(MG995 SERVO -motorer)

6) Bygeltrådar

Annan utrustning:

1) Lödkolv

2) Limpistol

3) Borrmaskin

4) Matburk

Istället för att använda breadborad har jag använt en liten, anpassad perf -bräda för positiv och negativ bussförbindelse

Steg 2: Montering

Montering
Montering
Montering
Montering

Foamcore, skumbräda eller skumbräda med pappersmaterial är ett lätt och lättskuren material som används för montering av servomotor och för tillverkning av skalmodeller.

Först gjorde jag en DIY L-formade fästen för att montera servomotor med hjälp av skumbräda.

Steg 3:

Bild
Bild

Att montera gimbalen var ganska enkelt. Jag började med att installera Yaw-servon, MPU 6050-sensorn och ON-OFF-omkopplaren. Med bultar och muttrar fixerade jag den till basen

Steg 4: Därefter säkrade jag rullserven med samma metod. delarna är specifikt utformade för att enkelt passa MG995 -servon

Därefter säkrade jag rullservon med samma metod. delarna är speciellt utformade för att enkelt passa MG995 -servona
Därefter säkrade jag rullservon med samma metod. delarna är speciellt utformade för att enkelt passa MG995 -servona

Steg 5: Därefter säkrade jag rullservon med samma metod. delarna är speciellt utformade för att enkelt passa MG995 -servona

Därefter säkrade jag rullserven med samma metod. delarna är specifikt utformade för att enkelt passa MG995 -servon
Därefter säkrade jag rullserven med samma metod. delarna är specifikt utformade för att enkelt passa MG995 -servon

Steg 6: Anslutningar

Anslutningar
Anslutningar

I kretsschemat kan du använda antingen buck -omvandlare eller 7805 spänningsregulator IC för att konvertera 8V till 5 V. Mikrokontrollern som ges kretsschemat är Arduino Nano du kan också använda Arduino Uno, Arduino Mega.

SCL- och SDA -stiften på MPU 6050 är anslutna till Arduino Analog -stift A5 och A4. (SCL- och SDA -stift kan variera så kolla datablad för SCl- och SDA -stift för andra mikrokontroller)

Steg 7: Anslutning med 7805 spänningsregulator IC

Anslutning med 7805 spänningsregulator IC
Anslutning med 7805 spänningsregulator IC

Detta kretsschema är för anslutning av 7805 spänningsregulator ic, anslut 8v batteri på Vin så får du en utspänning på 5v.

Steg 8: Kodning

Du måste inkludera följande bibliotek:

1) #includeKlicka här för att ladda ner zip -fil

2) #includeKlicka här för att ladda ner zip -fil

När du har laddat ner zip -filen lägger du till zip -biblioteket i arduino -skiss

För kod

/*

DIY Gimbal - MPU6050 Arduino Tutorial Code baserat på exemplet MPU6050_DMP6 från i2cdevlib -biblioteket av Jeff Rowberg: https://github.com/jrowberg/i2cdevlib */// I2Cdev och MPU6050 måste installeras som bibliotek, eller annars.cpp/.h -filer // för båda klasserna måste finnas i inkluderingsvägen för ditt projekt #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // #include "MPU6050.h" // inte nödvändigt om du använder MotionApps include file / / Arduino Wire -bibliotek krävs om I2Cdev I2CDEV_ARDUINO_WIRE -implementering // används i I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // class default I2C address is 0x68 // specific I2C adressen är 0x68 // specifik I2C godkänd som parameter här // AD0 låg = 0x68 (standard för SparkFun breakout och InvenSense utvärderingskort) // AD0 hög = 0x69 MPU6050 mpu; // MPU6050 mpu (0x69); // <- använd för AD0 hög // Definiera de tre servomotorerna Servo servo0; Servoservo1; Servo servo2; flyta korrekt; int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #define INTERRUPT_PIN 2 // use pin 2 on Arduino Uno & most boards bool blinkState = false; // MPU -kontroll/status vars bool dmpReady = false; // set true om DMP init lyckades uint8_t mpuIntStatus; // håller den faktiska avbrottsstatusbyte från MPU uint8_t devStatus; // returstatus efter varje enhetsåtgärd (0 = framgång,! 0 = fel) uint16_t packetSize; // förväntad DMP -paketstorlek (standard är 42 byte) uint16_t fifoCount; // räkna alla byte som för närvarande finns i FIFO uint8_t fifoBuffer [64]; // FIFO lagringsbuffert // orientering/motion vars Quaternion q; // [w, x, y, z] quaternion container VectorInt16 aa; // [x, y, z] accelersensormätningar VectorInt16 aaReal; // [x, y, z] gravitation-fria accelersensormätningar VectorInt16 aaWorld; // [x, y, z] accelerationssensormätningar i världsramen VectorFloat gravitation; // [x, y, z] gravitation vektor float euler [3]; // [psi, theta, phi] Euler vinkelbehållare float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll container och gravitation vektor // paketstruktur för InvenSense tekanna demo uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // =================================================== ===================== AVBRYTDETEKTIONSRUTIN === // ======================== =========================================== flyktiga bool mpuInterrupt = false; // anger om MPU -avbrottsstiftet har gått högt tomrum dmpDataReady () {mpuInterrupt = true; } // ================================================== ================= //=== INITIAL INSTÄLLNING === // ====================== ============================================ ogiltig inställning () {// gå med i I2C -buss (I2Cdev -biblioteket gör inte detta automatiskt) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400kHz I2C klocka. Kommentera den här raden om du har problem med sammanställning #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, true); #endif // initiera seriell kommunikation // (115200 valts eftersom det krävs för Teapot Demo -utdata, men det är // verkligen upp till dig beroende på ditt projekt) Serial.begin (38400); medan (! Seriell); // vänta på Leonardo -uppräkning, andra fortsätter omedelbart // initierar enhet //Serial.println(F("Initialiserar I2C -enheter … ")); mpu.initialize (); pinMode (INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize (); // ange dina egna gyroförskjutningar här, skalade för min känslighet mpu.setXGyroOffset (17); mpu.setYGyroOffset (-69); mpu.setZGyroOffset (27); mpu.setZAccelOffset (1551); // 1688 fabriksinställning för mitt testchip // se till att det fungerade (returnerar 0 i så fall) om (devStatus == 0) {// slår på DMP, nu när det är klart // Serial.println (F ("Aktiverar DMP … ")); mpu.setDMPEnabled (true); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // ställ in vår DMP Ready -flagga så att huvudslingfunktionen () vet att det är okej att använda den //Serial.println(F("DMP redo! Väntar på första avbrottet … ")); dmpReady = true; // få förväntad DMP -paketstorlek för senare jämförelse packetSize = mpu.dmpGetFIFOPacketSize (); } annat {// FEL! // 1 = initial minnesbelastning misslyckades // 2 = DMP -konfigurationsuppdateringar misslyckades // (om den kommer att gå sönder brukar koden vara 1) // Serial.print (F ("DMP -initialisering misslyckades (kod")); //Serial.print(devStatus); //Serial.println (F (")")); } // Definiera stiften till vilka de tre servomotorerna är anslutna servo0.attach (10); servo1. fäst (9); servo2. fäst (8); } // ================================================== ====================== HUVUDPROGRAMSLOPP === // ===================== ============================================= void loop () { / / om programmeringen misslyckades, försök inte göra något om (! dmpReady) returnerar; // vänta på MPU -avbrott eller extra paket (er) tillgängliga medan (! mpuInterrupt && fifoCount <packetSize) {if (mpuInterrupt && fifoCount

= 1024) {

// återställ så att vi kan fortsätta rent mpu.resetFIFO (); fifoCount = mpu.getFIFOCount (); Serial.println (F ("FIFO -överflöd!")); // annars, kolla efter DMP -data redo avbrott (detta ska hända ofta)} annars om (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// vänta på korrekt tillgänglig datalängd, bör vara en MYCKET kort väntan medan (fifoCount 1 paket tillgängligt / / (detta gör att vi omedelbart kan läsa mer utan att vänta på ett avbrott) fifoCount -= packetSize; // Få Yaw, Pitch and Roll -värden #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& mervärde, &.dmpGetYawPitchRoll (ypr, & q, & gravitation); // Yaw, Pitch, Roll -värden - Radianer till grader ypr [0] = ypr [0] * 180 / M_PI; ypr [1] = ypr [1] * 180 / M_PI; ypr [2] = ypr [2] * 180 / M_PI; // Hoppa över 300 avläsningar (självkalibreringsprocess) om (j <= 300) {correct = ypr [0]; // Yaw börjar med slumpmässigt värde, så vi fånga sista värdet efter 300 avläsningar j ++;} // Efter 300 avläsningar annars {ypr [0] = ypr [0] - rätt; // Ställ in Yaw till 0 grader - subtrahera det sista slumpmässiga Yaw -värdet från det aktuella värdet för att göra Yaw 0 grader es // Kartlägg MPU6050 -sensorns värden från -90 till 90 till värden som är lämpliga för servostyrningen från 0 till 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 servon enligt MPU6050 -orienteringen servo0.write (servo0Value); servo1.write (servo1Value); servo2.write (servo2Value); } #endif}}

Slutligen med skrivfunktionen skickar vi dessa värden till servon som styrsignaler. Naturligtvis kan du inaktivera Yaw -servon om du bara vill stabilisera X- och Y -axeln och använda denna plattform som kameragimbal

Steg 9: När alla komponenter är anslutna ser det ut som den här bilden

När alla komponenter är anslutna ser det ut som den här bilden
När alla komponenter är anslutna ser det ut som den här bilden

Steg 10: Sätt nu in alla basvaror i matbehållaren

Sätt nu in alla basfoder i matbehållaren
Sätt nu in alla basfoder i matbehållaren

Steg 11: När alla trådar och komponenter placeras inuti en matburk kan sedan appliceras limpistol vid basen av skumbräda

När alla trådar och komponenter är placerade i en livsmedelsburk kan sedan appliceras limpistol vid basen av skumbräda
När alla trådar och komponenter är placerade i en livsmedelsburk kan sedan appliceras limpistol vid basen av skumbräda

Steg 12: Slutsats

Observera detta långt ifrån bra kamera gimbal. Rörelserna är inte släta eftersom dessa servon inte är avsedda för ett sådant syfte. Riktiga kamerakardlar använder en speciell typ av BLDC -motor för att få smidiga rörelser. Så betrakta detta projekt endast för utbildningsändamål.

Det skulle vara allt för denna handledning, jag hoppas att du tyckte om det och lärde dig något nytt. Ställ gärna alla frågor i kommentarfältet nedan och glöm inte att kolla in mina projektsamlingar

Rekommenderad: