Sisukord:

Liikumise juhtimine: 12 sammu
Liikumise juhtimine: 12 sammu

Video: Liikumise juhtimine: 12 sammu

Video: Liikumise juhtimine: 12 sammu
Video: СЕЛЬСКИЙ МУЖИК на ВАЗ 2108 против ПОНТОРЕЗОВ на МАЖОРНЫХ СПОРТКАРАХ !!! 2024, November
Anonim
Image
Image

Tere kõigile, minu nimi on Harji Nagi. Olen praegu teise kursuse tudeng, kes õpib elektroonikat ja kommunikatsioonitehnikat Pranveer Singhi Tehnoloogiainstituudist, Kanpur (UP). Mul on suur huvi robootika, arduino, tehisintellekti ja analoog -elektroonika vastu.

Sõna "gimbal" on määratletud kui pöördliige, mis võimaldab mis tahes objekti pöörlemist ühel teljel. Seega võimaldab kolmeteljeline kardaan ükskõik millisele kardaanile kinnitatud objektile olla sõltumatu kardaani hoidva liikumisest. Kardaan dikteerib eseme, mitte selle kandja liikumist.

See koosneb kolmest 3-teljelise juhtimise servomootorist MG996R ja alusest, millele paigutatakse MPU6050 andur, Arduino ja aku. Seda kasutatakse kaamera stabiliseerimiseks ilma vibratsioonita. 3-teljeline kardaan tagab kaamera liikumise stabiliseerimise isegi siis, kui seda hoidev liigub üles ja alla, vasakule ja paremale, ette ja taha. Seda me nimetame pöörde, kaldenurga ja veeremise stabiliseerimiseks.

Samm: komponentide loend

Komponentide loend on järgmine:

1) Arduino Uno

2) 8 V, 1,5 Amp aku Arduino Uno toiteks

3) 7805 Pingeregulaator Ic või võite kasutada buck conveterit

4) MPU 6050

5) 3*(MG995 SERVO mootorid)

6) Jumper juhtmed

Muud seadmed:

1) jootekolb

2) Liimipüstol

3) puurmasin

4) Toit saab

Leivapiirkonna kasutamise asemel olen kasutanud positiivse ja negatiivse bussiühenduse jaoks väikest kohandatud perfoplaati

2. samm: kokkupanek

Kokkupanek
Kokkupanek
Kokkupanek
Kokkupanek

Vahtplaat, vahtplaat või paberkattega vahtplaat on kerge ja kergesti lõigatav materjal, mida kasutatakse servomootori paigaldamiseks ja mastaabimudelite valmistamiseks.

Esiteks tegin vahtplaadi abil servomootori paigaldamiseks DIY L-kujulised sulgud.

3. samm:

Pilt
Pilt

Kardaani kokkupanek oli üsna lihtne. Alustasin Yaw servo, MPU 6050 anduri ja ON-OFF lüliti paigaldamisega. Kinnitasin selle poltide ja mutritega aluse külge

Samm 4: Järgmiseks kinnitasin rullservo sama meetodit kasutades. osad on spetsiaalselt loodud MG995 servode hõlpsaks paigaldamiseks

Järgmiseks kinnitasin sama meetodit kasutades rulli servo. osad on spetsiaalselt loodud MG995 servode hõlpsaks paigaldamiseks
Järgmiseks kinnitasin sama meetodit kasutades rulli servo. osad on spetsiaalselt loodud MG995 servode hõlpsaks paigaldamiseks

Samm 5: Järgmisena kinnitasin sama meetodi abil rulli servo. osad on spetsiaalselt loodud MG995 servode hõlpsaks paigaldamiseks

Järgmisena kinnitasin sama meetodit kasutades rulli servo. osad on spetsiaalselt loodud MG995 servode hõlpsaks paigaldamiseks
Järgmisena kinnitasin sama meetodit kasutades rulli servo. osad on spetsiaalselt loodud MG995 servode hõlpsaks paigaldamiseks

6. samm: ühendused

Ühendused
Ühendused

Lülitusskeemil saate 8V 5 V muundamiseks kasutada kas buck -muundurit või 7805 pingeregulaatori IC -d. Lülitusskeemil olev mikrokontroller on Arduino Nano, saate kasutada ka Arduino Uno, Arduino Mega.

MPU 6050 SCL- ja SDA -tihvtid on ühendatud Arduino analoogpistikuga A5 ja A4. (SCL- ja SDA -tihvtid võivad erineda, seega vaadake teiste mikrokontrollerite SCl- ja SDA -tihvtide andmelehte)

Samm 7: Ühendamine 7805 pingeregulaatori IC -ga

Ühendus 7805 pingeregulaatori IC -ga
Ühendus 7805 pingeregulaatori IC -ga

See skeem on mõeldud 7805 pingeregulaatori ic ühendamiseks, ühendage 8 V aku Viniga ja saate väljundpinge 5 V.

8. samm: kodeerimine

Peate lisama järgmised teegid:

1) #includeZip -faili allalaadimiseks klõpsake siin

2) #includeZip -faili allalaadimiseks klõpsake siin

Pärast zip -faili allalaadimist lisage arduino visandisse zip -raamatukogu

Koodi jaoks

/*

DIY Gimbal - MPU6050 Arduino õpetuskood, mis põhineb Jeff Rowbergi i2cdevlib raamatukogu MPU6050_DMP6 näitel: https://github.com/jrowberg/i2cdevlib */// I2Cdev ja MPU6050 tuleb installida raamatukogudena või muidu.cpp/.h failid // mõlema klassi jaoks peavad olema teie projekti kaasamise teel #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // #include "MPU6050.h" // pole vajalik, kui kasutate MotionApps include file / / Arduino Wire raamatukogu on vajalik, kui rakenduses I2Cdev I2CDEV_ARDUINO_WIRE // kasutatakse rakenduses I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // klassi vaikimisi I2C aadress on 0x68 // võib olla I2C aadress edastatud siin parameetrina // AD0 madal = 0x68 (vaikimisi SparkFuni läbilöögi ja InvenSense'i hindamiskeskuse jaoks) // AD0 kõrge = 0x69 MPU6050 mpu; // MPU6050 mpu (0x69); // <- kasutage AD0 kõrge jaoks // Määrake 3 servomootorit Servo servo0; Servo servo1; Servo servo2; ujuk õige; int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #defineeri INTERRUPT_PIN 2 // kasuta tihvti 2 Arduino Unos ja enamik tahvleid bool blinkState = false; // MPU juhtimine/olek vars bool dmpReady = false; // seada tõeseks, kui DMP init õnnestus uint8_t mpuIntStatus; // omab tegelikku katkestuse oleku baiti MPU -st uint8_t devStatus; // tagastab oleku pärast iga seadme toimingut (0 = õnnestumine,! 0 = viga) uint16_t packetSize; // eeldatav DMP paketi suurus (vaikimisi on 42 baiti) uint16_t fifoCount; // kõigi baitide arv praegu FIFO -s uint8_t fifoBuffer [64]; // FIFO salvestuspuhver // orientatsioon/liikumine vars Quaternion q; // [w, x, y, z] kvaternionikonteiner VectorInt16 aa; // [x, y, z] accel sensori mõõtmised VectorInt16 aaReal; // [x, y, z] gravitatsioonivabad accel-anduri mõõtmised VectorInt16 aaWorld; // [x, y, z] maailmakaadris olevad accel-anduri mõõtmised VectorFloat gravitatsioon; // [x, y, z] gravitatsioonivektori ujuk euler [3]; // [psi, teeta, phi] Euleri nurgakonteineri ujuk ypr [3]; // [pööramine, kaldenurk, rull] kaldumine/kaldenurk/rullmahuti ja gravitatsioonivektor // pakettstruktuur InvenSense teekannu demo jaoks uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // ================================================ ================ // === Katkestuste tuvastamise rutiin === // ===================== =========================================== lenduv bool mpuInterrupt = vale; // näitab, kas MPU katkestusnõel on läinud tühjaks dmpDataReady () {mpuInterrupt = true; } // ================================================ ================= // === ALGSEADISTUS === // ===================== =========================================== void setup () {// liitu I2C siiniga (I2Cdev raamatukogu ei tee seda automaatselt) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400 kHz I2C kell. Kommenteerige seda rida, kui teil on koostamisraskusi #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, true); #endif // jadaühenduse initsialiseerimine // (115200 on valitud, kuna see on vajalik teekannu demoväljundiks, kuid see on // tõesti teie otsustada sõltuvalt teie projektist) Serial.begin (38400); while (! Seeria); // oodake Leonardo loendamist, teised jätkavad kohe // seadme lähtestamine //Serial.println(F(" I2C -seadmete initsialiseerimine … ")); mpu.initialize (); pinMode (INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize (); // esitage siin oma güroskoopide nihked, skaleerides minimaalse tundlikkuse järgi mpu.setXGyroOffset (17); mpu.setYGyroOffset (-69); mpu.setZGyroOffset (27); mpu.setZAccelOffset (1551); // minu testkiibi tehase vaikeseade 1688 // veenduge, et see toimiks (tagastab 0, kui jah), kui (devStatus == 0) {// lülitage DMP sisse nüüd, kui see on valmis // Serial.println (F ("Lubamine DMP … ")); mpu.setDMPEnabled (tõene); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // seadistage meie DMP -valmiduslipp nii, et põhisilmuse () funktsioon teaks, et seda on hea kasutada //Serial.println(F("DMP valmis! Ootan esimest katkestust … ")); dmpReady = tõsi; // saada oodatud DMP paketi suurus hilisemaks võrdluseks packetSize = mpu.dmpGetFIFOPacketSize (); } muu {// VIGA! // 1 = esialgne mälu laadimine ebaõnnestus // 2 = DMP konfiguratsiooni värskendamine ebaõnnestus // (kui see läheb katki, on tavaliselt kood 1) // Serial.print (F ("DMP -vormindamine nurjus (kood")); //Serial.print(devStatus); //Serial.println (F (")")); } // Määrake tihvtid, millega 3 servomootorit on ühendatud servo0.attach (10); servo1.kinnitus (9); servo2.kinnitus (8); } // ================================================ ================= // === PÕHIPROGRAMMI LOOP === // ==================== ============================================ void loop () { / / kui programmeerimine ebaõnnestus, ärge proovige midagi teha, kui (! dmpReady) naaseb; // oodake, kuni MPU katkestus või lisapakett (id) on saadaval (! mpuInterrupt && fifoCount <packetSize) {if (mpuInterrupt && fifoCount

= 1024) {

// lähtestamine, et saaksime puhtalt jätkata mpu.resetFIFO (); fifoCount = mpu.getFIFOCount (); Serial.println (F ("FIFO ülevool!")); // muidu kontrollige, kas DMP -d on valmis katkestama (seda peaks sageli juhtuma)} else if (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// oodake õiget saadaolevat andmepikkust, peaks olema VÄGA lühike ooteaeg (fifoCount 1 pakett saadaval /) / (see võimaldab meil kohe rohkem lugeda ilma katkestust ootamata) fifoCount -= packetSize; // Hankige pöörde, helikõrguse ja rulli väärtused #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravity).dmpGetYawPitchRoll (ypr, & q, & gravitatsioon); // Yaw, Pitch, Roll väärtused - radiaanid kraadides ypr [0] = ypr [0] * 180 / M_PI; ypr [1] = ypr [1] * 180 / M_PI; ypr [2] = ypr [2] * 180 / M_PI; // Jäta 300 näitu vahele (isekalibreerimisprotsess), kui (j <= 300) {correct = ypr [0]; // Kaldumine algab juhusliku väärtusega, seega viimase väärtuse jäädvustamine pärast 300 lugemist j ++;} // pärast 300 lugemist muud {ypr [0] = ypr [0] - õige; // Määrake pöördenurk 0 kraadi - lahutage viimane juhuslik pöörde väärtus praegusest väärtusest Kõver 0 kraadi es // Kaardista MPU6050 anduri väärtused vahemikus -90 kuni 90 servovõrgu jaoks sobivate väärtusteni vahemikus 0 kuni 180 int servo0Value = map (ypr [0], -90, 90, 0, 180); int servo1Value = kaart (ypr [1], -90, 90, 0, 180); int servo2Value = kaart (ypr [2], -90, 90, 180, 0); // Juhtige servosid vastavalt MPU6050 orientatsioonile servo0.write (servo0Value); servo1.write (servo1Value); servo2.write (servo2Value); } #endif}}

Lõpuks kirjutamisfunktsiooni kasutades saadame need väärtused servodele juhtimissignaalidena. Muidugi, kui soovite X- ja Y -telje stabiliseerimist, saate Yaw servo keelata ja kasutada seda platvormi kaamera kardaanina

Samm: kui kõik komponendid on ühendatud, näeb see välja sarnane sellele pildile

Kui kõik komponendid on ühendatud, näeb see välja sarnane sellele pildile
Kui kõik komponendid on ühendatud, näeb see välja sarnane sellele pildile

Samm: sisestage nüüd kõik toidukannu sisse pandud alused

Nüüd sisestage kõik aluspurgid toidukarbi sisse
Nüüd sisestage kõik aluspurgid toidukarbi sisse

Samm 11: Kui kõik juhtmed ja komponendid on paigutatud toiduaine sisse, saab seejärel vahtplaadi alusele liimipüstoli kanda

Kui kõik juhtmed ja komponendid on toiduaine sisse pandud, saab seejärel vahtplaadi alusele liimipüstoli kanda
Kui kõik juhtmed ja komponendid on toiduaine sisse pandud, saab seejärel vahtplaadi alusele liimipüstoli kanda

12. samm: järeldus

Pange tähele, et see pole kaugeltki hea kaamera kardaan. Liigutused ei ole sujuvad, sest need servod pole selliseks otstarbeks mõeldud. Tõelised kaamera kardaanid kasutavad sujuva liikumise saamiseks spetsiaalset tüüpi BLDC mootorit. Niisiis, kaaluge seda projekti ainult hariduslikel eesmärkidel.

See oleks selle õpetuse jaoks kõik, loodan, et teile meeldis ja õppisite midagi uut. Küsige julgelt kõiki küsimusi allpool olevas kommentaaride jaotises ja ärge unustage kontrollida oma projekti kogusid

Soovitan: