Sadržaj:

Gimbal za kontrolu pokreta: 12 koraka
Gimbal za kontrolu pokreta: 12 koraka

Video: Gimbal za kontrolu pokreta: 12 koraka

Video: Gimbal za kontrolu pokreta: 12 koraka
Video: 🟠 HOTWAV NOTE 12 - ДЕТАЛЬНЫЙ ОБЗОР и ТЕСТЫ 2024, Novembar
Anonim
Image
Image

Pozdrav svima, moje ime je Harji Nagi. Trenutno sam student druge godine studija elektronike i komunikacijskog inženjeringa na Tehnološkom institutu Pranveer Singh, Kanpur (UP). Imam veliko zanimanje za robotiku, arduino, umjetnu inteligenciju i analognu elektroniku.

Riječ "gimbal" definirana je kao okretni oslonac koji omogućava rotaciju bilo kojeg objekta u jednoj osi. Dakle, troosni gimbal omogućuje da svaki objekt montiran na gambalu bude neovisan o kretanju onog koji drži gimbal. Kartal diktira kretanje objekta, a ne onoga koji ga nosi.

Sastoji se od 3 servo motora MG996R za troosno upravljanje i baze na koju će biti postavljeni senzor MPU6050, Arduino i baterija. Koristi se za stabilizaciju kamere bez vibracija. Troosni kardan osigurava da se kretanje kamere stabilizuje čak i ako se ona koja je drži kreće gore i dolje, lijevo i desno, sprijeda i straga. To je ono što nazivamo stabilizacijom zakretanja, koraka i okretanja.

Korak 1: Lista komponenti

Lista komponenti je:

1) Arduino Uno

2) 8V, 1.5 Amp baterija za napajanje Arduino Uno

3) 7805 Regulator napona Ic ili možete upotrijebiti konvektor buck

4) MPU 6050

5) 3*(MG995 SERVO motori)

6) Premosne žice

Ostala oprema:

1) Lemilica

2) Pištolj za ljepilo

3) Mašina za bušenje

4) Limenka za hranu

Umjesto hljeba, koristio sam malu coustom perf ploču za pozitivnu i negativnu vezu sabirnice

Korak 2: Sklapanje

Sklapanje
Sklapanje
Sklapanje
Sklapanje

Foamcore, pjenasta ploča ili pjenasta ploča od papira lagani su i lako rezani materijali koji se koriste za montažu servo motora i izradu maketa.

Prvo sam napravio "uradi sam" držače u obliku slova L za montažu servo motora uz pomoć pjenaste ploče.

Korak 3:

Image
Image

Sklapanje gimbala bilo je prilično jednostavno. Počeo sam s instaliranjem Yaw servo, MPU 6050 senzora i prekidača za uključivanje-isključivanje. Vijcima i maticama pričvrstio sam ga za podnožje

Korak 4: Zatim, koristeći istu metodu, osigurao sam Roll Servo. dijelovi su posebno dizajnirani za jednostavno postavljanje servomotora MG995

Zatim sam, koristeći istu metodu, osigurao Roll Servo. dijelovi su posebno dizajnirani za jednostavno postavljanje servomotora MG995
Zatim sam, koristeći istu metodu, osigurao Roll Servo. dijelovi su posebno dizajnirani za jednostavno postavljanje servomotora MG995

Korak 5: Zatim, koristeći istu metodu, osigurao sam Roll Servo. dijelovi su posebno dizajnirani za jednostavno postavljanje servomotora MG995

Zatim sam, koristeći istu metodu, osigurao Roll Servo. dijelovi su posebno dizajnirani za jednostavno postavljanje servomotora MG995
Zatim sam, koristeći istu metodu, osigurao Roll Servo. dijelovi su posebno dizajnirani za jednostavno postavljanje servomotora MG995

Korak 6: Veze

Connections
Connections

U dijagramu kruga možete upotrijebiti pretvarač napona ili 7805 regulator napona IC za pretvaranje 8V u 5 V. Mikrokontroler koji je dobio shemu sklopa je Arduino Nano, možete koristiti i Arduino Uno, Arduino Mega.

SCL i SDA pinovi MPU 6050 spojeni su na Arduino analogni pin A5 i A4. (SCL i SDA pin se mogu razlikovati pa provjerite tehnički list za SCl i SDA pinove za drugi mikrokontroler)

Korak 7: Povezivanje pomoću IC -a regulatora napona 7805

Veza sa IC regulatorom napona 7805
Veza sa IC regulatorom napona 7805

Ovaj dijagram kola služi za povezivanje regulatora napona 7805 ic, spojite 8v bateriju na Vin i dobit ćete izlazni napon od 5v.

Korak 8: Kodiranje

Morate uključiti sljedeće biblioteke:

1) #includeKliknite ovdje za preuzimanje zip datoteke

2) #includeKliknite ovdje za preuzimanje zip datoteke

Nakon preuzimanja zip datoteke, dodajte zip biblioteku u arduino skicu

For Code

/*

DIY Gimbal - MPU6050 Arduino Tutorial Code zasnovan na primjeru MPU6050_DMP6 iz biblioteke i2cdevlib Jeffa Rowberga: https://github.com/jrowberg/i2cdevlib */// I2Cdev i MPU6050 moraju biti instalirani kao biblioteke, ili.cpp/.h datoteke // za obje klase moraju biti na uključenoj stazi vašeg projekta #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // #include "MPU6050.h" // nije potrebno ako koristite MotionApps include file / / Arduino Wire knjižnica je potrebna ako se implementacija I2Cdev I2CDEV_ARDUINO_WIRE // koristi u I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // zadana klasa I2C adresa je 0x68 // specifična I ovdje se prosljeđuje kao parametar // AD0 nisko = 0x68 (zadano za SparkFun proboj i InvenSense evaluacionu ploču) // AD0 visoko = 0x69 MPU6050 mpu; // MPU6050 mpu (0x69); // <- koristi za AD0 high // Definiraj 3 servo motora Servo servo0; Servo servo1; Servo servo2; float pravilno; int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #define INTERRUPT_PIN 2 // koristite pin 2 na Arduino Uno & većina ploča bool blinkState = false; // MPU kontrola/status vars bool dmpReady = false; // postavljanje true ako je DMP init bio uspješan uint8_t mpuIntStatus; // sadrži stvarni bajt statusa prekida iz MPU -a uint8_t devStatus; // vraća status nakon svake operacije uređaja (0 = uspjeh,! 0 = greška) uint16_t packetSize; // očekivana veličina DMP paketa (zadano je 42 bajta) uint16_t fifoCount; // broj svih bajtova trenutno u FIFO uint8_t fifoBuffer [64]; // FIFO memorijski bafer // orijentacija/kretanje promjenjivo Quaternion q; // [w, x, y, z] kvaterionski spremnik VectorInt16 aa; // [x, y, z] mjerenja senzora ubrzanja VectorInt16 aaReal; // [x, y, z] mjerenja senzora ubrzanja bez gravitacije VectorInt16 aaWorld; // [x, y, z] mjerenja senzora ubrzanja u svjetskom okviru VectorFloat gravitacija; // [x, y, z] euler gravitacijskog vektora [3]; // [psi, theta, phi] Euler kutni kontejner plovak ypr [3]; // [skretanje, nagib, kotrljanje] spremnik za skretanje/nagib/kotrljanje i gravitacijski vektor // struktura paketa za demonstraciju InvenSense čajnika uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // ================================================ ================ // === RUTINA OTKRIVANJA PREKIDA === // ===================== ============================================ volatile bool mpuInterrupt = false; // označava da li je pin za prekid MPU -a otišao visoko void dmpDataReady () {mpuInterrupt = true; } // ================================================= ================= // === POČETNE POSTAVKE === // ===================== ========================================== void setup () {// pridruži se I2C sabirnici (biblioteka I2Cdev to ne radi automatski) #iko I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400 kHz I2C sat. Komentirajte ovaj redak ako imate poteškoća pri sastavljanju #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, istina); #endif // inicijaliziraj serijsku komunikaciju // (115200 odabrano jer je potrebno za Teapot Demo izlaz, ali // ovisi o vama ovisno o vašem projektu) Serial.begin (38400); while (! Serijski); // čekamo Leonardovo nabrajanje, drugi nastavljaju odmah // inicijaliziraju uređaj //Serial.println(F("Inicijaliziranje I2C uređaja … ")); mpu.initialize (); pinMode (INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize (); // ovdje unosite vlastite pomake žiroa, prilagođene za minimalnu osjetljivost mpu.setXGyroOffset (17); mpu.setYGyroOffset (-69); mpu.setZGyroOffset (27); mpu.setZAccelOffset (1551); // 1688 tvornički zadani za moj probni čip // provjerite radi li (vraća 0 ako je tako) if (devStatus == 0) {// uključite DMP, sada kada je spreman // Serial.println (F ("Omogućavanje DMP … ")); mpu.setDMPEnabled (true); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // postavljamo zastavu DMP Ready tako da funkcija main loop () zna da je u redu koristiti je //Serial.println(F("DMP spreman! Čeka se prvi prekid … ")); dmpReady = true; // dobiti očekivanu veličinu DMP paketa za kasnije poređenje packetSize = mpu.dmpGetFIFOPacketSize (); } else {// GREŠKA! // 1 = početno učitavanje memorije nije uspjelo // 2 = ažuriranje DMP konfiguracije nije uspjelo // (ako će se prekinuti, obično će kôd biti 1) // Serial.print (F ("DMP inicijalizacija nije uspjela (kod")); //Serial.print(devStatus); //Serial.println (F (")")); } // Definirajte pinove na koje su spojena 3 servo motora servo0.attach (10); servo1.attach (9); servo2.attach (8); } // ================================================= ================= // === KLUK GLAVNOG PROGRAMA === // ==================== ============================================ void loop () { / / ako programiranje nije uspelo, ne pokušavajte ništa učiniti ako se (! dmpReady) vrati; // čekamo na prekid MPU -a ili dodatne pakete koji su dostupni dok (! mpuInterrupt && fifoCount <packetSize) {if (mpuInterrupt && fifoCount

= 1024) {

// resetiramo kako bismo mogli nastaviti čisto mpu.resetFIFO (); fifoCount = mpu.getFIFOCount (); Serial.println (F ("FIFO prelijevanje!")); // u suprotnom, provjerite ima li prekida za spremnost DMP podataka (to bi se trebalo događati često)} inače ako (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// čekate ispravnu raspoloživu dužinu podataka, trebalo bi biti VRLO kratko čekanje dok je (fifoCount 1 paket dostupan / / (ovo nam omogućava da odmah pročitamo više bez čekanja na prekid) fifoCount -= packetSize; // Dobijte vrijednosti zakretanja, koraka i zaokreta #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravitacija, & gravitacija, & gravity,.dmpGetYawPitchRoll (ypr, & q, & gravity); // vrijednosti skretanja, nagiba, nagiba - radijani na stepene ypr [0] = ypr [0] * 180 / M_PI; ypr [1] = ypr [1] * 180 / M_PI; ypr [2] = ypr [2] * 180 / M_PI; // Preskočite 300 očitanja (proces samokalibracije) ako (j <= 300) {ispravno = ypr [0]; // Zakretanje počinje slučajnom vrijednošću, pa ćemo hvatanje posljednje vrijednosti nakon 300 očitavanja j ++;} // Nakon 300 očitavanja ostalo {ypr [0] = ypr [0] - ispravno; // Postavite Yaw na 0 stepeni - oduzmite posljednju slučajnu vrijednost Yaw od trenutne vrijednosti kako biste dobili Odmak 0 stepeni es // Preslikajte vrijednosti senzora MPU6050 od -90 do 90 na vrijednosti prikladne za servo kontrolu od 0 do 180 int servo0Value = map (ypr [0], -90, 90, 0, 180); int servo1Value = karta (ypr [1], -90, 90, 0, 180); int servo2Value = map (ypr [2], -90, 90, 180, 0); // Upravljajte servo pogonima prema orijentaciji MPU6050 servo0.write (servo0Value); servo1.write (servo1Value); servo2.write (servo2Value); } #endif}}

Konačno, koristeći funkciju pisanja, ove vrijednosti šaljemo servo upravljačima kao upravljačke signale. Naravno, možete onemogućiti Yaw servo ako želite samo stabilizaciju za osi X i Y i koristiti ovu platformu kao gimbal kamere

Korak 9: Kad su sve komponente povezane, izgleda slično ovoj slici

Kad su sve komponente povezane, izgleda slično ovoj slici
Kad su sve komponente povezane, izgleda slično ovoj slici

Korak 10: Sada umetnite sve osnovne stvari u posudu za hranu

Sada umetnite sve osnovne stvari u posudu za hranu
Sada umetnite sve osnovne stvari u posudu za hranu

Korak 11: Kada se sve žice i komponente postave unutar hrane, tada se može primijeniti pištolj za ljepilo na podnožje ploče od pjene

Kada se sve žice i komponente smjeste unutar hrane, tada se na podlogu od pjene može nanijeti pištolj za ljepilo
Kada se sve žice i komponente smjeste unutar hrane, tada se na podlogu od pjene može nanijeti pištolj za ljepilo

Korak 12: Zaključak

Imajte na umu da je ovo daleko od dobrog gimbala kamere. Pokreti nisu glatki jer ovi servo motori nisu namijenjeni za tu svrhu. Pravi gimbali za fotoaparate koriste posebnu vrstu BLDC motora za postizanje glatkih pokreta. Dakle, razmislite o ovom projektu samo u obrazovne svrhe.

To bi bilo sve za ovaj vodič, nadam se da ste uživali i naučili nešto novo. Slobodno postavite bilo koje pitanje u donjem odjeljku komentara i ne zaboravite provjeriti moje zbirke projekata

Preporučuje se: