جدول المحتويات:
- الخطوة 1: الأشياء المطلوبة
- الخطوة 2: التجميع
- الخطوة الثالثة: الكود والمعايرة
- الخطوة 4: كيف يعمل (اختياري)
فيديو: متعة الجيروسكوب مع حلقة Neopixel: 4 خطوات (بالصور)
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:38
في هذا البرنامج التعليمي ، سنستخدم جيروسكوب 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. المعايرة مفيدة لأنه يمكن تدوير حلقة نيوبكسل بالشكل الذي تريده ، ويجب محاذاتها مع الجيروسكوب
* أقوم أيضًا بطباعة محور السحب ، ما أدى إلى ضوء وزاوية
الرياضيات
لقد أرفقت صورة مع حلقة الصمام والوظيفة المثلثية المستخدمة لتحديد الزاوية.
موصى به:
التواصل بين مستشعر الجيروسكوب ثلاثي المحاور BMG160 مع Arduino Nano: 5 خطوات
واجهة مستشعر جيروسكوب ثلاثي المحاور BMG160 مع Arduino Nano: في عالم اليوم ، أكثر من نصف الشباب والأطفال مغرمون بالألعاب وكل من يعشقها ، مفتونًا بالجوانب التقنية للألعاب يعرف أهمية استشعار الحركة في هذا المجال. لقد اندهشنا أيضًا من نفس الشيء
متعة العمل: إعداد جهاز تحكم Xbox لمخترع Autodesk: 6 خطوات
جعل العمل ممتعًا: إعداد جهاز تحكم Xbox لمخترع Autodesk: حسنًا. بادئ ذي بدء ، لدي أفضل الرؤساء على الأرض للسماح لي بإحضار وحدة تحكم XBOX للعمل. أعطاني قسم تكنولوجيا المعلومات والمدير الهندسي الموافقة طالما أنني استخدمتها في العمل. إذن إليك كيفية إعداد وحدة تحكم في الألعاب للعمل مع Autodesk
التحكم في حلقة LED من Neopixel باستخدام مستشعر الإيماءات: 3 خطوات (بالصور)
التحكم في حلقة Neopixel Led باستخدام مستشعر الإيماءات: في هذا البرنامج التعليمي سنلعب باستخدام مستشعر الإيماءات (APDS-9960) وحلقة neopixel لمعرفة كيفية دمجهما معًا باستخدام Arduino UNO. إيماءات اليسار - اليمين من خلال تحريك حركة يقودها اليمين أو اليسار ، وإلى u
Arduino Nano و Visuino: تحويل التسارع إلى زاوية من مقياس التسارع ومستشعر الجيروسكوب MPU6050 I2C: 8 خطوات (بالصور)
Arduino Nano و Visuino: تحويل التسارع إلى زاوية من مقياس التسارع ومستشعر الجيروسكوب MPU6050 I2C: منذ فترة ، قمت بنشر برنامج تعليمي حول كيفية توصيل MPU9250 Accelerometer و Gyroscope و Compass Sensor إلى Arduino Nano وبرمجته باستخدام Visuino لإرسال بيانات الحزمة وعرضها على النطاق والأدوات المرئية. يرسل مقياس التسارع X ، Y ،
متعة دفعة MS-DOS: 7 خطوات
متعة الدفعة من MS-DOS: مرحبًا بالجميع! سنرى أسرار وأعمال MS-DOS