جدول المحتويات:
2025 مؤلف: John Day | [email protected]. آخر تعديل: 2025-01-13 06:56
كنت أرغب دائمًا في القيام بمشروع Arduino ، لكن لم يكن لدي أبدًا أي أفكار رائعة لأحد حتى تمت دعوة عائلتي إلى حفلة قبعة فاخرة. مع مهلة أسبوعين ، كنت أشعر بالفضول إذا كان بإمكاني تخطيط وتنفيذ قبعة الرسوم المتحركة LED الحساسة للحركة. تبين أنني أستطيع! ربما ذهبت إلى الخارج قليلاً ، لكن التكلفة الإجمالية للمشروع حوالي 80 دولارًا. مع التجريب وبعض الترميز ، يمكنك القيام بذلك مقابل أقل.
كان الهدف مع القبعة كما يلي:
- اجعل مجموعة من الأضواء تتحرك من الجزء الأمامي الأوسط للقبعة إلى الخلف ، ضوء واحد على كل جانب
- قم بتغيير سرعة حركة الضوء التي تمليها إمالة القبعة من الأمام إلى الخلف
- اسمح للأضواء بالانعكاس عندما يميل حزام القبعة لأسفل (أي محاكاة تأثير الجاذبية على الأضواء)
- قم بتغيير اللون بناءً على إمالة القبعة من اليسار إلى اليمين
- الشعور بالصدمات ، وإظهار تأثير خاص
- اشعر مرتديها بالدوران ، واعرض مؤثرًا خاصًا
- اجعلها محتواة بالكامل في القبعة
الخطوة 1: الأجزاء المطلوبة
لقد استخدمت المكونات الرئيسية التالية (تم تضمين روابط Amazon غير التابعة):
- متحكم صغير Teensy LC - اخترت هذا على Arduino عادي نظرًا لصغر حجمه ، وله اتصال خاص للتحكم في مصابيح LED الخاصة بي ، بالإضافة إلى دعم قوي للمكتبة والمجتمع.
- مستشعر الموضع القائم على Bosch BNO055 - بصراحة أحد أول ما وجدت الوثائق عليه. هناك خيارات أقل تكلفة بكثير ، ولكن بمجرد اكتشاف Bosch ، فإنها تفعل الكثير من أجلك والتي كان عليك القيام بها في الكود.
- WS2812 شريط LED قابل للعنونة - اخترت طول 1 متر مع 144 LED لكل متر. إن وجود هذه الكثافة يساعد الضوء على أن يبدو وكأنه يتحرك ، بدلاً من إضاءة العناصر الفردية بالتسلسل.
والمكونات الثانوية التالية:
- قبعة - أي قبعة بها ربطة رأس ستفي بالغرض. هذه قبعة 6 دولارات من متجر محلي. إذا كان هناك خط في الخلف ، فسيكون من الأسهل تمرير الأسلاك. انتبه إلى ما إذا كان رباط القبعة ملتصقًا لأن ذلك سيؤدي أيضًا إلى بعض الصعوبة الإضافية. هذا واحد مخيط على طول الجزء العلوي ، لكن الجزء السفلي يتم سحبه بسهولة.
- مقاومات 4.7 كيلو أوم
- علبة بطارية 3x AAA - باستخدام 3 بطاريات AAA ينتج جهد في النطاق الذي تريده الإلكترونيات بالضبط ، مما يبسط الأمور. AAA تتناسب مع قبعة أسهل من AA ولا يزال لديها وقت تشغيل رائع.
- سلك قياس صغير - لقد استخدمت بعض الأسلاك الصلبة التي كنت أضعها من مشروع LED سابق.
- لحام الحديد ولحام
- بعض الياف لدنة التي تتطابق مع اللون الداخلي للقبعة ، والخيط
مقترح ، لكنه اختياري:
- موصلات سريعة لأسلاك البطارية
- أداة Helping Hands ، هذه الأشياء صغيرة جدًا ويصعب لحامها
الخطوة 2: تعديل القبعة
ستحتاج إلى مكان في القبعة لتركيب الإلكترونيات ومكان للبطارية. زوجتي تعمل بالملابس بشكل احترافي ، لذلك طلبت منها النصيحة والمساعدة. لقد انتهينا من إنشاء جيوب مع دنة. يتم توجيه الجيب الأصغر الأول باتجاه الأمام مثل القبعة نفسها بحيث يتم تثبيت المستشعر الموضعي في مكانه جيدًا عند تثبيت الإلكترونيات ، ومع ذلك يمكن إزالته بسهولة إذا لزم الأمر. الجيب الثاني باتجاه الخلف هو تثبيت حزمة البطارية في مكانها.
كانت الجيوب مزروعة بخيط يطابق لون القبعة ، وكلها بطول خط التاج. اعتمادًا على طراز القبعة والمواد المصنوعة من YMMV بهذه التقنية.
اكتشفنا أيضًا أن رباط القبعة يثني على نفسه من جانب واحد ، وكان مخيطًا بالكامل على القبعة في ذلك الموقع. كان علينا إزالة التماس الأصلي من أجل تشغيل مصابيح LED أسفل النطاق. أثناء البناء ، تم تثبيته في مكانه باستخدام المسامير ، ثم خياطته بخيط مطابق عند الانتهاء.
أخيرًا قمنا بفتح خط اللحام على ظهر القبعة حيث تم تغطيتها بالشريط. لقد قمنا بتدوير الأسلاك التي تأتي مع مصابيح LED من خلال هذا التماس ووضعنا أول مؤشر LED في الشريط على خط التماس. ثم قمنا بلف مصابيح LED حول القبعة وقمنا بقص الشريط لأسفل بحيث يكون آخر مؤشر LED بجوار الأول مباشرةً. يمكن تثبيت شريط LED في مكانه فقط باستخدام رباط القبعة ، ولكن اعتمادًا على الفرقة والمواد التي تستخدمها ، قد تحتاج إلى تثبيت مصابيح LED عن طريق الخياطة أو اللصق.
الخطوة 3: اربطها
ستعمل لوحة Teensy و LEDs في أي مكان من 3.3v إلى 5v للحصول على الطاقة. هذا هو السبب في أنني اخترت استخدام 3 بطاريات AAA ، جهد الخرج 4.5 فولت بشكل جيد في هذا النطاق ، ولديهم الكثير من وقت التشغيل للطريقة التي برمجت بها مصابيح LED للعمل. يجب أن تكون قادرًا على الحصول على ما يزيد عن 8 ساعات من وقت التشغيل.
توصيل الكهرباء
لقد قمت بتوصيل الخيوط الإيجابية والسلبية من صندوق البطارية ومصابيح LED معًا ، ثم تم لحامها في Teensy في المواقع المناسبة. يجب توصيل الموجب من البطارية بالدبوس الأيمن العلوي من Teensy في الرسم التخطيطي (المسمى Vin على اللوحة) ، ويمكن توصيل السالب بأي دبوس يحمل علامة GND. بشكل ملائم يوجد واحد على الجانب الآخر من اللوحة ، أو بجوار دبوس Vin. يمكن العثور على مخطط pinout الكامل للوحة في أسفل هذه الصفحة. وفي بعض الحالات يتم تضمين نسخة ورقية عند طلب السبورة.
إذا كنت تخطط لتشغيل رمز يحتوي على عدد قليل من مصابيح LED قيد التشغيل في وقت واحد ، فيمكنك تشغيل مصابيح LED من Teensy نفسها ، باستخدام مخرج 3.3 فولت و GND ، ولكن إذا حاولت سحب الكثير من الطاقة ، يمكنك إتلاف اللوحة. حتى تمنح نفسك معظم الخيارات ، من الأفضل توصيل مصابيح LED بمصدر البطارية مباشرةً.
توصيل مصابيح LED
لقد اخترت Teensy LC لهذا المشروع لأنه يحتوي على دبوس يجعل من الأسهل بكثير توصيل مصابيح LED القابلة للعنونة. في الجزء السفلي من اللوحة ، يوجد الدبوس الثاني من المرايا اليسرى Pin # 17 ، ولكن به أيضًا 3.3v. يُشار إلى هذا على أنه سحب ، وفي اللوحات الأخرى ، سيتعين عليك توصيل المقاوم لتوفير هذا الجهد. في حالة Teensy LC ، يمكنك فقط الأسلاك من هذا الدبوس مباشرة إلى سلك بيانات LEDs.
توصيل مستشعر الموضع
بعض لوحات BNO055 المتاحة أكثر صرامة على الجهد وتريد 3.3 فولت فقط. لهذا السبب ، قمت بتوصيل Vin على لوحة BNO055 من الإخراج المخصص 3.3 فولت على Teensy ، وهو الدبوس الثالث لأسفل على اليمين. يمكنك بعد ذلك توصيل GND على BNO055 بأي GND على Teensy.
يستخدم مستشعر الموضع BNO055 I2c للتحدث إلى Teensy. تتطلب I2c عمليات سحب ، لذلك قمت بتوصيل مقاومين 4.7K أوم من خرج 3.3 فولت على Teensy إلى السنون 18 و 19. ثم قمت بتوصيل دبوس 19 إلى دبوس SCL على لوحة BNO055 ، و 18 إلى دبوس SDA.
نصائح / حيل الأسلاك
للقيام بهذا المشروع ، استخدمت سلكًا صلبًا بدلاً من تقطعت بهم السبل. تتمثل إحدى ميزات السلك المصمت أثناء اللحام في نماذج أولية للوحات مثل هذه. يمكنك تجريد بعض الأسلاك وثنيها بزاوية 90 درجة وإدخالها في الجزء السفلي من أحد المحطات بحيث تلتصق نهاية السلك المقطوعة فوق اللوح. ستحتاج بعد ذلك فقط إلى كمية صغيرة من اللحام لتثبيتها في الجهاز ، ويمكنك قطع الفائض بسهولة.
قد يكون التعامل مع السلك المصمت أكثر صعوبة لأنه يميل إلى البقاء كما هو مثني. لكن بالنسبة لهذا المشروع كان ذلك ميزة. لقد قمت بقص وتشكيل الأسلاك الخاصة بي بطريقة تجعل اتجاه المستشعر الموضعي متسقًا عندما أدخلت الإلكترونيات وأزلتها من القبعة من أجل التغيير والتبديل.
الخطوة 4: البرمجة
الآن بعد أن تم تجميع كل شيء ، ستحتاج إلى أداة برمجة متوافقة مع Arduino. لقد استخدمت Arduino IDE الفعلي (يعمل مع Linux و Mac و PC). ستحتاج أيضًا إلى برنامج Teensyduino للتفاعل مع لوحة Teensy. يستخدم هذا المشروع مكتبة FastLED بشكل كبير للقيام ببرمجة الألوان والموضع لمصابيح LED.
المعايرة
أول شيء تريد القيام به هو الذهاب إلى مستودع GitHub الممتاز لكريس وينر لـ BNO055 وتنزيل رسم BNO_055_Nano_Basic_AHRS_t3.ino. قم بتثبيت هذا الرمز مع تشغيل Serial Monitor وسيخبرك ما إذا كانت لوحة BNO055 تأتي عبر الإنترنت بشكل صحيح وتجتاز اختباراتها الذاتية. سيرشدك أيضًا خلال معايرة BNO055 ، والتي ستمنحك نتائج أكثر اتساقًا لاحقًا.
الشروع في رسم Fancy LED
تم إرفاق رمز قبعة Fancy LED على وجه التحديد ، وكذلك في مستودع GitHub الخاص بي. أخطط لإجراء المزيد من التعديلات على الكود وسيتم نشرها على GitHub repo. يعكس الملف هنا الرمز عندما تم نشر هذا Instructable. بعد تنزيل المخطط وفتحه ، هناك بعض الأشياء التي ستحتاج إلى تغييرها. توجد معظم القيم المهمة التي يجب تغييرها في الجزء العلوي من العبارات #define:
السطر 24: # تعريف NUM_LEDS 89 - قم بتغيير هذا إلى العدد الفعلي لمصابيح LED على شريط LED الخاص بك
السطر 28: #define SERIAL_DEBUG false - ربما ترغب في جعل هذا صحيحًا ، بحيث يمكنك رؤية الإخراج على الشاشة التسلسلية
كود الكشف عن الموقف
يبدأ اكتشاف الموضع ومعظم عمليات التغيير والتبديل في السطر 742 ، ويمر عبر 802. نحصل على بيانات الانحراف واللف والانعراج من مستشعر الموضع ونستخدمها لتعيين القيم. اعتمادًا على كيفية تركيب الأجهزة الإلكترونية الخاصة بك ، قد تحتاج إلى تغييرها. إذا قمت بتركيب مستشعر الموضع مع وجود الشريحة في اتجاه الجزء العلوي من القبعة ، وكان السهم الموجود بجانب X المطبوع على اللوحة مشيرًا نحو مقدمة القبعة ، فسترى ما يلي:
- الملعب يهز رأسك
- لفة تميل رأسك ، على سبيل المثال المس أذنك على كتفك
- ياو هو أي اتجاه. أنت تواجه (الشمال ، الغرب ، إلخ).
إذا تم تركيب اللوح الخاص بك في اتجاه مختلف ، فستحتاج إلى تبديل Pitch / Roll / Yaw حتى يتصرفوا بالطريقة التي تريدها.
لضبط إعدادات Roll ، يمكنك تغيير قيم #define التالية:
- ROLLOFFSET: مع ثبات قبعتك وتوسيطها قدر الإمكان ، إذا لم تكن لفة الورق 0 ، فغيّر هذا بالاختلاف. بمعنى آخر. إذا كنت ترى Roll at -20 عندما تكون قبعتك في المنتصف ، فاجعل هذا 20.
- ROLLMAX: القيمة القصوى لاستخدامها في قياس الأسطوانة. يسهل العثور عليه بارتداء القبعة وتحريك أذنك اليمنى باتجاه كتفك الأيمن. ستحتاج إلى كبل USB طويل للقيام بذلك أثناء استخدام الشاشة التسلسلية.
- ROLLMIN: أقل قيمة يمكن استخدامها لقياس اللف ، عند إمالة رأسك إلى اليسار
وبالمثل ، بالنسبة إلى Pitch:
- MAXPITCH - القيمة القصوى عند البحث
- MINPITCH - القيمة الدنيا عندما تنظر إلى أسفل
- PITCHCENTER - قيمة الملعب عندما تتطلع إلى الأمام بشكل مستقيم
إذا قمت بتعيين SERIALDEBUG على true في الجزء العلوي من الملف ، يجب أن ترى القيم الحالية لإخراج Roll / Pitch / Yaw إلى الشاشة التسلسلية للمساعدة في تعديل هذه القيم.
معلمات أخرى قد ترغب في تغييرها
- MAX_LED_DELAY 35 - الأبطأ الذي يمكن أن يتحرك به جسيم LED. هذا في مللي ثانية. إنه التأخير من الانتقال من مؤشر LED إلى آخر في السلسلة.
- MIN_LED_DELAY 10 - الصيام الذي يمكن أن يتحرك فيه جسيم LED. كما ورد أعلاه بالميلي ثانية.
استنتاج
إذا كنت قد ذهبت إلى هذا الحد ، فيجب أن يكون لديك قبعة LED تعمل بكامل طاقتها وممتعة! إذا كنت تريد أن تفعل المزيد معها ، فستحتوي الصفحة التالية على بعض المعلومات المتقدمة حول تغيير الإعدادات والقيام بالأشياء الخاصة بك. بالإضافة إلى بعض الشرح لما يفعله باقي الكود الخاص بي.
الخطوة 5: متقدم واختياري: داخل الكود
كشف الصدمات والدوران
يتم الكشف عن التأثير / الدوران باستخدام وظائف مستشعر G العالية لـ BNO055. يمكنك تعديل درجة الحساسية باستخدام الأسطر التالية في initBNO055 ():
- السطر رقم 316: BNO055_ACC_HG_DURATION - كم من الوقت يجب أن يستمر الحدث
- السطر رقم 317: BNO055_ACC_HG_THRESH - ما مدى صعوبة التأثير الذي يجب أن يكون
- السطر رقم 319: BNO055_GYR_HR_Z_SET - حد سرعة الدوران
- السطر رقم 320: BNO055_GYR_DUR_Z - كم من الوقت يجب أن يستمر الدوران
كلتا القيمتين ثنائيتان 8 بت ، ويتم حاليًا تعيين التأثير على B11000000 ، وهو 192 من 255.
عند اكتشاف تأثير أو دوران ، يحدد BNO055 قيمة يبحث عنها الرمز في بداية الحلقة:
// اكتشف أي مقاطعات تم تشغيلها ، أي بسبب ارتفاع G بايت intStatus = readByte (BNO055_ADDRESS ، BNO055_INT_STATUS) ؛ إذا (intStatus> 8) {الأثر () ؛ } else if (intStatus> 0) {spin ()؛ }
ابحث عن سطر تأثير الفراغ () أعلاه في الكود لتغيير السلوك عند التأثير ، أو الدوران الفارغ () لتغيير سلوك الدوران.
مساعدين
لقد قمت بإنشاء وظيفة مساعد بسيطة (void setAllLeds ()) لضبط جميع مصابيح LED بسرعة على لون واحد. استخدمها لإيقافها جميعًا:
setAllLeds (CRGB:: أسود) ؛
أو يمكنك اختيار أي لون تتعرف عليه مكتبة FastLED:
setAllLeds (CRGB:: Red) ؛
هناك أيضًا وظيفة fadeAllLeds () التي تعمل على تعتيم جميع مصابيح LED بنسبة 25٪.
فئة الجسيمات
من أجل تبسيط الأسلاك بشكل كبير ، أردت استخدام سلسلة واحدة من مصابيح LED ، لكن اجعلها تتصرف مثل سلاسل متعددة. نظرًا لأن هذه كانت محاولتي الأولى ، فقد أردت أن أبقيها بسيطة قدر الإمكان ، لذلك أتعامل مع السلسلة الواحدة كسلسلتين ، مع وجود مؤشر (مؤشرات) LED الوسطى هناك سيكون الانقسام. نظرًا لأنه يمكن أن يكون لدينا رقم زوجي أو رقم فردي ، فنحن بحاجة إلى حساب ذلك. أبدأ ببعض المتغيرات العالمية:
/ * * متغير وحاويات لمصابيح LED * / CRGB المصابيح [NUM_LEDS] ؛ int curLedDelay ثابت بدون إشارة = MAX_LED_DELAY ، ثابت int centerLed = NUM_LEDS / 2 ؛ ثابت int maxLedPos = NUM_LEDS / 2 ؛ منطقي ثابت oddLeds = 0 ؛ جسيم منطقي ثابت: Dir = 1 ؛ ثابت bool speedDir = 1 ؛ dirCount طويل بدون توقيع ؛ hueCount طويل بدون توقيع ؛
وبعض التعليمات البرمجية في الإعداد ():
إذا (NUM_LEDS٪ 2 == 1) {oddLeds = 1 ؛ maxLedPos = NUM_LEDS / 2 ، } else {oddLeds = 0 ؛ maxLedPos = NUM_LEDS / 2 - 1 ؛ }
إذا كانت لدينا أرقام فردية ، فنحن نريد استخدام النقطة 1/2 كمنتصف ، وإلا فإننا نريد النقطة 1/2 - 1. من السهل رؤية ذلك باستخدام 10 أو 11 مؤشرًا ضوئيًا:
- 11 مؤشرًا ضوئيًا: 11/2 مع الأعداد الصحيحة يجب أن يتم تقييمها إلى 5. وعدد أجهزة الكمبيوتر من 0. لذا فإن 0 - 4 هي النصف ، 6 - 10 هي النصف الآخر ، و 5 بينها. نتعامل مع رقم 5 في هذه الحالة كما لو كان جزءًا من كليهما ، أي أنه رقم 1 لكل من السلاسل الافتراضية لمصابيح LED
- 10 مصابيح LED: 10/2 تساوي 5. ولكن نظرًا لأن أجهزة الكمبيوتر تعد من 0 ، فنحن بحاجة إلى إزالة واحدة. ثم لدينا 0 - 4 للنصف ، و5 - 9 للنصف الآخر. # 1 للسلسلة الافتراضية الأولى ستكون 4 ، و # 1 للسلسلة الافتراضية الثانية ستكون # 5.
ثم في كود الجسيمات الخاص بنا ، يتعين علينا القيام ببعض العد من موضعنا العام إلى المواضع الفعلية على سلسلة LED:
إذا (oddLeds) {Pos1 = centerLed +urrPos ؛ Pos2 = centerLed - كريبوس ؛ } else {Pos1 = centerLed +urrPos ؛ Pos2 = (centerLed -1) - curPos ؛ }
يحتوي الكود أيضًا على شروط حيث يمكن للجسيم تغيير الاتجاهات ، لذلك علينا أيضًا أن نأخذ ذلك في الاعتبار:
إذا (جسيم) {if ((curPos == NUM_LEDS / 2) && oddLeds) {curPos = 0؛ } else if ((curPos == NUM_LEDS / 2 - 1) && (! oddLeds)) {curPos = 0؛ } else {curPos ++؛ }} else {if ((urrPos == 0) && oddLeds) {curPos = centerLed؛ } else if ((curPos == 0) && (! oddLeds)) {curPos = centerLed - 1؛ } آخر {curPos--؛ }}
لذلك نستخدم الاتجاه المقصود (جسيميدير) ، لحساب أي LED يجب أن يضيء بعد ذلك ، ولكن علينا أيضًا أن نفكر فيما إذا كنا قد وصلنا إما إلى النهاية الحقيقية لسلسلة LED ، أو النقطة المركزية لدينا ، والتي تعمل أيضًا كنهاية لـ كل من السلاسل الافتراضية.
بمجرد أن نحدد كل ذلك ، نضيء الضوء التالي حسب الضرورة:
إذا (الجسيمات) {إذا (فرديليد) {Pos1 = centerLed + curpos ؛ Pos2 = centerLed - curPos ؛ } else {Pos1 = centerLed +urrPos ؛ Pos2 = (centerLed -1) - curPos ؛ }} else {if (oddLeds) {Pos1 = centerLed - curPos؛ Pos2 = centerLed +urrPos ؛ } else {Pos1 = centerLed - curPos؛ Pos2 = (centerLed -1) + CurrentPos ؛ }} المصابيح [Pos1] = CHSV (curHue، 255، 255) ؛ المصابيح [Pos2] = CHSV (curHue ، 255 ، 255) ؛ FastLED.show () ؛}
لماذا جعل هذا فصل دراسي على الإطلاق؟ كما هو الحال ، يعد هذا أمرًا بسيطًا جدًا ولا يحتاج حقًا إلى التواجد في الفصل. ومع ذلك ، لدي خطط مستقبلية لتحديث الكود للسماح بحدوث أكثر من جسيم واحد في وقت واحد ، وعمل بعض الجسيمات في الاتجاه المعاكس بينما يتقدم البعض الآخر. أعتقد أن هناك بعض الاحتمالات الرائعة حقًا لاكتشاف الدوران باستخدام جزيئات متعددة.