فهرست مطالب:

گیمبال کنترل حرکت: 12 قدم
گیمبال کنترل حرکت: 12 قدم
Anonim
Image
Image

سلام به همگی ، نام من هارجی ناگی است. من در حال حاضر دانشجوی سال دوم در حال تحصیل در رشته مهندسی الکترونیک و ارتباطات از موسسه فناوری Pranveer Singh، Kanpur (UP) هستم. من علاقه زیادی به رباتیک ، آردوینو ، هوش مصنوعی و الکترونیک آنالوگ دارم.

کلمه "گیمبال" به عنوان یک تکیه گاه محوری تعریف شده است که امکان چرخش هر شی را در یک محور واحد فراهم می کند. بنابراین گیمبال سه محوره اجازه می دهد تا هر جسمی که بر روی گیمبال نصب شده مستقل از حرکت کسی باشد که گیمبال را نگه داشته است. گیمبال حرکت جسم را تعیین می کند ، نه کسی که آن را حمل می کند.

این موتور شامل 3 موتور سروو MG996R برای کنترل 3 محوره و پایه ای است که بر روی آن سنسور MPU6050 ، آردوینو و باتری قرار می گیرد. برای ثابت نگه داشتن دوربین بدون لرزش استفاده می شود. گیمبال 3 محوره باعث می شود حرکت دوربین تثبیت شود حتی اگر کسی که آن را نگه می دارد بالا و پایین ، چپ و راست ، جلو و عقب حرکت می کند. این همان چیزی است که ما از آن به عنوان تثبیت خمیدگی ، پیچ و خم استفاده می کنیم.

مرحله 1: لیست اجزاء

لیست اجزا عبارتند از:

1) آردوینو اونو

2) باتری 8V ، 1.5 آمپر برای تغذیه Arduino Uno

3) 7805 تنظیم کننده ولتاژ Ic یا می توانید از نقاله باک استفاده کنید

4) MPU 6050

5) 3*(MG995 SERVO Motors)

6) سیم های جهنده

سایر تجهیزات:

1) آهن لحیم کاری

2) تفنگ چسب

3) دستگاه مته

4) قوطی غذا

به جای استفاده از breadborad ، من برای اتصال مثبت و منفی گذرگاه از تخته کوچک coustom perf استفاده کرده ام

مرحله 2: مونتاژ

مونتاژ کردن
مونتاژ کردن
مونتاژ کردن
مونتاژ کردن

فوم کور ، تخته فوم یا تخته فوم روی کاغذ یک ماده سبک وزن و برش آسان است که برای نصب موتور سروو و ساخت مدلهای مقیاس استفاده می شود.

ابتدا یک براکت DI-L شکل برای نصب سروو موتور با استفاده از تخته فوم ساختم.

مرحله 3:

تصویر
تصویر

مونتاژ گیمبال بسیار آسان بود. من با نصب سروو Yaw ، سنسور MPU 6050 و سوئیچ ON-OFF شروع کردم. با استفاده از پیچ و مهره آن را به پایه محکم کردم

مرحله 4: در مرحله بعد ، با استفاده از همان روش ، سرویس رول را ایمن کردم. قطعات به گونه ای طراحی شده اند که به راحتی سرویس های MG995 را نصب می کنند

بعد ، با استفاده از روش مشابه ، سرویس رول را ایمن کردم. قطعات به گونه ای طراحی شده اند که به راحتی سرویس های MG995 را نصب می کنند
بعد ، با استفاده از روش مشابه ، سرویس رول را ایمن کردم. قطعات به گونه ای طراحی شده اند که به راحتی سرویس های MG995 را نصب می کنند

مرحله 5: بعد ، با استفاده از همان روش ، سرو رول را ایمن کردم. قطعات به طور خاص طراحی شده اند تا به راحتی سرویس های MG995 را نصب کنند

بعد ، با استفاده از روش یکسان ، سرویس رول را ایمن کردم. قطعات به طور خاص طراحی شده اند تا به راحتی سرویس های MG995 را نصب کنند
بعد ، با استفاده از روش یکسان ، سرویس رول را ایمن کردم. قطعات به طور خاص طراحی شده اند تا به راحتی سرویس های MG995 را نصب کنند

مرحله 6: اتصالات

اتصالات
اتصالات

در نمودار مدار می توانید از مبدل باک یا آی سی تنظیم کننده ولتاژ 7805 برای تبدیل 8 ولت به 5 ولت استفاده کنید. میکروکنترلر که نمودار مدار داده شده است آردوینو نانو است همچنین می توانید از آردوینو اونو ، آردوینو مگا استفاده کنید.

پین های SCL و SDA MPU 6050 به پین Arduino Analog A5 و A4 متصل است. (ممکن است پین SCL و SDA متفاوت باشد ، بنابراین برگه داده پین های SCl و SDA را برای سایر میکروکنترلرها بررسی کنید)

مرحله 7: اتصال با IC تنظیم کننده ولتاژ 7805

اتصال با IC تنظیم کننده ولتاژ 7805
اتصال با IC تنظیم کننده ولتاژ 7805

این نمودار مدار برای اتصال 7805 تنظیم کننده ولتاژ ic است ، باتری 8 ولت را در Vin وصل کنید و ولتاژ خروجی 5 ولت دریافت خواهید کرد.

مرحله 8: کد نویسی

شما باید کتابخانه های زیر را شامل شوید:

1)#شامل اینجا را کلیک کنید تا فایل فشرده را بارگیری کنید

2)#شامل برای بارگیری فایل زیپ اینجا را کلیک کنید

پس از بارگیری فایل zip ، کتابخانه zip را در arduino sketch اضافه کنید

برای کد

/*

DIY Gimbal - MPU6050 Arduino Tutorial Code بر اساس نمونه MPU6050_DMP6 از کتابخانه i2cdevlib توسط Jeff Rowberg: https://github.com/jrowberg/i2cdevlib */// I2Cdev و MPU6050 باید به عنوان کتابخانه نصب شوند ، در غیر این صورت.cpp/ فایلهای.h // برای هر دو کلاس باید در مسیر شامل پروژه شما باشد #شامل "I2Cdev.h" #شامل "MPU6050_6Axis_MotionApps20.h" // #شامل "MPU6050.h" // در صورت استفاده از MotionApps شامل فایل / / در صورت استفاده از I2Cdev I2CDEV_ARDUINO_WIRE // در I2Cdev.h #اگر I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #شامل "Wire.h" #endif #include // آدرس پیش فرض I2C ممکن است 0x68 باشد / کتابخانه Arduino Wire لازم است به عنوان یک پارامتر در اینجا ارسال شد // AD0 low = 0x68 (به طور پیش فرض برای SparkFun Breakout و هیئت ارزیابی InvenSense) // AD0 high = 0x69 MPU6050 mpu ؛ // MPU6050 mpu (0x69) ؛ // <- استفاده برای AD0 high // تعریف 3 سروو موتور Servo servo0؛ سرو سرو 1؛ سرو سرو 2؛ شناور درست ؛ int j = 0 ؛ #تعریف OUTPUT_READABLE_YAWPITCHROLL #تعریف INTERRUPT_PIN 2 // از پین 2 در Arduino Uno استفاده کنید و بیشتر تابلوها bool blinkState = false؛ // MPU control/status vars bool dmpReady = false؛ // اگر DMP init موفق بود uint8_t mpuIntStatus موفقیت آمیز بود ؛ // دارای بایت وضعیت وقفه واقعی از MPU uint8_t devStatus است. // بازگشت وضعیت پس از هر عملیات دستگاه (0 = موفقیت ، 0 = خطا) uint16_t packetSize؛ // اندازه بسته DMP مورد انتظار (پیش فرض 42 بایت است) uint16_t fifoCount؛ // تعداد کل بایت های موجود در FIFO uint8_t fifoBuffer [64] ؛ // بافر ذخیره FIFO // جهت گیری/حرکت vars Quaternion q؛ // [w، x، y، z] quaternion container VectorInt16 aa؛ // [x، y، z] اندازه گیری حسگر accel VectorInt16 aaReal؛ // [x، y، z] اندازه گیری سنسور accel بدون گرانش VectorInt16 aaWorld؛ // [x، y، z] اندازه گیری سنسور acel در قاب جهان VectorFloat gravity؛ // [x، y، z] بردار گرانش شناور اویلر [3]؛ // [psi، theta، phi] Euler angle angle 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؛ } // ============================================ ================ // === تنظیم اولیه === // =================== ========================================= تنظیم void () {// به اتوبوس 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 انتخاب شده است زیرا برای خروجی نسخه نمایشی قوری مورد نیاز است ، اما بسته به پروژه شما // واقعاً به شما بستگی دارد) Serial.begin (38400) ؛ در حالی که (! سریال) ؛ // منتظر شمارش لئوناردو باشید ، دیگران بلافاصله ادامه می دهند // مقداردهی اولیه دستگاه //Serial.println(F(" اولیه سازی دستگاه های I2C … ")) ؛ mpu.initialize ()؛ 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 = true؛ // اندازه بسته مورد انتظار DMP را برای مقایسه packetSize = mpu.dmpGetFIFOPacketSize () دریافت کنید؛ } else {// ERROR! // 1 = بارگذاری اولیه حافظه انجام نشد // 2 = به روز رسانی پیکربندی DMP ناموفق بود // (در صورت خرابی ، معمولاً کد 1 خواهد بود) // Serial.print (F ("DMP Initialization failed (code"))) ؛ //Serial.print(devStatus) ؛ //Serial.println (F (")")) ؛ } // پین هایی که 3 سرو موتور به آنها متصل شده است را تعریف کنید 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!")) ؛ // در غیر این صورت ، برای قطع اطلاعات آماده 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) {correct = ypr [0] ؛ // Yaw با مقدار تصادفی شروع می شود ، بنابراین ما گرفتن آخرین مقدار پس از 300 قرائت j ++؛} // بعد از 300 قرائت دیگر {ypr [0] = ypr [0] - صحیح ؛ // Yaw را روی 0 درجه تنظیم کنید - آخرین مقدار تصادفی Yaw را از مقدار هم زمان کم کنید تا Yaw 0 درجه es // مقادیر حسگر MPU6050 را از -90 تا 90 به مقادیر مناسب برای کنترل سروو از 0 تا 180 int servo0Value = map (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) ؛ } #endif}}

در نهایت با استفاده از تابع نوشتن ، این مقادیر را به عنوان سیگنال های کنترلی به سرویس ها ارسال می کنیم. البته ، اگر می خواهید فقط تثبیت کننده محور X و Y باشد ، می توانید سرو Yaw را غیرفعال کنید و از این پلتفرم به عنوان گیمبال دوربین استفاده کنید

مرحله 9: وقتی همه اجزا به هم متصل می شوند ، ظاهر آن شبیه به این تصویر است

وقتی همه اجزا متصل می شوند ، ظاهر آن شبیه به این تصویر است
وقتی همه اجزا متصل می شوند ، ظاهر آن شبیه به این تصویر است

مرحله 10: اکنون تمام مواد اولیه را داخل قوطی غذا قرار دهید

حالا تمام مواد اولیه را داخل قوطی غذا قرار دهید
حالا تمام مواد اولیه را داخل قوطی غذا قرار دهید

مرحله 11: وقتی همه سیمها و اجزاء داخل یک غذا قرار می گیرد ، می توانید تفنگ چسب را روی تخته فوم قرار دهید

هنگامی که همه سیمها و اجزاء داخل یک غذا قرار می گیرد ، می توانید تفنگ چسب را در پایه فوم بکار ببرید
هنگامی که همه سیمها و اجزاء داخل یک غذا قرار می گیرد ، می توانید تفنگ چسب را در پایه فوم بکار ببرید

مرحله 12: نتیجه گیری

لطفاً این را به دور از گیمبال خوب دوربین توجه کنید. حرکات هموار نیستند زیرا این سروها برای چنین هدفی طراحی نشده اند. گیمبال های دوربین واقعی از نوع خاصی از موتور BLDC برای حرکات صاف استفاده می کنند. بنابراین ، این پروژه را فقط برای اهداف آموزشی در نظر بگیرید.

این همه برای این آموزش است ، امیدوارم از آن لذت برده باشید و چیزهای جدیدی یاد گرفته باشید. با خیال راحت هر س questionالی را در قسمت نظرات زیر بپرسید و چک کردن مجموعه های پروژه را فراموش نکنید

توصیه شده: