Satura rādītājs:

Kustības vadības kardāns: 12 soļi
Kustības vadības kardāns: 12 soļi

Video: Kustības vadības kardāns: 12 soļi

Video: Kustības vadības kardāns: 12 soļi
Video: 20 товаров для автомобиля с Алиэкспресс, автотовары №37 2024, Novembris
Anonim
Image
Image

Labdien, mani sauc Harji Nagi. Pašlaik esmu otrā kursa students, kurš studē elektroniku un komunikāciju inženieriju Pranveer Singh Tehnoloģiju institūtā Kanpūrā (UP). Mani ļoti interesē robotika, arduino, mākslīgais intelekts un analogā elektronika.

Vārds “kardāns” ir definēts kā šarnīrsavienojums, kas ļauj pagriezt jebkuru objektu vienā asī. Tātad trīs asu kardāns ļauj jebkuram kardānam uzstādītam objektam būt neatkarīgam no tā, kas tur kardānu. Gimba diktē objekta kustību, nevis to, kas to nes.

Tas sastāv no 3 servomotoriem MG996R 3 asu vadībai un pamatnes, uz kuras tiks ievietots MPU6050 sensors, Arduino un akumulators. To izmanto, lai saglabātu kameru stabilizētu bez vibrācijas. Trīs asu kardāns nodrošina, ka kameras kustība tiek stabilizēta pat tad, ja turētāja virzās uz augšu un uz leju, pa kreisi un pa labi, priekšā un aizmugurē. Tas ir tas, ko mēs saucam par pagriezienu, slīpuma un rites stabilizāciju.

1. darbība: komponentu saraksts

Komponentu saraksts ir šāds:

1) Arduino Uno

2) 8V, 1,5 ampēru akumulators Arduino Uno barošanai

3) 7805 Sprieguma regulators Ic vai arī varat izmantot buck conveter

4) MPU 6050

5) 3*(MG995 SERVO Motors)

6) Jumper vadi

Citas iekārtas:

1) lodāmurs

2) Līmes pistole

3) urbjmašīna

4) Pārtikas var

Tā vietā, lai izmantotu breadborad, pozitīvam un negatīvam autobusu savienojumam esmu izmantojis nelielu pielāgotu perf dēli

2. solis: salikšana

Salikšana
Salikšana
Salikšana
Salikšana

Foamcore, putuplasta plāksne vai putuplasta plāksne ir viegls un viegli sagriežams materiāls, ko izmanto Servo motora montāžai un mēroga modeļu izgatavošanai.

Vispirms es izveidoju DIY L formas kronšteinus, lai uzstādītu servomotoru ar putuplasta plāksnes palīdzību.

3. darbība:

Attēls
Attēls

Kardāna salikšana bija diezgan vienkārša. Es sāku ar Yaw servo, MPU 6050 sensora un ON-OFF slēdža uzstādīšanu. Izmantojot skrūves un uzgriežņus, es to nostiprināju pie pamatnes

4. solis. Tālāk, izmantojot to pašu metodi, es nostiprināju ruļļa servo. detaļas ir īpaši izstrādātas, lai viegli uzstādītu MG995 servos

Tālāk, izmantojot to pašu metodi, es nostiprināju ruļļa servo. detaļas ir īpaši izstrādātas, lai viegli uzstādītu MG995 servos
Tālāk, izmantojot to pašu metodi, es nostiprināju ruļļa servo. detaļas ir īpaši izstrādātas, lai viegli uzstādītu MG995 servos

5. solis. Tālāk, izmantojot to pašu metodi, es nostiprināju ruļļa servo. detaļas ir īpaši izstrādātas, lai viegli uzstādītu MG995 servos

Tālāk, izmantojot to pašu metodi, es nostiprināju ruļļa servo. detaļas ir īpaši izstrādātas, lai viegli uzstādītu MG995 servos
Tālāk, izmantojot to pašu metodi, es nostiprināju ruļļa servo. detaļas ir īpaši izstrādātas, lai viegli uzstādītu MG995 servos

6. darbība. Savienojumi

Savienojumi
Savienojumi

Shēmas shēmā varat izmantot vai nu buck pārveidotāju, vai 7805 sprieguma regulatoru IC, lai pārveidotu 8V uz 5 V. Mikrokontrolleris, kuram dota shēmas shēma, ir Arduino Nano, varat izmantot arī Arduino Uno, Arduino Mega.

MPU 6050 SCL un SDA tapas ir savienotas ar Arduino analogo tapu A5 un A4. (SCL un SDA tapa var atšķirties, tāpēc pārbaudiet citu mikrokontrolleru SCl un SDA tapu datu lapu)

7. darbība. Savienojums ar 7805 sprieguma regulatoru IC

Savienojums ar 7805 sprieguma regulatoru IC
Savienojums ar 7805 sprieguma regulatoru IC

Šī shēma ir paredzēta 7805 sprieguma regulatora ic savienošanai, pievienojiet 8 voltu akumulatoru pie Vin un jūs saņemsiet 5 v izejas spriegumu.

8. darbība: kodēšana

Jums jāiekļauj šādas bibliotēkas:

1) #includeNoklikšķiniet šeit, lai lejupielādētu zip failu

2) #includeNoklikšķiniet šeit, lai lejupielādētu zip failu

Pēc zip faila lejupielādes pievienojiet ZIP bibliotēku arduino skicē

Par kodu

/*

DIY Gimbal - MPU6050 Arduino apmācības kods, pamatojoties uz Džefa Rouberga i2cdevlib bibliotēkas MPU6050_DMP6 piemēru: https://github.com/jrowberg/i2cdevlib */// I2Cdev un MPU6050 ir jāinstalē kā bibliotēkas, pretējā gadījumā.cpp/.h failiem // abām klasēm jābūt jūsu projekta iekļaušanas ceļā #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // #include "MPU6050.h" // nav nepieciešams, ja izmantojat MotionApps include file / / Arduino Wire bibliotēka ir nepieciešama, ja I2Cdev I2CDEV_ARDUINO_WIRE ieviešana // tiek izmantota I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // klases noklusējuma I2C adrese ir 0x68 // var būt I2C adreses šeit nodots kā parametrs // AD0 zems = 0x68 (noklusējums SparkFun pārtraukumam un InvenSense novērtēšanas padomei) // AD0 augsts = 0x69 MPU6050 mpu; // MPU6050 mpu (0x69); // <- izmantot AD0 augstajam // Definēt 3 servomotorus Servo servo0; Servo servo1; Servo servo2; pludiņš pareizi; int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #define INTERRUPT_PIN 2 // izmantojiet 2. tapu Arduino Uno un lielākā daļa dēļu bool blinkState = false; // MPU kontrole/statuss vars bool dmpReady = false; // iestatīt patiesu, ja DMP init bija veiksmīgs uint8_t mpuIntStatus; // satur faktisko pārtraukšanas statusa baitu no MPU uint8_t devStatus; // atgriešanās statuss pēc katras ierīces darbības (0 = veiksme,! 0 = kļūda) uint16_t packetSize; // paredzamais DMP paketes izmērs (noklusējums ir 42 baiti) uint16_t fifoCount; // visu baitu skaits, kas pašlaik atrodas FIFO uint8_t fifoBuffer [64]; // FIFO krātuves buferis // orientācija/kustība vars Quaternion q; // [w, x, y, z] kvaterniona konteiners VectorInt16 aa; // [x, y, z] accel sensora mērījumi VectorInt16 aaReal; // [x, y, z] accel sensoru mērījumi bez gravitācijas VectorInt16 aaWorld; // [x, y, z] pasaules kadra akselera sensora mērījumi VectorFloat gravity; // [x, y, z] gravitācijas vektora pludiņš eulers [3]; // [psi, teta, phi] Eulera leņķa konteinera pludiņš ypr [3]; // [pagrieziens, slīpums, rullis] satricinājums/slīpuma/ruļļa konteiners un gravitācijas vektors // pakešu struktūra InvenSense tējkannas demonstrācijai uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // ================================================ ================ // === PĀRTRAUKŠANAS NOTEIKŠANAS KĀRTĪBA === // ======================== ============================================ gaistošs bool mpuInterrupt = nepatiess; // norāda, vai MPU pārtraukšanas pin ir kļuvis liels void dmpDataReady () {mpuInterrupt = true; } // ================================================== ================= // === Sākotnējā iestatīšana === // ===================== =========================================== void setup () {// pievienoties I2C kopnei (I2Cdev bibliotēka to nedara automātiski) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400 kHz I2C pulkstenis. Komentējiet šo rindiņu, ja rodas apkopošanas grūtības #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, true); #endif // inicializēt seriālo komunikāciju // (115200 izvēlēts, jo tas ir nepieciešams tējkannas demonstrācijas izvadei, bet tas ir // patiešām atkarīgs no jūsu projekta) Serial.begin (38400); kamēr (! Seriāls); // gaidiet Leonardo uzskaitījumu, citi tūlīt turpina // inicializēt ierīci //Serial.println(F("I2C ierīču inicializēšana … ")); mpu.initialize (); pinMode (INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize (); // šeit ievadiet savus žiroskopu nobīdes, pielāgojot minimālajai jutībai mpu.setXGyroOffset (17); mpu.setYGyroOffset (-69); mpu.setZGyroOffset (27); mpu.setZAccelOffset (1551); // 1688 rūpnīcas noklusējuma iestatījums manai testa mikroshēmai // pārliecinieties, vai tā darbojās (ja tā atgriež 0), ja (devStatus == 0) {// ieslēdziet DMP tagad, kad tas ir gatavs // Serial.println (F ("Iespējo DMP … ")); mpu.setDMPEnabled (true); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // iestatiet mūsu DMP Ready karodziņu, lai galvenā cilpa () funkcija zinātu, ka ir pareizi to izmantot //Serial.println(F("DMP gatavs! Gaida pirmo pārtraukumu … ")); dmpReady = true; // iegūt paredzamo DMP paketes izmēru vēlākai salīdzināšanai packetSize = mpu.dmpGetFIFOPacketSize (); } cits {// KĻŪDA! // 1 = neizdevās sākotnējā atmiņas ielāde // 2 = neizdevās DMP konfigurācijas atjauninājumi // (ja tas pārtrauksies, parasti kods būs 1) // Serial.print (F ("DMP inicializācija neizdevās (kods")); //Serial.print(devStatus); //Serial.println (F (")")); } // Definējiet tapas, kurām ir pievienoti 3 servomotori servo0.attach (10); servo1.pielikums (9); servo2.pielikums (8); } // ================================================== ================= // === GALVENĀS PROGRAMMAS LOOP === // ==================== ============================================ void loop () { / / ja programmēšana neizdevās, nemēģiniet neko darīt, ja (! dmpReady) atgriežas; // gaidiet MPU pārtraukumu vai papildu paketi (-es), kamēr (! mpuInterrupt && fifoCount <packetSize) {if (mpuInterrupt && fifoCount

= 1024) {

// atiestatīt, lai mēs varētu turpināt tīri mpu.resetFIFO (); fifoCount = mpu.getFIFOCount (); Serial.println (F ("FIFO pārpilde!")); // pretējā gadījumā pārbaudiet, vai DMP dati ir gatavi pārtraukt (tam vajadzētu notikt bieži)} else if (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// jāgaida pareizais pieejamais datu garums, jāgaida ĻOTI īsi, kamēr ir pieejama (fifoCount 1 pakete /) / (tas ļauj mums nekavējoties lasīt vairāk, negaidot pārtraukumu) fifoCount -= packetSize; // Iegūstiet pagriešanās, nolaišanās un ripināšanas vērtības #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& grav).dmpGetYawPitchRoll (ypr, & q, & gravity); // Pagriešanās, augstums, rullīšu vērtības - radiāni līdz ypr [0] = ypr [0] * 180 / M_PI; ypr [1] = ypr [1] * 180 / M_PI; ypr [2] = ypr [2] * 180 / M_PI; // Izlaist 300 rādījumus (paškalibrēšanas process), ja (j <= 300) {correct = ypr [0]; // Pagrieziens sākas pēc nejaušas vērtības, tāpēc mēs uzņemt pēdējo vērtību pēc 300 nolasījumiem j ++;} // Pēc 300 rādījumiem cits {ypr [0] = ypr [0] - pareizi; // Iestatiet pagriezienu uz 0 grādiem - atņemiet pēdējo nejaušo pagrieziena vērtību no pašreizējās vērtības, lai iegūtu Pagriešanās 0 grādi es // Kartējiet MPU6050 sensora vērtības no -90 līdz 90 līdz vērtībām, kas piemērotas servo vadībai no 0 līdz 180 int servo0Value = map (ypr [0], -90, 90, 0, 180); int servo1Value = karte (ypr [1], -90, 90, 0, 180); int servo2Value = karte (ypr [2], -90, 90, 180, 0); // Vadīt servos atbilstoši MPU6050 orientācijai servo0.write (servo0Value); servo1.write (servo1Value); servo2.write (servo2Value); } #endif}}

Visbeidzot, izmantojot rakstīšanas funkciju, mēs nosūta šīs vērtības servos kā vadības signālus. Protams, jūs varat atspējot Yaw servo, ja vēlaties tikai X un Y ass stabilizāciju, un izmantot šo platformu kā kameras kardānu

9. darbība. Kad visi komponenti ir savienoti, tā izskats ir līdzīgs šim attēlam

Kad visas sastāvdaļas ir savienotas, tas izskatās līdzīgs šim attēlam
Kad visas sastāvdaļas ir savienotas, tas izskatās līdzīgs šim attēlam

10. solis: Tagad ievietojiet visas pamatnes pārtikas kārbas iekšpusē

Tagad ievietojiet pārtikas pamatnē visas pamatnes
Tagad ievietojiet pārtikas pamatnē visas pamatnes

11. solis: Kad visi vadi un sastāvdaļas ir ievietoti ēdiena iekšpusē, putu plātnes pamatnē var uzklāt līmes pistoli

Kad visi vadi un sastāvdaļas ir ievietoti ēdiena iekšpusē, putu plāksnes pamatnē var uzklāt līmes pistoli
Kad visi vadi un sastāvdaļas ir ievietoti ēdiena iekšpusē, putu plāksnes pamatnē var uzklāt līmes pistoli

12. solis. Secinājums

Lūdzu, ņemiet vērā, ka tas ir tālu no labas kameras kardāna. Kustības nav gludas, jo šie servo nav paredzēti šādam mērķim. Īstās kameras kardānos tiek izmantots īpašs BLDC motora veids, lai panāktu vienmērīgas kustības. Tāpēc apsveriet šo projektu tikai izglītības nolūkos.

Tas būtu viss šai apmācībai, es ceru, ka jums patika un uzzinājāt kaut ko jaunu. Jūtieties brīvi uzdot jebkuru jautājumu zemāk esošajā komentāru sadaļā un neaizmirstiet pārbaudīt manas projekta kolekcijas

Ieteicams: