فهرست مطالب:

کلاه LED فانتزی: 5 مرحله (همراه با تصاویر)
کلاه LED فانتزی: 5 مرحله (همراه با تصاویر)

تصویری: کلاه LED فانتزی: 5 مرحله (همراه با تصاویر)

تصویری: کلاه LED فانتزی: 5 مرحله (همراه با تصاویر)
تصویری: گوز زدن پریانکا چوپرا هنرپیشه بالیوود در یکی از برنامه های لایف تلویزیونی |C&C 2024, نوامبر
Anonim
Image
Image
کلاه LED فانتزی
کلاه LED فانتزی

من همیشه می خواستم یک پروژه آردوینو انجام دهم ، اما هیچ ایده فوق العاده ای برای آن نداشتم تا اینکه خانواده ام به یک مهمانی کلاه فانتزی دعوت شدند. با توجه به زمان دو هفته ، من کنجکاو بودم که آیا می توانم کلاه متحرک LED حساس به حرکت را برنامه ریزی و اجرا کنم. معلوم شد من می توانم! من احتمالاً کمی فراتر رفتم ، اما کل پروژه حدود 80 دلار هزینه داشت. با آزمایش و کمی برنامه نویسی می توانید این کار را با هزینه کمتر انجام دهید.

هدف با کلاه زیر بود:

  1. مجموعه ای از چراغ ها را از وسط جلوی کلاه به عقب حرکت دهید ، یک چراغ در هر طرف
  2. سرعت حرکت نور را که توسط شیب کلاه از جلو به عقب تعیین می شود تغییر دهید
  3. اجازه دهید چراغها در مواقعی که نوار کلاه به سمت پایین متمایل شده است معکوس شوند (یعنی از اثر جاذبه بر روی چراغها تقلید کنید)
  4. رنگ را بر اساس شیب کلاه به چپ به راست تغییر دهید
  5. شوک ها را حس کنید و جلوه خاصی را نشان دهید
  6. چرخش کاربر را حس کنید و جلوه خاصی را نشان دهید
  7. آن را به طور کامل در کلاه داشته باشید

مرحله 1: قطعات مورد نیاز

قطعات مورد نیاز
قطعات مورد نیاز
قطعات مورد نیاز
قطعات مورد نیاز
قطعات مورد نیاز
قطعات مورد نیاز

من از اجزای اصلی زیر استفاده کردم (پیوندهای غیر وابسته آمازون شامل می شود):

  • میکروکنترلر Teensy LC - من این دستگاه را به دلیل اندازه کوچک آن بر آردوینو معمولی ترجیح دادم و دارای اتصال ویژه ای برای کنترل LED های من و همچنین پشتیبانی قوی از کتابخانه و جامعه است.
  • سنسور موقعیت بر اساس Bosch BNO055 - صادقانه یکی از اولین اسنادی که من در مورد آن اسناد را پیدا کردم. گزینه های بسیار ارزان تری وجود دارد ، اما هنگامی که Bosch را تشخیص می دهید ، کارهای زیادی برای شما انجام می دهد که در غیر این صورت مجبور به انجام کد هستید
  • نوار LED آدرس پذیر WS2812 - من طول 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: سیم کشی کنید

Wire It Up
Wire It Up

برد Teensy و LED ها با برق 3.3 ولت تا 5 ولت کار می کنند. به همین دلیل است که من از 3 باتری AAA استفاده کردم ، ولتاژ خروجی 4.5 ولت به خوبی در این محدوده است و مدت زمان زیادی برای نحوه برنامه نویسی LED ها در اختیار دارند. شما باید بتوانید بیش از 8 ساعت زمان اجرا را خوب پشت سر بگذارید.

سیم کشی برق

سیمهای مثبت و منفی جعبه باتری و LED ها را با هم وصل کردم ، سپس در مکانهای مناسب روی Teensy لحیم شدم. مثبت از باتری باید به پین سمت راست بالای Teensy در نمودار (با برچسب Vin روی صفحه) متصل شود ، و منفی را می توان به هر پینی با برچسب GND وصل کرد. به راحتی یکی در طرف مقابل تخته یا درست در کنار پین Vin وجود دارد. نمودار کامل pinout صفحه را می توانید در انتهای این صفحه بیابید. و در بعضی موارد هنگام سفارش تخته یک نسخه کاغذی در آن قرار داده می شود.

اگر در حال برنامه ریزی برای اجرای کد هستید که فقط چند LED در آن روشن است ، می توانید LED ها را از خود Teensy با استفاده از خروجی 3.3v و GND تغذیه کنید ، اما اگر سعی کنید بیش از حد قدرت را بکشید به تخته آسیب برساند بنابراین برای اینکه بیشترین گزینه ها را در اختیار خود قرار دهید ، بهتر است LED ها را مستقیماً به منبع باتری خود وصل کنید.

سیم کشی LED ها

من Teensy LC را برای این پروژه انتخاب کردم زیرا دارای یک پین است که اتصال LED های آدرس پذیر را بسیار آسان می کند. در قسمت پایینی صفحه ، پینی که از آینه های سمت چپ دوم پین شماره 17 قرار دارد ، اما دارای 3.3 ولت روی آن است. به این حالت کشش گفته می شود و در تخته های دیگر باید یک مقاومت را سیم کشی کنید تا این ولتاژ را تأمین کند. در مورد Teensy LC فقط می توانید از آن پین مستقیماً به سیم داده LED خود وصل کنید.

سیم کشی سنسور موقعیت

برخی از بردهای BNO055 موجود در ولتاژ بسیار دقیق تر هستند و فقط 3.3 ولت را می خواهند. به همین دلیل ، من Vin را روی برد BNO055 از خروجی اختصاصی 3.3v در Teensy ، که سومین پین در سمت راست است ، سیم کشی کردم. سپس می توانید GND را در BNO055 به هر GND در Teensy متصل کنید.

سنسور موقعیت BNO055 از I2c برای صحبت با Teensy استفاده می کند. I2c نیاز به کشش دارد ، بنابراین دو مقاومت 4.7 کیلو اهم را از خروجی 3.3 ولت در Teensy به پین 18 و 19. وصل کردم. سپس پین 19 را به پین SCL روی برد BNO055 و 18 را به پین SDA وصل کردم.

نکات/ترفندهای سیم کشی

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

کار با سیم جامد دشوارتر است زیرا تمایل دارد همانطور که خم شده است باقی بماند. اما برای این پروژه این یک مزیت بود. سیم های خود را به گونه ای برش داده و شکل دادم که جهت قرار دادن و برداشتن وسایل برقی از کلاه جهت تنظیم و برنامه نویسی ، جهت سنسور موقعیت سازگار باشد.

مرحله 4: برنامه نویسی

اکنون که همه چیز مونتاژ شده است ، به یک ابزار برنامه نویسی سازگار با Arduino نیاز خواهید داشت. من از Arduino IDE واقعی استفاده کردم (با لینوکس ، مک و رایانه کار می کند). همچنین برای ارتباط با برد Teensy به نرم افزار Teensyduino نیاز خواهید داشت. این پروژه به شدت از کتابخانه FastLED برای برنامه نویسی رنگ و موقعیت LED استفاده می کند.

کالیبراسیون

اولین کاری که می خواهید انجام دهید این است که به مخزن عالی GitHub Kris Winer برای BNO055 بروید و طرح BNO_055_Nano_Basic_AHRS_t3.ino او را بارگیری کنید. آن کد را با Serial Monitor نصب کنید و به شما اطلاع می دهد که آیا برد BNO055 به درستی آنلاین می شود و خودآزمایی خود را پشت سر می گذارد. همچنین شما را از طریق کالیبراسیون BNO055 راهنمایی می کند ، که بعدا نتایج ثابتی به شما می دهد.

شروع به کار با طرح فانتزی LED

کد کلاه LED فانتزی به طور خاص و همچنین مخزن GitHub من ضمیمه شده است. من قصد دارم تغییرات بیشتری در کد ایجاد کنم و آن ها در repo GitHub ارسال خواهند شد. فایل در اینجا منعکس کننده کد هنگام انتشار این دستورالعمل است. پس از بارگیری و باز کردن طرح ، چند مورد را باید تغییر دهید. اکثر مقادیر مهم برای تغییر در بالای عبارت #تعریف شده قرار دارند:

خط 24: #NUM_LEDS 89 را #تعریف کنید - این عدد را به تعداد LED های واقعی در نوار LED خود تغییر دهید

خط 28: #تعریف SERIAL_DEBUG نادرست - احتمالاً می خواهید این را درست کنید تا بتوانید خروجی را در مانیتور سریال ببینید

کد تشخیص موقعیت

تشخیص موقعیت و بیشتر تنظیمات شما از خط 742 شروع می شود و از 802 عبور می کند. ما داده های Pitch ، Roll و Yaw را از سنسور موقعیتی دریافت می کنیم و از آنها برای تعیین مقادیر استفاده می کنیم. بسته به نحوه نصب وسایل الکترونیکی شما ، ممکن است نیاز به تغییر آنها داشته باشید. اگر سنسور موقعیت را با تراشه به سمت بالای کلاه نصب کنید ، و پیکان کنار X چاپ شده روی تخته به طرف جلوی کلاه نشان داده شده است ، موارد زیر را ببینید:

  • زمین سر تکان می دهد
  • رول سر شما را کج می کند ، به عنوان مثال گوش خود را به شانه خود لمس کنید
  • Yaw کدام جهت است. شما روبرو هستید (شمال ، غرب ، و غیره).

اگر برد شما در جهت متفاوتی نصب شده است ، باید Pitch/Roll/Yaw را عوض کنید تا آنها هر طور که دوست دارید رفتار کنند.

برای تنظیم تنظیمات Roll می توانید مقادیر #تعریف زیر را تغییر دهید:

  • ROLLOFFSET: با کلاه خود پایدار و تا آنجا که می توانید در مرکز قرار دهید ، اگر Roll 0 نیست ، این را با تفاوت تغییر دهید. یعنی اگر رول را در -20 وقتی کلاه شما در مرکز است می بینید ، این 20 را بسازید.
  • ROLLMAX: حداکثر مقدار مورد استفاده برای اندازه گیری رول. با پوشیدن کلاه و حرکت دادن گوش راست خود به سمت شانه راست ، به راحتی می توانید آن را پیدا کنید. برای انجام این کار هنگام استفاده از مانیتور سریال ، به یک کابل USB طولانی نیاز دارید.
  • ROLLMIN: کمترین مقدار برای اندازه گیری رول ، برای زمانی که سر خود را به سمت چپ کج می کنید

به طور مشابه ، برای Pitch:

  • MAXPITCH - حداکثر مقدار هنگامی که به دنبال بالا هستید
  • MINPITCH - حداقل مقدار زمانی که به پایین نگاه می کنید
  • PITCHCENTER - مقدار گام زمانی که مستقیماً به جلو نگاه می کنید

اگر SERIALDEBUG را در بالای فایل روی true قرار دهید ، باید مقادیر فعلی خروجی Roll/Pitch/Yaw را در مانیتور سریال مشاهده کنید تا به این تغییرات کمک کند.

پارامترهای دیگری که ممکن است بخواهید تغییر دهید

  • MAX_LED_DELAY 35 - کندترین سرعت حرکت ذره LED. این در میلی ثانیه است. این تأخیر در حرکت از یک 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) ؛ if (intStatus> 8) {تاثیر ()؛ } else if (intStatus> 0) {spin ()؛ }

برای تغییر رفتار در ضربه ، خط void () بالا را در کد جستجو کنید ، یا چرخش void () را تغییر دهید.

یاوران

من یک تابع کمکی ساده (void setAllLeds ()) برای تنظیم سریع همه LED ها روی یک رنگ ایجاد کرده ام. یکی از آنها برای خاموش کردن همه آنها استفاده کنید:

setAllLeds (CRGB:: سیاه) ؛

یا می توانید هر رنگی که توسط کتابخانه FastLED شناخته شده است را انتخاب کنید:

setAllLeds (CRGB:: قرمز) ؛

همچنین یک تابع () fadeAllLeds وجود دارد که تمام LED ها را تا 25 درصد کم می کند.

کلاس ذرات

به منظور ساده سازی سیم کشی ، می خواستم از یک رشته LED استفاده کنم ، اما آنها را مانند چند رشته رفتار می کند. از آنجا که این اولین تلاش من بود ، می خواستم آن را تا آنجا که ممکن است ساده نگه دارم ، بنابراین من یک رشته را به عنوان دو مورد در نظر می گیرم ، چراکه وسایل LED وسط در آنجا تقسیم می شود. از آنجا که ما می توانیم یک عدد زوج یا یک فرد داشته باشیم ، باید آن را حساب کنیم. من با چند متغیر جهانی شروع می کنم:

/ * * متغیر و ظروف برای LED ها */ CRGB led [NUM_LEDS] ؛ int stats unsigned int curLedDelay = MAX_LED_DELAY؛ static int centerLed = NUM_LEDS / 2 ؛ static int maxLedPos = NUM_LEDS / 2 ؛ bool static oddLeds = 0 ؛ ذره بول استاتیکDir = 1؛ bool static speedDir = 1 ؛ dirCount طولانی بدون علامت ؛ بدون امضا hueCount؛

و چند کد در setup ():

if (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 LED به راحتی می توان مشاهده کرد:

  • 11 LED: 11/2 با اعداد صحیح باید تا 5 و رایانه ها از 0 شمارش کنند. بنابراین 0 - 4 یک نیمه ، 6 - 10 نیمه دیگر و 5 بین آنها است. در این مورد با شماره 5 طوری رفتار می کنیم که گویی بخشی از هر دو است ، یعنی برای هر دو رشته مجازی LED ها شماره 1 است
  • 10 LED: 10/2 برابر 5 است. اما از آنجا که کامپیوترها از 0 شمارش می کنند ، باید یکی را حذف کنیم. سپس ما برای یک نیمه 0 - 4 و برای نیمه دیگر 5 - 9 داریم. شماره 1 برای اولین رشته مجازی 4 و شماره 1 برای رشته دوم مجازی شماره 5 خواهد بود.

سپس در کد ذره خود باید از موقعیت کلی تا موقعیت های واقعی رشته LED شمارش کنیم:

if (oddLeds) {Pos1 = centerLed + currPos؛ Pos2 = centerLed - currPos؛ } else {Pos1 = centerLed + currPos؛ Pos2 = (centerLed -1) - currPos؛ }

کد همچنین دارای شرایطی است که ذره می تواند جهت آن را تغییر دهد ، بنابراین ما نیز باید آن را در نظر بگیریم:

if (particleDir) {if ((currPos == NUM_LEDS/2) && oddLeds) {currPos = 0 ؛ } else if ((currPos == NUM_LEDS/2 - 1) && (! oddLeds)) {currPos = 0؛ } else {currPos ++؛ }} else {if ((currPos == 0) && oddLeds) {currPos = centerLed؛ } else if ((currPos == 0) && (! oddLeds)) {currPos = centerLed - 1؛ } else {currPos-- ؛ }}

بنابراین ما از جهت موردنظر (particleDir) برای محاسبه LED بعدی که باید روشن شود استفاده می کنیم ، اما باید در نظر بگیریم که آیا به انتهای واقعی رشته LED یا نقطه مرکزی خود رسیده ایم ، که همچنین به عنوان پایانی برای هر یک از رشته های مجازی

وقتی همه اینها را فهمیدیم ، چراغ بعدی را در صورت لزوم روشن می کنیم:

if (particleDir) {if (oddLeds) {Pos1 = centerLed + currPos؛ Pos2 = centerLed - currPos؛ } else {Pos1 = centerLed + currPos؛ Pos2 = (centerLed -1) - currPos؛ }} else {if (oddLeds) {Pos1 = centerLed - currPos؛ Pos2 = centerLed + currPos؛ } else {Pos1 = centerLed - currPos؛ Pos2 = (centerLed -1) + currPos؛ }} leds [Pos1] = CHSV (currHue ، 255 ، 255) ؛ leds [Pos2] = CHSV (currHue ، 255 ، 255) ؛ FastLED.show ()؛}

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

توصیه شده: