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

متعة الجيروسكوب مع حلقة Neopixel: 4 خطوات (بالصور)
متعة الجيروسكوب مع حلقة Neopixel: 4 خطوات (بالصور)

فيديو: متعة الجيروسكوب مع حلقة Neopixel: 4 خطوات (بالصور)

فيديو: متعة الجيروسكوب مع حلقة Neopixel: 4 خطوات (بالصور)
فيديو: احتراف الجيروسكوب في يوم واحد فقط!!🤯 شرح الجيروسكوب في ببجي موبايل ✨ PUBG MOBILE 2024, شهر نوفمبر
Anonim
Image
Image

في هذا البرنامج التعليمي ، سنستخدم جيروسكوب MPU6050 وحلقة نيوبكسل واردوينو لبناء جهاز يضيء يقابل زاوية الميل.

هذا مشروع بسيط وممتع وسيتم تجميعه على لوح التجارب. إذا اتبعت الخطوات ، فستقوم ببناء ما شاهدته في الفيديو. إنه برنامج تعليمي جيد للتعرف على الجيروسكوب وحلقة neopixel.

أقوم ببناء هذا البرنامج التعليمي بسبب الاهتمام الذي رأيته في أول تعليمات لي هنا (Gyroscope Led Control With Arduino). في هذا الدليل ، قمت باستبدال مصابيح LED البسيطة بحلقة neopixel. الحلبة أسهل في الاستخدام من خلال مكتبة Adafruit وهي بالتأكيد أكثر إثارة.

لذا ، إذا كانت لديك هذه المكونات الموجودة حولها ، فهذه طريقة رائعة للاستفادة منها ، سأحاول أن آخذك خطوة بخطوة خلال بناء الجهاز وأيضًا شرح كيفية عمله في الخطوة الأخيرة.

الخطوة 1: الأشياء المطلوبة

المجسم
المجسم

القطع

1. Arduino pro mini 328p (eBay) 2 دولار

2. اللوح

3. جيروسكوب MPU6050 (eBay) 1.2 دولار

4. 24 حلقة نيوبيكسل ليد (Adafruit) 17 دولار

5. 4 × حزمة بطارية AA مع 4 بطاريات

6. كبلات توصيل على شكل حرف U (اختياري). لقد استخدمت كبلات التوصيل هذه لأنها تبدو أفضل على اللوح ، وتكون المصابيح أكثر وضوحًا بهذه الطريقة. يمكنك العثور على صندوق من 140 على موقع ئي باي بسعر 4 دولارات تقريبًا. إذا لم يكن لديك هذه الكابلات يمكنك استبدالها بأسلاك دوبونت.

أدوات:

1. محول USB إلى FTDI التسلسلي FT232RL لبرمجة Arduino pro mini

2. اردوينو IDE

المهارات: 1. لحام ، تحقق من هذا البرنامج التعليمي

3. برمجة اردوينو الأساسية ، قد يكون هذا البرنامج التعليمي مفيدًا

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

المجسم
المجسم

لقد قمت بإرفاق مخطط fritzing بتنسيق fzz وصورة له لسهولة تصور الاتصالات

1. تحتاج إلى لحام 3 دبابيس ذكر على الجزء الخلفي من حلقة neopixel كما هو موضح في الصورة

- لحام الدبوس الموجب

- جندى الأرض

- لحام دبوس إدخال البيانات

2. ثم يجب أن يكون لحامل البطارية 4x طريقة للاتصال باللوحة ، والحل السهل هو لحام سلكين من الذكور على الوجهين بأطرافه.

3. تحضير اللوح.

- ضع حلقة neopixel والميكروكونترولر والجيروسكوب على لوح التجارب كما في الصورة

- ضع كل الأسلاك السلبية: على المتحكم الدقيق ، حلقة نيوبكسل ، الدوران

- ضع كل الأسلاك الموجبة: على المتحكم الدقيق ، حلقة نيوبكسل ، الدوران

- ضع كل أسلاك البيانات:

* SDA و SCL من الميكروكونترولر إلى الجيروسكوب

* دبوس D6 من متحكم إلى حلقة نيوبكسل

- تحقق مرتين من جميع التوصيلات قبل التشغيل

- اختياريًا باستخدام شريط لاصق ، قم بتثبيت حزمة البطارية على الجزء الخلفي من لوح المشعاع لتثبيتها في مكانها وجعلها أكثر قابلية للحمل

الخطوة الثالثة: الكود والمعايرة

تحتاج أولاً إلى تنزيل وتثبيت مكتبتين:

1. مكتبة Adafruit neopixel للتحكم في neopixel

2. مكتبة MPU6050 للجيروسكوب

3. مصدر مكتبة I2CDev

إنهما مكتبتان كبيرتان ستقومان برفع الأحمال الثقيلة!

مزيد من التفاصيل حول neopixels هنا

ثم قم بتنزيل وتثبيت مكتبتي من هنا أو انسخها من الأسفل:

# تضمين "I2Cdev.h"

#include #include "MPU6050_6Axis_MotionApps20.h" #include "Wire.h" #define NEOPIXED_CONTROL_PIN 6 #define NUM_LEDS 24 const int MAX_ANGLE = 45 ؛ const int LED_OFFSET = 12 ؛ MPU6050 وحدة معالجة مركزية ؛ شريط Adafruit_NeoPixel = Adafruit_NeoPixel (NUM_LEDS ، NEOPIXED_CONTROL_PIN ، NEO_RBG + NEO_KHZ800) ؛ lastPrintTime طويل بدون توقيع = 0 ؛ تهيئة منطقية = خطأ ؛ // تعيين صحيح إذا كان 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 المخزن المؤقت Quaternion q ؛ // [w، x، y، z] حاوية رباعية الجاذبية VectorFloat؛ // [x، y، z] عوامة ناقلات الجاذبية ypr [3]؛ // [الانعراج ، الملعب ، التدحرج] حاوية الانعراج / الملعب / لفة وناقل الجاذبية المنطقي المتطاير mpuInterrupt = false ؛ // يشير إلى ما إذا كان دبوس مقاطعة MPU قد ارتفع

الإعداد باطل()

{Serial.begin (9600) ، Serial.println ("بدأ البرنامج") ؛ التهيئة = initializeGyroscope () ، strip.begin () ، } void loop () {if (! initialization) {return؛ } mpuInterrupt = false ؛ mpuIntStatus = mpu.getIntStatus () ، fifoCount = mpu.getFIFOCount () ، if (hasFifoOverflown (mpuIntStatus، fifoCount)) {mpu.resetFIFO () ؛ إرجاع؛ } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount ()؛ } mpu.getFIFOBytes (fifoBuffer، packetSize) ؛ fifoCount - = packetSize ؛ mpu.dmpGetQuaternion (& q ، fifoBuffer) ؛ mpu.dmpGetGravity (& الجاذبية ، & q) ؛ mpu.dmpGetYawPitchRoll (ypr، & q، & gravity) ؛ إعادة الرسم (ypr [0] * 180 / M_PI، ypr [1] * 180 / M_PI، ypr [2] * 180 / M_PI) ؛ }} قيمة hasFifoOverflown المنطقية (int mpuIntStatus، int fifoCount) {return mpuIntStatus & 0x10 || fifoCount == 1024 ؛ } إعادة رسم باطلة (int x، int y، int z) {x = constrain (x، -1 * MAX_ANGLE، MAX_ANGLE) ؛ y = قيد (ص ، -1 * MAX_ANGLE ، MAX_ANGLE) ؛ إذا (ص 0) {lightLeds (ص ، ض ، 0 ، 5 ، 0 ، 89) ؛ } else if (y <0 و z 0 و z 0 و z> 0) {lightLeds (y، z، 20، 24، 89، 0)؛ }} مصابيح ضوئية فارغة (int x، int y، int fromLedPosition، int toLedPosition، int fromAngle، int toAngle) {double angle = (atan ((double) abs (x) / (double) abs (y)) * 4068) / 71 ؛ int ledNr = خريطة (زاوية فروم زاوية ، إلى زاوية ، فروم ليدوبوشن ، toLedPosition) ؛ printDebug (x ، y ، ledNr ، زاوية) ؛ لون uint32_t ؛ لـ (int i = 0 ؛ i position + LED_OFFSET) {return position + LED_OFFSET ؛ } موضع الإرجاع + LED_OFFSET - NUM_LEDS ؛ } void printDebug (int y، int z، int lightLed، int angle) {if (millis () - lastPrintTime <500) {return؛ } Serial.print ("a =") ؛ Serial.print (زاوية) ؛ Serial.print ("؛") ؛ Serial.print ("ll =") ؛ Serial.print (lightLed) ؛ Serial.print ("؛") ؛ Serial.print ("y =") ؛ Serial.print (y) ؛ Serial.print ("؛") ؛ Serial.print ("z =") ؛ Serial.print (z) ؛ Serial.println ("؛") ؛ lastPrintTime = مللي () ، } bool initializeGyroscope () {Wire.begin ()؛ TWBR = 24 ؛ mpu.initialize () ، Serial.println (mpu.testConnection ()؟ F ("اتصال MPU6050 ناجح"): F ("فشل اتصال MPU6050")) ؛ Serial.println (F ("تهيئة DMP …")) ؛ devStatus = mpu.dmpInitialize () ، mpu.setXGyroOffset (220) ؛ mpu.setYGyroOffset (76) ، mpu.setZGyroOffset (-85) ، mpu.setZAccelOffset (1788) ؛ إذا (devStatus! = 0) {Serial.print (F ("فشل تهيئة DMP (رمز")) ؛ Serial.println (devStatus) ؛ إرجاع خطأ ؛} mpu.setDMPEnabled (صحيح) ؛ Serial.println (F ("تمكين كشف المقاطعة (Arduino External interrupt 0) … ")) ؛ attachInterrupt (0، dmpDataReady، RISING)؛ mpuIntStatus = mpu.getIntStatus ()؛ Serial.println (F (" DMP جاهز! في انتظار أول مقاطعة… ")) ؛ حجم الحزمة = mpu.dmpGetFIFOPacketSize ()؛ return true؛} void dmpDataReady () {mpuInterrupt = true؛}

قم بتحميل الكود:

باستخدام محول FTDI ، قم بتحميل الكود إلى Arduino.

قم بتوصيل مصدر الطاقة (البطاريات)

معايرة:

أهم شيء للمعايرة هنا هو ثابت "LED_OFFSET". في المثال الخاص بي هو 12. أنت بحاجة إلى ضبط هذا من 0 إلى 23 بحيث يضيء المصباح في اتجاه إمالة اللوحة بعد تشغيل اللوحة.

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

الخطوة 4: كيف يعمل (اختياري)

كيف يعمل (اختياري)
كيف يعمل (اختياري)

أولاً ، القليل من المعلومات حول جيروسكوب MPU6050. هذا هو جيروسكوب MEMS (يرمز MEMS للأنظمة الكهروميكانيكية الدقيقة).

يحتوي كل نوع من جيروسكوب MEMs على شكل من أشكال المكونات المتذبذبة من حيث يمكن اكتشاف التراكم ، وبالتالي تغيير الاتجاه. هذا لأنه ، وفقًا لقانون الحركة ، يحب الجسم المهتز الاستمرار في الاهتزاز في نفس المستوى ، ويمكن استخدام أي انحراف اهتزازي لاشتقاق تغيير في الاتجاه.

يحتوي الجيروسكوب أيضًا على متحكم خاص به لحساب التدحرج والنغمة والانعراج من خلال بعض الرياضيات الرائعة.

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

Neopixel عبارة عن مصابيح LED RGB يمكن معالجتها بشكل فردي ومقيدة بالسلاسل إلى نطاقات وحلقات. إنها تعمل بجهد 5 فولت وتحتوي على دوائر خاصة بها ، لذا فأنت تحتاج فقط إلى تشغيل النيوبكسل والتواصل معهم باستخدام خط البيانات. يتم الاتصال بخط بيانات واحد يحتوي على الساعة والبيانات (مزيد من التفاصيل هنا). يوفر Adafruit مكتبة نظيفة للتفاعل مع حلقات neopixel.

الرمز

داخل وظيفة l oop () ، يتم استدعاء مكتبة MPU6050_6Axis_MotionApps20. عندما تحتوي المكتبة على بيانات جديدة من الجيروسكبي ، فإنها تستدعي إعادة الرسم (x ، y ، z) مع 3 وسيطات تمثل الانحراف والخطوة واللف.

إعادة رسم الداخل ():

- نحن نركز على محورين: y ، z

- نحن نقيد كلا المحورين من -MAX_ANGLE إلى + MAX_ANGLE ، وحددنا الحد الأقصى للزاوية بـ 45 وهو قابل للتغيير

- نقوم بتقسيم 360 درجة إلى 4 أرباع واستدعاء وظائف lightLeds () لكل منها على النحو التالي:

* y سالب ، z موجب أول رباعي سيتحكم في مؤشرات LED من 0 إلى 5 ، وستكون الزاوية من 0 إلى 89

* y سالب ، z سالب ضوابط الربع الثاني من 6 إلى 12 ، الزاوية ستكون من 89 إلى 0

* …إلخ

- داخل وظيفة lightLeds

* أقوم بحساب زاوية بناءً على محورين باستخدام قوس ظل (راجع الصورة المرفقة)

* أقوم بحساب ما أدى إلى إظهاره باستخدام وظيفة خريطة اردوينو

* أقوم بإعادة ضبط شريط LED جميعًا باستثناء مصباحين ، أحدهما مطابق لموضع led الذي حسبته من قبل وموضع led من قبل (لإظهار تأثير التلاشي)

* أستخدم وظيفة تسمى normalizeLedPosition () لمعايرة neopixel. المعايرة مفيدة لأنه يمكن تدوير حلقة نيوبكسل بالشكل الذي تريده ، ويجب محاذاتها مع الجيروسكوب

* أقوم أيضًا بطباعة محور السحب ، ما أدى إلى ضوء وزاوية

الرياضيات

لقد أرفقت صورة مع حلقة الصمام والوظيفة المثلثية المستخدمة لتحديد الزاوية.

موصى به: