Inhoudsopgave:

Gimbal voor bewegingsbesturing - Ajarnpa
Gimbal voor bewegingsbesturing - Ajarnpa

Video: Gimbal voor bewegingsbesturing - Ajarnpa

Video: Gimbal voor bewegingsbesturing - Ajarnpa
Video: DJI FPV DRONE (+ Motion Controller) video review (NL) 2024, December
Anonim
Image
Image

Hallo allemaal, mijn naam is Harji Nagi. Ik ben momenteel een tweedejaars student die elektronica en communicatietechniek studeert aan het Pranveer Singh Institute of Technology, Kanpur (UP). Ik heb een grote interesse in robotica, arduino, kunstmatige intelligentie en analoge elektronica.

Het woord "gimbal" wordt gedefinieerd als een scharnierende ondersteuning die rotatie van elk object op een enkele as mogelijk maakt. Dus een drie-assige gimbal zorgt ervoor dat elk object dat op de gimbal is gemonteerd, onafhankelijk is van de beweging van degene die de gimbal vasthoudt. De gimbal dicteert de beweging van het object, niet degene die het draagt.

Het bestaat uit 3 MG996R-servomotoren voor de 3-assige besturing en een basis waarop de MPU6050-sensor, de Arduino en de batterij worden geplaatst. Het wordt gebruikt om de camera gestabiliseerd te houden zonder trillingen. Een 3-assige gimbal zorgt ervoor dat de beweging van de camera wordt gestabiliseerd, zelfs als degene die hem vasthoudt op en neer gaat, links en rechts, voor en achter. Dit is wat we yaw-, pitch- en roll-stabilisatie noemen.

Stap 1: Onderdelenlijst

De componentenlijst zijn:

1)Arduino Uno

2) 8V, 1,5 Amp batterij voor het voeden van Arduino Uno

3) 7805 Spanningsregelaar Ic of u kunt buck-conveter gebruiken

4) MPU 6050

5) 3 * (MG995 SERVO-motoren)

6) Jumperdraden

Andere uitrustingen:

1) Soldeerbout:

2) Lijmpistool:

3) Boormachine:

4)Voedsel kan:

In plaats van breadborad te gebruiken, heb ik een klein coustom perf-bord gebruikt voor positieve en negatieve busverbinding

Stap 2: Montage

in elkaar zetten
in elkaar zetten
in elkaar zetten
in elkaar zetten

Foamcore, foamboard of paper-faced foamboard is een lichtgewicht en gemakkelijk te snijden materiaal dat wordt gebruikt voor het monteren van servomotoren en voor het maken van schaalmodellen.

Eerst heb ik een doe-het-zelf L-vormige beugels gemaakt om de servomotor te monteren met behulp van foamboard.

Stap 3:

Afbeelding
Afbeelding

Het monteren van de gimbal was vrij eenvoudig. Ik begon met het installeren van de Yaw-servo, MPU 6050-sensor en AAN-UIT-schakelaar. Met behulp van bouten en moeren heb ik het aan de basis bevestigd

Stap 4: Vervolgens, met dezelfde methode als ik de Roll Servo heb beveiligd. de onderdelen zijn speciaal ontworpen om gemakkelijk op de MG995-servo's te passen

Vervolgens heb ik met dezelfde methode de rolservo beveiligd. de onderdelen zijn speciaal ontworpen om gemakkelijk op de MG995-servo's te passen
Vervolgens heb ik met dezelfde methode de rolservo beveiligd. de onderdelen zijn speciaal ontworpen om gemakkelijk op de MG995-servo's te passen

Stap 5: Vervolgens, met dezelfde methode als ik de Roll Servo heb beveiligd. de onderdelen zijn speciaal ontworpen om gemakkelijk op de MG995-servo's te passen

Vervolgens heb ik met dezelfde methode de rolservo beveiligd. de onderdelen zijn speciaal ontworpen om gemakkelijk op de MG995-servo's te passen
Vervolgens heb ik met dezelfde methode de rolservo beveiligd. de onderdelen zijn speciaal ontworpen om gemakkelijk op de MG995-servo's te passen

Stap 6: Aansluitingen

Verbindingen
Verbindingen

In het schakelschema kun je een buck-converter of 7805 spanningsregelaar IC gebruiken om 8V naar 5 V te converteren. De microcontroller die het schakelschema krijgt, is Arduino Nano. Je kunt ook Arduino Uno, Arduino Mega gebruiken.

De SCL- en SDA-pinnen van MPU 6050 zijn verbonden met Arduino Analoge pin A5 en A4. (SCL- en SDA-pin kunnen variëren, dus bekijk de datasheet voor SCl- en SDA-pinnen voor andere microcontrollers)

Stap 7: Aansluiting met 7805 spanningsregelaar IC

Aansluiting Met 7805 Spanningsregelaar IC
Aansluiting Met 7805 Spanningsregelaar IC

Dit schakelschema is voor de aansluiting van 7805 spanningsregelaar ic, sluit de 8v accu aan op Vin en je krijgt een uitgangsspanning van 5v.

Stap 8: Coderen

U moet de volgende bibliotheken opnemen:

1)#includeClick Hereom zip-bestand te downloaden

2)#includeKlik hier om het zipbestand te downloaden

Voeg na het downloaden van het zipbestand de zip-bibliotheek toe in arduino sketch

Voor code:

/*

DIY Gimbal - MPU6050 Arduino-zelfstudiecode gebaseerd op het MPU6050_DMP6-voorbeeld uit de i2cdevlib-bibliotheek van Jeff Rowberg: https://github.com/jrowberg/i2cdevlib */ // I2Cdev en MPU6050 moeten als bibliotheken worden geïnstalleerd, of anders de.cpp/.h-bestanden // voor beide klassen moeten in het include-pad van uw project staan #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" //#include "MPU6050.h" // niet nodig bij gebruik van MotionApps include file / / Arduino Wire-bibliotheek is vereist als I2Cdev I2CDEV_ARDUINO_WIRE-implementatie // wordt gebruikt in I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // class standaard I2C-adres is 0x68 // specifieke I2C-adressen kunnen zijn hier als parameter doorgegeven // AD0 laag = 0x68 (standaard voor SparkFun breakout en InvenSense evaluatiebord) // AD0 hoog = 0x69 MPU6050 mpu; // MPU6050 mpu (0x69); // <-- gebruik voor AD0 hoog // Definieer de 3 servomotoren Servo servo0; Servo-servo1; Servo-servo2; drijven correct; intj = 0; #define OUTPUT_READABLE_YAWPITCHROLL #define INTERRUPT_PIN 2 // gebruik pin 2 op Arduino Uno & de meeste boards bool blinkState = false; // MPU-besturing/status vars bool dmpReady = false; // stel waar in als DMP init succesvol was uint8_t mpuIntStatus; // bevat actuele interruptstatusbyte van MPU uint8_t devStatus; // retourstatus na elke apparaatbewerking (0 = geslaagd, !0 = fout) uint16_t packetSize; // verwachte DMP-pakketgrootte (standaard is 42 bytes) uint16_t fifoCount; // telling van alle bytes die momenteel in FIFO zijn uint8_t fifoBuffer [64]; // FIFO-opslagbuffer // oriëntatie/beweging vars Quaternion q; // [w, x, y, z] quaternion-container VectorInt16 aa; // [x, y, z] accel sensor metingen VectorInt16 aaReal; // [x, y, z] zwaartekracht-vrije accel sensor metingen VectorInt16 aaWorld; // [x, y, z] wereld-frame accel sensor metingen VectorFloat zwaartekracht; // [x, y, z] zwaartekracht vector float euler [3]; // [psi, theta, phi] Euler hoekcontainer vlotter ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container en zwaartekracht vector // pakketstructuur voor InvenSense theepot demo uint8_t teapotPacket[14] = { '$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\r', '\n'}; // ================================================ ================ // === DETECTIEROUTINE ONDERBREKEN === // ===================== =========================================== vluchtige bool mpuInterrupt = false; // geeft aan of de MPU-interrupt-pin high is geworden void dmpDataReady() { mpuInterrupt = true; } // =============================================== ================= // === EERSTE INSTELLING === // ===================== =========================================== ongeldige setup() { // join I2C bus (I2Cdev bibliotheek doet dit niet automatisch) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin(); Draad.setClock(400000); // 400 kHz I2C-klok. Geef commentaar op deze regel als u compilatieproblemen heeft #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, true); #endif // initialiseer seriële communicatie // (115200 gekozen omdat het vereist is voor uitvoer van theepotdemo's, maar het is echt aan jou, afhankelijk van je project) Serial.begin(38400); terwijl (!Serial); // wacht op Leonardo-opsomming, anderen gaan onmiddellijk verder // initialiseer apparaat //Serial.println(F ("Initializing I2C devices…")); mpu.initialiseren(); pinMode (INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize(); // geef hier uw eigen gyro-offsets op, geschaald voor minimale gevoeligheid mpu.setXGyroOffset (17); mpu.setYGyroOffset(-69); mpu.setZGyroOffset(27); mpu.setZAccelOffset (1551); // 1688 fabrieksinstelling voor mijn testchip // zorg ervoor dat het werkte (retourneert 0 als dat het geval is) if (devStatus == 0) { // zet de DMP aan, nu deze klaar is // Serial.println(F ("Enabling DMP…")); mpu.setDMPEnabled(true); attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus(); // stel onze DMP Ready-vlag zo in dat de hoofdlus()-functie weet dat het goed is om het te gebruiken //Serial.println(F("DMP ready! Waiting for first interrupt…")); dmpReady = waar; // haal de verwachte DMP-pakketgrootte op voor latere vergelijking packetSize = mpu.dmpGetFIFOPacketSize(); } anders { // FOUT! // 1 = initiële geheugenbelasting mislukt // 2 = DMP-configuratie-updates mislukt // (als het kapot gaat, is de code meestal 1) // Serial.print(F ("DMP-initialisatie mislukt (code ")); //Serial.print(devStatus); //Serial.println(F(")")); } // Definieer de pinnen waarop de 3 servomotoren zijn aangesloten servo0.attach(10); servo1.attach (9); servo2.attach(8); } // =============================================== ================= // === HOOFDPROGRAMMA LUS === // ==================== ============================================ ongeldige lus() { / / als het programmeren is mislukt, probeer dan niets te doen als (!dmpReady) terugkeert; // wacht op MPU-interrupt of extra pakket (en) beschikbaar terwijl (!mpuInterrupt && fifoCount <packetSize) {if (mpuInterrupt && fifoCount

= 1024) {

// reset zodat we netjes kunnen doorgaan mpu.resetFIFO(); fifoCount = mpu.getFIFOCount(); Serial.println(F("FIFO-overloop!")); // controleer anders op DMP data ready interrupt (dit zou vaak moeten gebeuren) } else if (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) { // wacht op de juiste beschikbare datalengte, zou een ZEER korte wachttijd moeten zijn terwijl (fifoCount 1 pakket beschikbaar // / (hierdoor kunnen we meteen meer lezen zonder te wachten op een onderbreking) fifoCount -= packetSize; // Get Yaw, Pitch and Roll-waarden #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); // Yaw, Pitch, Roll-waarden - Radialen naar graden ypr[0] = ypr[0] * 180 / M_PI; ypr[1] = ypr[1] * 180 / M_PI; ypr[2] = ypr[2] * 180 / M_PI; // 300 metingen overslaan (zelfkalibratieproces) als (j <= 300) { correct = ypr[0]; // Yaw begint bij een willekeurige waarde, dus we laatste waarde vastleggen na 300 metingen j++; } // Na 300 metingen else { ypr[0] = ypr[0] - corrigeren; // Stel de Yaw in op 0 deg - trek de laatste willekeurige Yaw-waarde af van de huidige waarde om de Yaw 0 graden es // Wijs de waarden van de MPU6050-sensor van -90 tot 90 toe aan waarden die geschikt zijn voor de servobesturing van 0 tot 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); // Bedien de servo's volgens de MPU6050-oriëntatie servo0.write (servo0Value); servo1.write(servo1Value); servo2.write(servo2Value); } #stop als } }

Tenslotte gebruiken we de schrijffunctie om deze waarden als stuursignalen naar de servo's te sturen. Natuurlijk kun je de Yaw-servo uitschakelen als je alleen stabilisatie voor de X- en Y-as wilt, en dit platform als camera-gimbal gebruiken

Stap 9: Als alle componenten zijn aangesloten, ziet het eruit als op deze afbeelding

Wanneer alle componenten zijn aangesloten, ziet het eruit als op deze afbeelding
Wanneer alle componenten zijn aangesloten, ziet het eruit als op deze afbeelding

Stap 10: Plaats nu alle basisspullen in het voedselblik

Steek nu alle basisspullen in het voedselblik
Steek nu alle basisspullen in het voedselblik

Stap 11: Wanneer alle draden en componenten in een voedselblik zijn geplaatst, breng dan een lijmpistool aan op de basis van de schuimplaat

Wanneer alle draden en componenten in een voedselblik zijn geplaatst, past u een lijmpistool toe aan de onderkant van de schuimplaat
Wanneer alle draden en componenten in een voedselblik zijn geplaatst, past u een lijmpistool toe aan de onderkant van de schuimplaat

Stap 12: Conclusie

Houd er rekening mee dat dit verre van een goede camera-gimbal is. De bewegingen zijn niet vloeiend omdat deze servo's daar niet voor bedoeld zijn. Echte camera-gimbals gebruiken een speciaal type BLDC-motor voor soepele bewegingen. Overweeg dit project dus alleen voor educatieve doeleinden.

Dat zou alles zijn voor deze tutorial, ik hoop dat je ervan genoten hebt en iets nieuws hebt geleerd. Stel gerust een vraag in de opmerkingen hieronder en vergeet niet mijn projectcollecties te controleren

Aanbevolen: