جدول المحتويات:

انحراف التحكم في الحركة: 12 خطوة
انحراف التحكم في الحركة: 12 خطوة

فيديو: انحراف التحكم في الحركة: 12 خطوة

فيديو: انحراف التحكم في الحركة: 12 خطوة
فيديو: تمارين لتصحيح ( العرج وقت المشي ) 2024, يوليو
Anonim
Image
Image

مرحبًا بالجميع ، اسمي Harji Nagi ، أنا حاليًا طالب في السنة الثانية يدرس هندسة الإلكترونيات والاتصالات من معهد Pranveer Singh للتكنولوجيا ، كانبور (UP) ، لدي اهتمام كبير بالروبوتات ، و arduino ، والذكاء الاصطناعي ، والإلكترونيات التناظرية.

يتم تعريف كلمة "gimbal" على أنها دعم محوري يسمح بتدوير أي كائن في محور واحد. لذا فإن المحور ثلاثي المحاور يسمح لأي جسم مثبت على المحور أن يكون مستقلاً عن حركة الشخص الذي يحمل المحور. يملي المحور حركة الكائن ، وليس الشخص الذي يحمله.

يتكون من 3 محركات مؤازرة MG996R للتحكم ثلاثي المحاور ، وقاعدة يوضع عليها مستشعر MPU6050 و Arduino والبطارية ، وهي تستخدم للحفاظ على ثبات الكاميرا بدون اهتزاز. يضمن gimbal ثلاثي المحاور استقرار حركة الكاميرا حتى لو كان الشخص الذي يحملها يتحرك لأعلى ولأسفل ، ولليسار ولليمين ، وللأمام وللخلف. هذا ما نشير إليه باستقرار الانحراف ، والانحراف ، واللف.

الخطوة 1: قائمة المكونات

قائمة المكونات هي:

1) اردوينو أونو

2) بطارية 8 فولت ، 1.5 أمبير لتشغيل Arduino Uno

3) 7805 منظم الجهد Ic أو يمكنك استخدام محول باك

4) MPU 6050

5) 3 * (MG995 سيرفو موتورز)

6) أسلاك توصيل

معدات أخرى:

1) لحام الحديد

2) مسدس الغراء

3) آلة الحفر

4) علبة الغذاء

بدلاً من استخدام breadborad ، قمت باستخدام لوحة صغيرة coustom perf board لاتصال الحافلات الإيجابية والسلبية

الخطوة 2: التجميع

تجميع
تجميع
تجميع
تجميع

Foamcore أو لوح الرغوة أو لوح الرغوة ذو الوجه الورقي عبارة عن مادة خفيفة الوزن وسهلة القطع تستخدم لتركيب محرك سيرفو ولصنع نماذج مصغر.

أولاً ، صنعت أقواسًا على شكل حرف L DIY لتركيب محرك مؤازر بمساعدة لوح الرغوة.

الخطوه 3:

صورة
صورة

كان تجميع gimbal سهلاً للغاية. لقد بدأت بتثبيت أجهزة Yaw ومستشعر MPU 6050 ومفتاح التشغيل والإيقاف. باستخدام البراغي والصواميل ، قمت بتثبيتها على القاعدة

الخطوة 4: بعد ذلك ، باستخدام نفس الطريقة التي قمت بتأمين Roll Servo. تم تصميم الأجزاء خصيصًا لتناسب الماكينات MG995 بسهولة

بعد ذلك ، باستخدام نفس الطريقة قمت بتأمين Roll Servo. تم تصميم الأجزاء خصيصًا لتناسب الماكينات MG995 بسهولة
بعد ذلك ، باستخدام نفس الطريقة قمت بتأمين Roll Servo. تم تصميم الأجزاء خصيصًا لتناسب الماكينات MG995 بسهولة

الخطوة 5: بعد ذلك ، باستخدام نفس الطريقة التي قمت بتأمين Roll Servo. تم تصميم الأجزاء خصيصًا لتناسب الماكينات MG995 بسهولة

بعد ذلك ، باستخدام نفس الطريقة قمت بتأمين Roll Servo. تم تصميم الأجزاء خصيصًا لتناسب الماكينات MG995 بسهولة
بعد ذلك ، باستخدام نفس الطريقة قمت بتأمين Roll Servo. تم تصميم الأجزاء خصيصًا لتناسب الماكينات MG995 بسهولة

الخطوة 6: التوصيلات

روابط
روابط

في الرسم البياني للدائرة ، يمكنك استخدام محول باك أو منظم الجهد 7805 IC لتحويل 8 فولت إلى 5 فولت. المتحكم الدقيق الذي يُعطى لمخطط الدائرة هو Arduino Nano ، يمكنك أيضًا استخدام Arduino Uno ، Arduino Mega.

يتم توصيل دبابيس SCL و SDA الخاصة بـ MPU 6050 بـ Arduino Analog pin A5 و A4 (قد يختلف دبوس SCL و SDA لذا تحقق من ورقة البيانات الخاصة بدبابيس SCl و SDA لوحدة التحكم الدقيقة الأخرى)

الخطوة 7: التوصيل بـ 7805 Voltage Regulator IC

الاتصال مع 7805 منظم الجهد IC
الاتصال مع 7805 منظم الجهد IC

مخطط الدائرة هذا مخصص لتوصيل منظم الجهد 7805 ic ، قم بتوصيل بطارية 8 فولت في Vin وستحصل على جهد خرج يبلغ 5 فولت.

الخطوة 8: البرمجة

يجب عليك تضمين المكتبات التالية:

1) # تضمين انقر هنا لتنزيل ملف مضغوط

2) # تضمين انقر هنا لتنزيل ملف مضغوط

بعد تنزيل الملف المضغوط ، أضف مكتبة مضغوطة في رسم اردوينو

للكود

/*

DIY Gimbal - MPU6050 Arduino Tutorial Code استنادًا إلى مثال MPU6050_DMP6 من مكتبة i2cdevlib بواسطة Jeff Rowberg: https://github.com/jrowberg/i2cdevlib * / // يجب تثبيت I2Cdev و MPU6050 كمكتبات أو.cpp / يجب أن تكون ملفات.h // لكلا الفئتين في مسار التضمين لمشروعك #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // # include "MPU6050.h" // ليس ضروريًا في حالة استخدام MotionApps ، قم بتضمين ملف / / مكتبة Arduino Wire مطلوبة إذا تم استخدام تطبيق I2Cdev I2CDEV_ARDUINO_WIRE // في I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // قد يكون عنوان فئة I2C الافتراضي محددًا تم تمريره كمعامل هنا // AD0 low = 0x68 (افتراضي لكسر SparkFun ولوحة تقييم InvenSense) // AD0 high = 0x69 MPU6050 mpu؛ // MPU6050 وحدة معالجة مركزية (0x69) ؛ // <- استخدم لـ AD0 high // تحديد 3 محركات مؤازرة Servo0 ؛ أجهزة مؤازرة 1 ؛ أجهزة مؤازرة 2 ؛ تعويم صحيح int j = 0 ؛ #define OUTPUT_READABLE_YAWPITCHROLL #define INTERRUPT_PIN 2 // استخدم pin 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] حاوية رباعية VectorInt16 aa؛ // [x، y، z] قياسات مستشعر التسريع VectorInt16 aaReal؛ // [x، y، z] قياسات مستشعر التسارع الخالي من الجاذبية VectorInt16 aaWorld؛ // [x ، y ، z] قياسات مستشعر تسارع الإطار العالمي ، VectorFloat gravity ؛ // [x، y، z] عوامة ناقل الجاذبية أويلر [3]؛ // [psi، theta، phi] حاوية زاوية أويلر تعويم ypr [3]؛ // [yaw، Pitch، roll] yaw / Pitch / roll container and gravity vector // packet structure for InvenSense teapot demo uint8_t teapotPacket [14] = {'$'، 0x02، 0، 0، 0، 0، 0، 0 ، 0، 0، 0x00، 0x00، '\ r'، '\ n'}؛ // ================================================== ================ // === روتين اكتشاف المقاطعة === // ====================== ============================================ منطقية متغيرة mpuInterrupt = false؛ // يشير إلى ما إذا كان طرف MPU المقاطعة قد أصبح فارغًا dmpDataReady () {mpuInterrupt = true؛ } // ================================================ ================= // === الإعداد الأولي === // ===================== ============================================ إعداد باطل () {// انضم إلى ناقل I2C (مكتبة I2Cdev لا تفعل ذلك تلقائيًا) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin () ؛ Wire.setClock (400000) ؛ // ساعة 400 كيلو هرتز I2C. علق على هذا السطر إذا واجهت صعوبات في الترجمة #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400، true)؛ #endif // تهيئة الاتصال التسلسلي // (تم اختيار 115200 لأنه مطلوب لإخراج Teapot Demo ، لكن الأمر متروك لك حقًا اعتمادًا على مشروعك) Serial.begin (38400) ؛ بينما (! المسلسل) ؛ // انتظر تعداد ليوناردو ، يستمر الآخرون على الفور // تهيئة الجهاز //Serial.println(F("Initializing I2C devices… ")) ؛ mpu.initialize () ، pinMode (INTERRUPT_PIN ، INPUT) ؛ devStatus = mpu.dmpInitialize () ، // قم بتوفير تعويضات الدوران الخاصة بك هنا ، مع تحجيمها من أجل الحد الأدنى من الحساسية mpu.setXGyroOffset (17) ؛ mpu.setYGyroOffset (-69) ، mpu.setZGyroOffset (27) ، mpu.setZAccelOffset (1551) ؛ // 1688 factory default لشريحة الاختبار الخاصة بي // تأكد من أنها تعمل (تُرجع 0 إذا كان الأمر كذلك) إذا (devStatus == 0) {// شغّل DMP ، الآن بعد أن أصبح جاهزًا // Serial.println (F ("التمكين DMP … ")) ؛ mpu.setDMPEnabled (صحيح) ، attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN) ، dmpDataReady ، RISING) ؛ mpuIntStatus = mpu.getIntStatus () ، // قم بتعيين علامة DMP Ready الخاصة بنا حتى تعرف وظيفة الحلقة الرئيسية () أنه لا بأس من استخدامها //Serial.println(F("DMP جاهز! انتظار المقاطعة الأولى … ")) ؛ dmpReady = صحيح ؛ // احصل على حجم حزمة DMP المتوقع لحزمة المقارنة اللاحقة = mpu.dmpGetFIFOPacketSize () ؛ } آخر {// ERROR! // 1 = فشل تحميل الذاكرة الأولية // 2 = فشلت تحديثات تكوين DMP // (إذا كان سيتم كسرها ، فعادة ما يكون الرمز 1) // Serial.print (F ("فشل تهيئة DMP (الرمز")) ؛ //Serial.print(devStatus) ؛ //Serial.println (F (")")) ؛ } // حدد المسامير التي تتصل بها محركات المؤازرة الثلاثة 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 متوفرة / / (يتيح لنا ذلك قراءة المزيد على الفور دون انتظار المقاطعة) fifoCount - = packetSize ؛ // احصل على قيم Yaw و Pitch and Roll #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion (& q، fifoBuffer)؛ mpu.dmpGetGravity (& gravity، & q)؛.dmpGetYawPitchRoll (ypr، & q، & gravity)؛ // 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) {true = ypr [0]؛ // Yaw يبدأ بقيمة عشوائية ، لذلك نحن التقاط آخر قيمة بعد 300 قراءة j ++ ؛} // بعد 300 قراءة وإلا {ypr [0] = ypr [0] - right؛ // اضبط Yaw على 0 deg - اطرح آخر قيمة عشوائية من Yaw من القيمة الحالية لجعل ياو 0 درجة es // عيّن قيم مستشعر MPU6050 من -90 إلى 90 إلى القيم المناسبة للتحكم المؤازر من 0 إلى 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) ؛ // التحكم في الماكينات وفقًا لـ servo0.write MPU6050 (servo0Value) ؛ servo1.write (servo1Value) ؛ servo2.write (servo2Value) ؛ } #إنهاء إذا } }

أخيرًا باستخدام وظيفة الكتابة ، نرسل هذه القيم إلى الماكينات كإشارات تحكم. بالطبع ، يمكنك تعطيل مؤازرة Yaw إذا كنت تريد فقط الاستقرار للمحور X و Y ، واستخدام هذه المنصة ككاميرا gimbal

الخطوة 9: عندما تكون جميع المكونات متصلة ، تبدو مشابهة لهذه الصورة

عندما تكون جميع المكونات متصلة ، يبدو شكلها مشابهًا لهذه الصورة
عندما تكون جميع المكونات متصلة ، يبدو شكلها مشابهًا لهذه الصورة

الخطوة 10: الآن أدخل جميع المواد الأساسية داخل علبة الطعام

أدخل الآن جميع المواد الأساسية داخل علبة الطعام
أدخل الآن جميع المواد الأساسية داخل علبة الطعام

الخطوة 11: عندما يتم وضع جميع الأسلاك والمكونات داخل الطعام ، يمكن بعد ذلك تطبيق مسدس الغراء في قاعدة لوح الرغوة

عندما يتم وضع جميع الأسلاك والمكونات داخل الطعام ، يمكن بعد ذلك تطبيق مسدس الغراء في قاعدة لوح الرغوة
عندما يتم وضع جميع الأسلاك والمكونات داخل الطعام ، يمكن بعد ذلك تطبيق مسدس الغراء في قاعدة لوح الرغوة

الخطوة 12: الخاتمة

يرجى ملاحظة أن هذا بعيد كل البعد عن gimbal الكاميرا الجيدة. الحركات ليست سلسة لأن هذه الماكينات ليست مخصصة لهذا الغرض. تستخدم محولات الكاميرا الحقيقية نوعًا خاصًا من محرك BLDC للحصول على حركات سلسة. لذلك ، اعتبر هذا المشروع للأغراض التعليمية فقط.

سيكون هذا كل شيء في هذا البرنامج التعليمي ، أتمنى أن تكون قد استمتعت به وتعلمت شيئًا جديدًا. لا تتردد في طرح أي سؤال في قسم التعليقات أدناه ولا تنس التحقق من مجموعاتي من المشروع

موصى به: