Sadržaj:

Gimbal za upravljanje kretanjem: 12 koraka
Gimbal za upravljanje kretanjem: 12 koraka

Video: Gimbal za upravljanje kretanjem: 12 koraka

Video: Gimbal za upravljanje kretanjem: 12 koraka
Video: Sorrento, Italy Walking Tour - 4K60fps with Captions *NEW* 2024, Studeni
Anonim
Image
Image

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

Riječ "gimbal" definirana je kao okretni oslonac koji omogućuje 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. Gimbal diktira kretanje predmeta, 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. 3-osni gimbal osigurava stabilizaciju kretanja fotoaparata čak i ako se onaj koji ga drži kreće gore-dolje, lijevo i desno, sprijeda i straga. To je ono što nazivamo stabilizacijom zakretanja, koraka i okretanja.

Korak 1: Popis komponenti

Popis komponenti je:

1) Arduino Uno

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

3) 7805 Regulator napona Ic ili možete koristiti Buck konvektor

4) MPU 6050

5) 3*(MG995 SERVO motori)

6) Žice kratkospojnika

Ostala oprema:

1) Lemilica

2) Pištolj za ljepilo

3) Stroj za bušenje

4) Limenka za hranu

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

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 držače u obliku slova L za montažu servo motora uz pomoć pjenaste ploče.

3. korak:

Slika
Slika

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 bazu

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

Veze
Veze

U dijagramu kruga možete upotrijebiti pretvarač dolara ili 7805 regulator napona IC za pretvaranje 8V u 5 V. Mikrokontroler koji ima 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 mogu se razlikovati pa provjerite podatkovnu tablicu za SCl i SDA pinove za drugi mikrokontroler)

Korak 7: Povezivanje s IC regulatorom napona 7805

Povezivanje s IC regulatorom napona 7805
Povezivanje s IC regulatorom napona 7805

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

Korak 8: Kodiranje

Morate uključiti sljedeće knjižnice:

1) #includeKliknite ovdje za preuzimanje zip datoteke

2) #includeKliknite ovdje za preuzimanje zip datoteke

Nakon preuzimanja zip datoteke, dodajte zip biblioteku u arduino skicu

Za kod

/*

DIY Gimbal - MPU6050 Arduino Tutorial Code temeljen 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 potrebna je 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čan I ovdje je proslijeđen 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 ispravan; 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 = pogreška) uint16_t packetSize; // očekivana veličina paketa DMP (zadana vrijednost je 42 bajta) uint16_t fifoCount; // broj svih bajtova trenutno u FIFO uint8_t fifoBuffer [64]; // FIFO memorijski međuspremnik // orijentacija/kretanje promjenjivo Quaternion q; // [w, x, y, z] kvaterionski spremnik VectorInt16 aa; // [x, y, z] mjerenja osjetnika 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] gravitacijski vektor float euler [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 === // ========================== ============================================ isparljivo bool mpuInterrupt = false; // označava je li pin za prekid MPU -a otišao visoko void dmpDataReady () {mpuInterrupt = true; } // ================================================= ================= // === POČETNE POSTAVKE === // ===================== ============================================ void setup () {// pridruži se sabirnici I2C (knjižnica I2Cdev to ne radi automatski) #ako I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400 kHz I2C sat. Komentirajte ovaj redak ako imate poteškoća s sastavljanjem #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, istina); #endif // inicijalizirati serijsku komunikaciju // (115200 odabrano jer je potrebno za demo izlaz Teapot -a, ali // stvarno 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 testni č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 = istina; // dobiti očekivanu veličinu paketa DMP za kasniju usporedbu packetSize = mpu.dmpGetFIFOPacketSize (); } else {// GREŠKA! // 1 = početno učitavanje memorije nije uspjelo // 2 = ažuriranja DMP konfiguracije nisu uspjela // (ako će se prekinuti, obično će kôd biti 1) // Serial.print (F ("DMP Initialization failed (code"))); //Serial.print(devStatus); //Serial.println (F (")")); } // Definirajte pinove na koje su spojena 3 servo motora servo0.attach (10); servo1.priključak (9); servo2.priključak (8); } // ================================================= ================= // === KLUK GLAVNOG PROGRAMA === // ==================== ============================================ void loop () { / / ako programiranje nije uspjelo, 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) {

// resetiranje kako bismo mogli nastaviti čisto mpu.resetFIFO (); fifoCount = mpu.getFIFOCount (); Serial.println (F ("FIFO prelijevanje!")); // u protivnom, provjerite ima li prekida za spremanje DMP podataka (to bi se trebalo događati često)} inače ako (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// pričeka ispravnu raspoloživu duljinu podataka, trebalo bi biti VRLO kratko čekanje (paket fifoCount 1 dostupan / / (ovo nam omogućuje da odmah pročitamo više bez čekanja na prekid) fifoCount -= packetSize; // Dobijte vrijednosti Yaw, Pitch and Roll #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravitacija, & gravitacija, & gravity,.dmpGetYawPitchRoll (ypr, & q, & gravity); // Vrijednosti skretanja, nagiba, nagiba - Radijani na stupnjeve 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 (postupak samokalibracije) ako (j <= 300) {ispravno = ypr [0]; // Zakretanje počinje slučajnom vrijednošću, pa hvatanje posljednje vrijednosti nakon 300 očitanja j ++;} // Nakon 300 očitanja ostalo {ypr [0] = ypr [0] - ispravno; // Postavite Yaw na 0 stupnjeva - oduzmite posljednju slučajnu vrijednost Yaw od trenutne vrijednosti kako biste dobili Odstupanje 0 stupnjeva 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 = karta (ypr [2], -90, 90, 180, 0); // Upravljajte servo pogonima prema orijentaciji MPU6050 servo0.write (servo0Value); servo1.write (servo1Value); servo2.write (servo2Value); } #završi ako } }

Konačno, koristeći funkciju pisanja, te 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 te ovu platformu koristiti 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: Kad se sve žice i komponente postave unutar hrane, tada se na podlogu od pjene može nanijeti pištolj za ljepilo

Kad se sve žice i dijelovi postave unutar hrane, tada se može primijeniti pištolj za ljepilo na dnu ploče od pjene
Kad se sve žice i dijelovi postave unutar hrane, tada se može primijeniti pištolj za ljepilo na dnu ploče od pjene

Korak 12: Zaključak

Imajte na umu da je ovo daleko od dobrog fotoaparata. Pokreti nisu glatki jer ti servomotori nisu namijenjeni za tu svrhu. Pravi gimbali za fotoaparate koriste posebnu vrstu BLDC motora za glatko kretanje. 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čeni: