Სარჩევი:

მოძრაობის კონტროლის გიმბალი: 12 ნაბიჯი
მოძრაობის კონტროლის გიმბალი: 12 ნაბიჯი

ვიდეო: მოძრაობის კონტროლის გიმბალი: 12 ნაბიჯი

ვიდეო: მოძრაობის კონტროლის გიმბალი: 12 ნაბიჯი
ვიდეო: საუკეთესო კამერა თქვენთვის? FineVu GX33 უნდა ჰქონდეს ფუნქციები, კამერის მიმოხილვა და დეტალური ტესტი 2024, ივლისი
Anonim
Image
Image

გამარჯობა ყველას, მე მქვია ჰარჯი ნაგი. მე ვარ მეორე კურსის სტუდენტი, რომელიც ვსწავლობ ელექტრონიკასა და საკომუნიკაციო ინჟინერიას Pranveer Singh Institute of Technology, Kanpur (UP) - დან.

სიტყვა "გიმბალი" განისაზღვრება, როგორც საყრდენი საყრდენი, რომელიც საშუალებას იძლევა ნებისმიერი ობიექტის ბრუნვა ერთ ღერძზე. ასე რომ, სამი ღერძიანი გიმბალი საშუალებას აძლევს გიმბალზე დამონტაჟებულ ნებისმიერ საგანს დამოუკიდებელი იყოს გიმბალზე მყოფის მოძრაობისგან. გიმბალი კარნახობს ობიექტის მოძრაობას და არა მას, ვინც მას ატარებს.

იგი შედგება 3 MG996R servo ძრავისგან 3 ღერძიანი კონტროლისთვის და საფუძველი, რომელზედაც განთავსდება MPU6050 სენსორი, არდუინო და ბატარეა. იგი გამოიყენება კამერის სტაბილიზაციისთვის ვიბრაციის გარეშე. 3 ღერძიანი გიმბალი უზრუნველყოფს კამერის მოძრაობის სტაბილიზაციას მაშინაც კი, თუ ის, ვინც მას ატარებს, მაღლა და ქვევით მიდის, მარცხნივ და მარჯვნივ, წინ და უკან. ეს არის ის, რასაც ჩვენ ვგულისხმობთ როგორც yaw, pitch და roll სტაბილიზაციას.

ნაბიჯი 1: კომპონენტების სია

კომპონენტების ჩამონათვალია:

1) არდუინო უნო

2) 8V, 1.5 Amp ბატარეა Arduino Uno– ს დასატენად

3) 7805 ძაბვის მარეგულირებელი Ic ან შეგიძლიათ გამოიყენოთ მამალი კონვეტერი

4) MPU 6050

5) 3*(MG995 SERVO Motors)

6) მხტუნავ მავთულხლართებს

სხვა აღჭურვილობა:

1) შედუღების რკინა

2) წებო იარაღი

3) საბურღი მანქანა

4) საჭმლის ქილა

ნაცვლად breadborad მე გამოვიყენე პატარა coustom perf დაფა დადებითი და უარყოფითი ავტობუსი კავშირი

ნაბიჯი 2: შეკრება

აწყობა
აწყობა
აწყობა
აწყობა

ქაფიანი ქაფი, ქაფის დაფა ან ქაღალდისებრი ქაფი არის მსუბუქი და ადვილად მოჭრილი მასალა, რომელიც გამოიყენება სერვო ძრავის დასაყენებლად და მასშტაბური მოდელების დასამზადებლად.

პირველ რიგში გავაკეთე წვრილმანი L- ფორმის ფრჩხილები, რათა დავამონტაჟო სერვო ძრავა ქაფის დაფის დახმარებით.

ნაბიჯი 3:

გამოსახულება
გამოსახულება

გიმბალის აწყობა საკმაოდ ადვილი იყო. დავიწყე Yaw servo- ს, MPU 6050 სენსორის და ON-OFF გადამრთველის დაყენებით. ჭანჭიკების და კაკლების გამოყენებით, მე დავიმაგრე იგი ბაზაზე

ნაბიჯი 4: შემდეგი, იგივე მეთოდის გამოყენებით დავიცავი როლის სერვისი. ნაწილები სპეციალურად შექმნილია MG995 Servos– ის ადვილად მოსაწყობად

შემდეგი, იგივე მეთოდის გამოყენებით, მე დავიცავი როლის სერვისი. ნაწილები სპეციალურად შექმნილია MG995 Servos– ის ადვილად მოსაწყობად
შემდეგი, იგივე მეთოდის გამოყენებით, მე დავიცავი როლის სერვისი. ნაწილები სპეციალურად შექმნილია MG995 Servos– ის ადვილად მოსაწყობად

ნაბიჯი 5: შემდეგი, იგივე მეთოდის გამოყენებით დავიცავი როლის სერვისი. ნაწილები სპეციალურად შექმნილია MG995 Servos– ის ადვილად მოსაწყობად

შემდეგი, იგივე მეთოდის გამოყენებით, მე დავიცავი როლის სერვისი. ნაწილები სპეციალურად შექმნილია MG995 Servos– ის ადვილად მოსაწყობად
შემდეგი, იგივე მეთოდის გამოყენებით, მე დავიცავი როლის სერვისი. ნაწილები სპეციალურად შექმნილია MG995 Servos– ის ადვილად მოსაწყობად

ნაბიჯი 6: კავშირები

კავშირები
კავშირები

მიკროსქემის დიაგრამაში შეგიძლიათ გამოიყენოთ ან გადამყვანი კონვერტორი ან 7805 ძაბვის მარეგულირებელი IC 8V 5 V– ზე გადასაყვანად. მიკროკონტროლი, რომელიც მოცემულია სქემის დიაგრამაში არის Arduino Nano, ასევე შეგიძლიათ გამოიყენოთ Arduino Uno, Arduino Mega.

MPU 6050 SCL და SDA ქინძისთავები დაკავშირებულია Arduino Analog pin A5 და A4- თან. (SCL და SDA pin შეიძლება განსხვავდებოდეს, ასე რომ გადახედეთ SCl და SDA ქინძის მონაცემებს სხვა მიკროკონტროლერებისთვის)

ნაბიჯი 7: კავშირი 7805 ძაბვის მარეგულირებელ IC- თან

კავშირი 7805 ძაბვის რეგულატორის IC- თან
კავშირი 7805 ძაბვის რეგულატორის IC- თან

ეს წრიული დიაგრამა არის 7805 ძაბვის მარეგულირებელი ic– ის დასაკავშირებლად, დაუკავშირეთ 8 ვ ბატარეა Vin– ზე და მიიღებთ გამომავალ ძაბვას 5 ვ.

ნაბიჯი 8: კოდირება

თქვენ უნდა შეიტანოთ შემდეგი ბიბლიოთეკები:

1) #include დააწკაპუნეთ აქ zip ფაილის გადმოსაწერად

2) #include დააწკაპუნეთ აქ zip ფაილის გადმოსატვირთად

Zip ფაილის გადმოტვირთვის შემდეგ, დაამატეთ zip ბიბლიოთეკა arduino ესკიზში

კოდისთვის

/*

DIY Gimbal - MPU6050 Arduino სამეურვეო კოდი დაფუძნებული MPU6050_DMP6 მაგალითზე i2cdevlib ბიბლიოთეკიდან ჯეფ რობერგის მიერ: https://github.com/jrowberg/i2cdevlib */// I2Cdev და MPU6050 უნდა იყოს დაინსტალირებული ბიბლიოთეკებად, ან სხვა.cpp/.h ფაილები // ორივე კლასისათვის უნდა იყოს თქვენი პროექტის ჩართვის გზა / Arduino Wire ბიბლიოთეკა საჭიროა, თუ I2Cdev I2CDEV_ARDUINO_WIRE განხორციელება // გამოიყენება I2Cdev.h #თუ I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // კლასის ნაგულისხმევი I2C მისამართი არის 0x68 // კონკრეტული I გავიდა აქ როგორც პარამეტრი // AD0 დაბალი = 0x68 (ნაგულისხმევი SparkFun გარღვევისა და InvenSense შეფასების დაფისთვის) // AD0 მაღალი = 0x69 MPU6050 mpu; // MPU6050 მპუ (0x69); // <- გამოყენება AD0 მაღალი // განსაზღვრეთ 3 servo motors Servo servo0; სერვო servo1; სერვო servo2; მცურავი სწორი; int j = 0; #განსაზღვრეთ OUTPUT_READABLE_YAWPITCHROLL #განსაზღვრეთ INTERRUPT_PIN 2 // გამოიყენეთ pin 2 Arduino Uno– ზე და დაფების უმეტესობა bool blinkState = false; // MPU კონტროლი/სტატუსი vars bool dmpReady = ყალბი; // დააყენეთ true თუ DMP init წარმატებული იყო uint8_t mpuIntStatus; // ფლობს ფაქტობრივ შეწყვეტის სტატუსს byte MPU uint8_t devStatus; // სტატუსის დაბრუნება თითოეული მოწყობილობის ოპერაციის შემდეგ (0 = წარმატება,! 0 = შეცდომა) uint16_t packetSize; // მოსალოდნელი DMP პაკეტის ზომა (ნაგულისხმევი არის 42 ბაიტი) uint16_t fifoCount; // FIFO- ში არსებული ყველა ბაიტის რაოდენობა uint8_t fifoBuffer [64]; // FIFO შენახვის ბუფერი // ორიენტაცია/მოძრაობის მანქანები Quaternion q; // [w, x, y, z] მეოთხეული კონტეინერი VectorInt16 aa; // [x, y, z] accel სენსორის გაზომვები VectorInt16 aaReal; // [x, y, z] სიმძიმის გარეშე აჩქარების სენსორის გაზომვები VectorInt16 aaWorld; // [x, y, z] მსოფლიო კადრის აკელური სენსორის გაზომვები VectorFloat gravity; // [x, y, z] სიმძიმის ვექტორი float euler [3]; // [psi, theta, phi] ეილერის კუთხის კონტეინერი float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll კონტეინერი და სიმძიმის ვექტორი // პაკეტის სტრუქტურა InvenSense ჩაიდანი დემო uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // ================================================ ================ // === ჩარევის აღმოჩენის რუტინა === // ===================== =========================================== არასტაბილური ბოული mpuInterrupt = false; // მიუთითებს თუ არა MPU შეწყვეტის პინზე მაღალი void dmpDataReady () {mpuInterrupt = true; } // =============================================== ================= // === საწყისი დაყენება === // ===================== ========================================== ბათილი დაყენება () {// შეუერთდით I2C ავტობუსს (I2Cdev ბიბლიოთეკა ამას ავტომატურად არ აკეთებს) #თუ I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400kHz I2C საათი. დააკომენტარეთ ეს სტრიქონი, თუ შედგენის სირთულეები გაქვთ #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, true); #endif // სერიული კომუნიკაციის ინიციალიზაცია // (115200 არჩეულია იმიტომ, რომ ეს საჭიროა Teapot Demo გამოსაყენებლად, მაგრამ ეს // ნამდვილად თქვენია თქვენი პროექტის მიხედვით) Serial.begin (38400); ხოლო (! სერიული); // დაელოდეთ ლეონარდოს ჩამოთვლას, სხვები დაუყოვნებლივ აგრძელებენ // მოწყობილობის ინიციალიზაციას //Serial.println(F("I2C მოწყობილობების ინიციალიზაცია … ")); mpu. ინიციალიზაცია (); pinMode (INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize (); // მიაწოდეთ თქვენი საკუთარი გიროსოფსეტები აქ, შემცირებული მინიმალური მგრძნობელობით mpu.setXGyroOffset (17); mpu.setYGyroOffset (-69); mpu.setZGyroOffset (27); mpu.setZAccelOffset (1551); // 1688 ქარხნული ნაგულისხმევი ჩემი საცდელი ჩიპისთვის // დარწმუნდით, რომ ის მუშაობდა (აბრუნებს 0 -ს) თუ (devStatus == 0) {// ჩართეთ DMP, ახლა ის მზად არის // Serial.println (F ("ჩართვა DMP… ")); mpu.setDMP ჩართულია (ჭეშმარიტი); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // დააყენეთ ჩვენი DMP Ready დროშა, რათა მთავარმა მარყუჟის () ფუნქციამ იცოდეს, რომ მისი გამოყენება ნორმალურია //Serial.println(F("DMP მზად არის! ელოდება პირველ შეწყვეტას … ")); dmpReady = ჭეშმარიტი; // მიიღეთ მოსალოდნელი DMP პაკეტის ზომა შემდგომი შედარებისთვის packetSize = mpu.dmpGetFIFOPacketSize (); } სხვა {// შეცდომა! // 1 = მეხსიერების საწყისი ჩატვირთვა ვერ მოხერხდა // 2 = DMP კონფიგურაციის განახლებები ვერ მოხერხდა // (თუ ის გატეხავს, ჩვეულებრივ კოდი იქნება 1) // Serial.print (F ("DMP ინიციალიზაცია ვერ მოხერხდა (კოდი")); //Serial.print(devStatus); //Serial.println (F (")")); } // განსაზღვრეთ ქინძისთავები, რომლებთანაც დაკავშირებულია 3 servo motors servo0.attach (10); servo1.attach (9); servo2.attach (8); } // ============================================== ================= // === მთავარი პროგრამის მარშრუტი === // ==================== =========================================== ბათილი მარყუჟი () { / / თუ პროგრამირება ვერ მოხერხდა, ნუ ეცდებით არაფრის გაკეთებას, თუ (! dmpReady) დაბრუნდება; // დაელოდეთ MPU– ს შეწყვეტას ან დამატებით პაკეტებს (სანამ)! (mpuInterrupt && fifoCount <packetSize) {if (mpuInterrupt && fifoCount

= 1024) {

// გადატვირთვა, რათა ჩვენ გავაგრძელოთ სუფთა mpu.resetFIFO (); fifoCount = mpu.getFIFOCount (); Serial.println (F ("FIFO overflow!")); // წინააღმდეგ შემთხვევაში, შეამოწმეთ DMP მონაცემების მზადაა შეწყვეტა (ეს ხშირად უნდა ხდებოდეს)} სხვაგვარად თუ (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// დაელოდეთ მონაცემების სწორ ხელმისაწვდომობას, უნდა იყოს ძალიან მოკლე ლოდინი სანამ (fifoCount 1 პაკეტი ხელმისაწვდომია) / (ეს საშუალებას მოგვცემს დაუყოვნებლივ წავიკითხოთ მეტი შეფერხების ლოდინის გარეშე).dmpGetYawPitchRoll (ypr, & q, & სიმძიმის); // Yaw, Pitch, Roll ღირებულებები - რადიანი გრადუსამდე ypr [0] = ypr [0] * 180 / M_PI; ypr [1] = ypr [1] * 180 / M_PI; ypr [2] = ypr [2] * 180 / M_PI; // გამოტოვეთ 300 კითხვა (თვითკალიბრაციის პროცესი) თუ (j <= 300) {სწორი = ypr [0]; // Yaw იწყება შემთხვევითი მნიშვნელობით, ასე რომ ჩვენ დაიკავეთ ბოლო მნიშვნელობა 300 წაკითხვის შემდეგ j ++;} // 300 წაკითხვის შემდეგ სხვა {ypr [0] = ypr [0] - სწორი; // დააყენეთ Yaw 0 გრადუსზე - გამოაკლეთ ბოლო შემთხვევითი Yaw მნიშვნელობა currrent მნიშვნელობიდან კი 0 გრადუსი es // დაადგინეთ MPU6050 სენსორის მნიშვნელობები -90 -დან 90 -მდე, სერვო კონტროლისთვის გამოსაყენებელი მნიშვნელობებისთვის 0 -დან 180 -მდე int servo0Value = რუკა (ypr [0], -90, 90, 0, 180); int servo1Value = რუკა (ypr [1], -90, 90, 0, 180); int servo2Value = რუკა (ypr [2], -90, 90, 180, 0); // სერვისების კონტროლი MPU6050 ორიენტაციის servo0.write (servo0Value) მიხედვით; servo1.write (servo1Value); servo2.write (servo2Value); } #დაასრულე თუ } }

დაბოლოს, ჩაწერის ფუნქციის გამოყენებით, ჩვენ ვუგზავნით ამ მნიშვნელობებს სერვისებს საკონტროლო სიგნალების სახით. რა თქმა უნდა, შეგიძლიათ გამორთოთ Yaw servo, თუ გსურთ მხოლოდ სტაბილიზაცია X და Y ღერძებისთვის და გამოიყენოთ ეს პლატფორმა, როგორც კამერის გიმბალი

ნაბიჯი 9: როდესაც ყველა კომპონენტი ერთმანეთთან არის დაკავშირებული, ის გამოიყურება ამ სურათის მსგავსი

როდესაც ყველა კომპონენტი ერთმანეთთან არის დაკავშირებული, ის გამოიყურება ამ სურათის მსგავსი
როდესაც ყველა კომპონენტი ერთმანეთთან არის დაკავშირებული, ის გამოიყურება ამ სურათის მსგავსი

ნაბიჯი 10: ახლა ჩადეთ ყველა ძირითადი ნივთიერება საკვების შიგნით

ახლა ჩადეთ ყველა ძირითადი ნივთიერება საკვების ქილაში
ახლა ჩადეთ ყველა ძირითადი ნივთიერება საკვების ქილაში

ნაბიჯი 11: როდესაც ყველა მავთული და კომპონენტი მოთავსებულია საკვებში, შეგიძლიათ გამოიყენოთ წებო იარაღი ქაფის დაფაზე

როდესაც ყველა მავთული და კომპონენტი მოთავსებულია საკვებში, შეგიძლიათ გამოიყენოთ წებო იარაღი ქაფის დაფაზე
როდესაც ყველა მავთული და კომპონენტი მოთავსებულია საკვებში, შეგიძლიათ გამოიყენოთ წებო იარაღი ქაფის დაფაზე

ნაბიჯი 12: დასკვნა

გთხოვთ გაითვალისწინოთ, რომ ეს შორს არის კარგი კამერის გიმბალისგან. მოძრაობები არ არის გლუვი, რადგან ეს სერვისები არ არის განკუთვნილი ასეთი მიზნით. ნამდვილი კამერის გიმბალები იყენებენ სპეციალურ ტიპის BLDC ძრავას გლუვი მოძრაობების მისაღებად. ასე რომ, განიხილეთ ეს პროექტი მხოლოდ საგანმანათლებლო მიზნებისთვის.

ეს ყველაფერი იქნებოდა ამ გაკვეთილისთვის, ვიმედოვნებ, რომ ისიამოვნეთ და ისწავლეთ რაიმე ახალი. მოგერიდებათ დასვით ნებისმიერი შეკითხვა ქვემოთ მოცემულ კომენტარებში და არ დაგავიწყდეთ პროექტის კოლექციების შემოწმება

გირჩევთ: