Innehållsförteckning:
- Steg 1: Komponentlista
- Steg 2: Montering
- Steg 3:
- Steg 4: Därefter säkrade jag rullserven med samma metod. delarna är specifikt utformade för att enkelt passa MG995 -servon
- Steg 5: Därefter säkrade jag rullservon med samma metod. delarna är speciellt utformade för att enkelt passa MG995 -servona
- Steg 6: Anslutningar
- Steg 7: Anslutning med 7805 spänningsregulator IC
- Steg 8: Kodning
- Steg 9: 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
- Steg 11: När alla trådar och komponenter placeras inuti en matburk kan sedan appliceras limpistol vid basen av skumbräda
- Steg 12: Slutsats
Video: Motion Control Gimbal: 12 steg
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:37
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
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:
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
Steg 5: Därefter säkrade jag rullservon med samma metod. delarna är speciellt utformade för att enkelt passa MG995 -servona
Steg 6: 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
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
Steg 10: Sätt nu in alla basvaror 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
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:
Gimbal Stabilizer Project: 9 steg (med bilder)
Gimbal Stabilizer Project: How to Make a Gimbal Lär dig hur du gör en 2-axlig gimbal för din actionkamera I dagens kultur älskar vi alla att spela in video och fånga ögonblicken, särskilt när du är en innehållsskapare som jag, du har säkert mött frågan om så skakig vide
Gyroskopplattform/ kamera Gimbal: 5 steg (med bilder)
Gyroskopplattform/ kamera Gimbal: Denna instruerbara skapades för att uppfylla projektkravet för Makecourse vid University of South Florida (www.makecourse.com)
3D -tryckt kamera Gimbal (Tinkercad Contest): 6 steg
3D -tryckt kamera Gimbal (Tinkercad Contest): Hej, Det här är en kameragimbal som jag designade i Tinkercad. Huvudgimbalen var gjord av This Jar Handle och en fem ringad gimbal / gyro som jag inte verkar kunna hitta längre. Tinkercad -designen hittar du här. Detta var utformat för att fungera på en makt
ITTT Rolando Ritzen - Motion Control Arcade Handske: 5 steg
ITTT Rolando Ritzen - Motion Control Arcade Glove: En handschoen som du kan använda som rörelsekontroll för skyttar på järnväg. De gimmick van dit project is that alles motion control is, including it schieten. (Je schiet door te " finger bangen ")
Enkel Gimbal med Micro: bit och 2 servon: 4 steg
Enkel Gimbal Med Micro: bit och 2 Servos: Hej! Idag ska jag visa dig hur du gör en enkel gimbalstabilisator. Du kan se YouTube -videon här. Den kommer att hålla en ljuskamera. Men om du sätter en mer kraftfull servo och struktur kan den hålla din smartphone eller till och med en riktig kamera. I nästa steg