فهرست مطالب:

Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 مرحله (همراه با تصاویر)
Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 مرحله (همراه با تصاویر)

تصویری: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 مرحله (همراه با تصاویر)

تصویری: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 مرحله (همراه با تصاویر)
تصویری: Arduino & Neopixel Coke Bottle Party Light 2024, دسامبر
Anonim
Image
Image

بنابراین پسرم دون یک چراغ مهمانی بسیار جالب که از بطری های کک قدیمی و قسمت های درخشان Glow Sticks ساخته شده است را مشاهده می کند و می پرسد آیا می توانیم برای امتحانات مدرسه ای که در آینده به پایان می رسد ، یکی بسازیم؟ من مطمئناً می گویم ، اما آیا ترجیح نمی دهید برخی از حلقه های تند Adafruit Neopixel که در مورد آنها خوانده بودیم داشته باشید … او خیره ای خیره به من می کند. از آنجا که او نمی داند من در مورد چه چیزی صحبت می کنم ، اما پدر فرصتی را برای بازی با حلقه های نئوپیکسلی که او در مورد آنها می خواند ، پیدا کرده است ، و همه ما یکی از 10 دلیلی را که پدران گیک پرورش می دهند این است که بهانه ای برای بازی با ابزارهای جالبی که آنها می گویند همه برای بچه های خود هستند.

این یک پروژه فوق العاده ساده است که واقعاً عالی به نظر می رسد. ما از 3 بطری کک قدیمی ، یک بشقاب چوبی و یک پایه مخصوص زمین بازی - چیزهایی که در زیرزمین قرار دارند - با یک آردوینو (در مورد ما لئوناردو ، اما هر تخته Genuino انجام می دهد!) و سه حلقه نئوپیکسل ، ساخته ایم. به من یک حلقه 9 LED سفارش دادم ، اما با یک قیمت حلقه 12 LED به پایان رسید. این شیرین بود ، اما به معنای انجام مجدد روی چاه ها بود-حلقه های 12 LED 35 میلی متر عرض دارند ، در مقابل 23 میلی متر. آنچه شما نیاز دارید:

  • برد Genuino/Arduino (ما از لئوناردو استفاده کردیم ، اما تقریباً هر برد آن را انجام می دهد)
  • 3 حلقه نئوپیکسل (12 عدد LED): آنها را از Adafruit تهیه کنید و از افراد خوب حمایت کنید
  • 1000 µf 6.3v یا خازن بهتر
  • مقاومت 300-500 اهم
  • یک بشقاب چوبی یا یک مربع چوب قراضه یا هر چیزی که می توانید نئوپیکسل ها را در آن قرار دهید و بطری های کک را روی آن قرار دهید
  • نوعی از سوار شدن برای صفحه - یک پایه مخصوص زمین بازی برای ما عالی بود
  • زگیل دیواری 9 ولت
  • سوراخ سوراخ 40 میلیمتری
  • پیچ و مهره ، واشر ، واشر ، فاصله دهنده
  • سیم جامد
  • لحیم کاری و لحیم کاری
  • تخته نان
  • یک قاب پلاستیکی برای آردوینو شما می توانید بیرون بروید و یک جعبه پلاستیکی بسیار زیبا و کاملاً مناسب تهیه کنید که از نفت میلیون ها ساله ساخته شده است و در محیطی شکننده از خاک حفاری شده و در طرف دیگر کره زمین تولید شده و در ظرفی به انبار نزدیک شما ارسال می شود. بندرها در تراز کامل قرار گرفته و با ون دی اکسید کربن به اتمسفر به درب شما تحویل داده می شود. یا می توانید کاری را که من انجام دادم انجام دهید و از یک جعبه پلاستیکی دور ریخته استفاده کنید. در اینجا سخنرانی به پایان می رسد. بیایید بسازیم…

مرحله 1: پایه را بسازید

پایه بسازید
پایه بسازید
پایه بسازید
پایه بسازید

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

ابتدا سه سوراخ ، به طور مساوی روی صفحه چوبی ، به اندازه کافی بزرگ قرار دادیم تا حلقه های نئوپیکسل در آن بنشینند. در تصویر حفره هایی با چاله با حفر چاه حفر شده است. در پایان ، به دلیل اندازه بزرگتر حلقه های 12-LED ، مجبور شدیم سوراخ هایی را با یک مته سوراخ کنیم. این به این معنی بود که تمام صفحه را طی می کرد و به جای این که حلقه ها را به خوبی در چاه های کوچک و عمیق ساخته شده با قطر 2 میلی متر با سوراخ مرکزی برای یک سیم تمیز و محکم بچسبانم ، در نهایت حلقه ها را با … اه … نوار چسب در قسمت پایین محکم کردم. از صفحه قضاوت نکن به هر حال شما نمی توانید ته صفحه را در طرح من ببینید. و وقتی روشن است تاریک است. و علاوه بر این - نوار چسب چیست؟

من نیاز به فاصله بین بشقاب و براکت برای یک تخته نان در پایین صفحه و یک جزء - خازن ، و برای سیم کشی که باید از تخته نان به آردوینو برود ، داشتم که قصد داشتم داخل براکت قرار دهم. بنابراین مجموعه ای از جدا کننده های موقت را روی شفت پیچ قرار دادم تا فاصله کافی ایجاد شود - حدود 3 سانتی متر ، ارتفاع تخته نان و کمی تا سیم کشی نشود. من از دو پیچ لنگر چوبی در هر گوشه استفاده کردم ، زیرا ارتفاع مناسبی داشتند و در کشوی مرد قرار داشتند … آن جعبه پیچ ، پیچ ، میخ ، حلقه های زنجیره ای زنگ زده ، اتصالات شلنگ ، سکه های قدیمی ، اشیاء تیز غیر منتظره و همه چیز قطعاتی که می توانند به طرز جادویی با ارائه ، اگر نه چیزی که دقیقاً به آن نیاز دارید ، در سفر به فروشگاه سخت افزار صرفه جویی کنید ، کاری که به خوبی انجام می شود.

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

سپس کل را با اسپری به رنگ سیاه گوتیک رنگ آمیزی کردیم.

مرحله 2: آماده سازی حلقه های نئوپیکسل

آماده سازی حلقه های نئوپیکسل
آماده سازی حلقه های نئوپیکسل

شما باید سیم هایی را روی حلقه های نئوپیکسلی خود بچسبانید: یک سیم Data-In برای همه آنها ، یک سیم Data-Out برای دو تای آنها و یک سیم برق و اتصال برای هر کدام. به هر طول که فکر می کنید به آن نیاز دارید ، مقداری اضافه کنید. شما همیشه می توانید سیم اضافی را قطع کنید ، نمی توانید سیم خیلی کوتاه را بکشید. و از هشدار Adafruit آگاه باشید:

هنگام اتصال سیم به این حلقه ها ، باید مراقب لحیم کاری و اتصال کوتاه باشید. فاصله بین اجزا بسیار تنگ است! غالباً ساده تر است که سیم را از جلو وارد کرده و در پشت لحیم کنید.

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

نئوپیکسل زنجیره ای از دیزی دارد ، بدین معنی که می توانید همه LED های آنها را همزمان از طریق آردوینو با اتصال سیم از بیرون یک حلقه به IN حلقه دیگر کنترل کنید. هر حلقه به سیم برق و زمین نیز احتیاج دارد.

مرحله 3: سیم کشی

سیم کشی
سیم کشی

مانند Fritzing بالا سیم کشی کنید-پین 6 آردوینو داده ها را به حلقه اول می برد ، Data-out از آن حلقه به Data-in بعدی می رود ، Data-out از آن یکی به داده های آخرین حلقه شما نیازی به سیم خروجی حلقه نهایی ندارید.

ظرفیت 1000 µf بین خطوط مثبت و منفی تخته نان قرار می گیرد. این کلاه از حلقه ها در برابر افزایش قدرت محافظت می کند و توسط بخش بهترین تمرین Adafruit NeoPixel Uberguide توصیه می شود. مقاومت بر روی داده ها در اولین نئوپیکسل نیز توسط Adafruit توصیه می شود-در Fritzing 1K است اما مقاومت توصیه شده 300-500 اهم است.

در ساخت من ، سیمها را از نئوپیکسلها در پشت صفحه به یک تخته نان که در مرکز ثابت شده بود ، رساندم. به این ترتیب شما فقط باید سه سیم بلند را به واحد اصلی منتقل کنید: قدرت ، زمین و داده. من این سیمها را بسیار بلند ساختم-فضای ذخیره سازی زیادی در پایه وجود دارد و این باعث می شود که بتوانید صفحه را برای برنامه ریزی مجدد بیرون بکشید.

مرحله 4: کد

"loading =" تنبل "اشاره کرد که پسرم نسخه ای از موسیقی را می خواهد. این عکس را تا 18 سالگی می برد ، اما اینجاست!

قطعات اضافی تجهیزات:

1 تک قطبی ، سوئیچ دوگانه پرتاب 1 میکروفن کنترل دستی (من از MAX9184 AdaFruit استفاده کردم) 1 خازن 1uF-100uF (هر مقدار)

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

من می خواستم از گزینه استفاده از الگوی تست چرخش یا موسیقی استفاده کنم ، بنابراین سیم مرکزی سوئیچ را به VIN و یک سر را به پین 4 و دیگری را به پین 8 لئوناردو وصل کردم. با آزمایش آن پین ها برای HIGH یا LOW می توانیم بفهمیم که سوئیچ در کدام حالت قرار دارد و بر این اساس کد انشعاب را مشخص کنیم.

مرحله 7: سیم کشی میکروفون

سیم کشی میکروفون
سیم کشی میکروفون

ورودی میکروفن را از طریق آن خازن 1-100µF در پین آنالوگ 0 وارد کنید. اگر خازن شما قطبی شده باشد ، پایه خروجی به سمت مثبت (سیم سبز) می رود.

با تشکر از CodeGirlJP برای روال Trinket-Color-by-Sound او ، که در زیر اقتباس کردم:

// LED های فعال شده با صدا با Arduino و NeoPixels

#عبارتند از

#تعریف MIC_PIN A0 // میکروفون به پین a0 در لئوناردو وصل شده است

#تعریف LED_PIN 6 // رشته LED NeoPixel متصل به پین 6 در Leonardo #تعریف N_PIXELS 36 // تعداد پیکسل در رشته LED !!!!!! تعداد پیکسل ها را در تنظیم خود تنظیم کنید. این برای 3 حلقه نئوپیکسل درست است !!!!!! #define N 100 // تعداد نمونه هایی که باید در هر بار خوانده شود نمونه ها #تعریف محو شدن تأخیر 5 // زمان تاخیر برای هر مقدار محو شدن #تعریف نویز سطح 30 // سطح شیب متوسط صدای میکروفون بدون صدا

// نوار NeoPixel را با مقادیر تعریف شده در بالا راه اندازی کنید:

نوار Adafruit_NeoPixel = Adafruit_NeoPixel (N_PIXELS ، LED_PIN ، NEO_GRB + NEO_KHZ800) ؛

نمونه int [N] ؛ // ذخیره سازی برای مجموعه مجموعه نمونه

int periodFactor = 0؛ // پیگیری تعداد ms برای محاسبه دوره int t1 = -1؛ // زمان شیب> 100 تشخیص داده شد. int T؛ // فاصله بین زمانهای تغییر یافته تا میلی ثانیه در شیب داخلی ؛ // شیب دو نمونه داده جمع آوری شده نقطه نمونه بایت periodChanged = 0؛ const int SwitchPinMusic = 4 ؛ // پین برای موقعیت سوئیچ music-sensitive const int SwitchPinSwirl = 8؛ // پین برای موقعیت سوئیچ Test Pattern (swirl) int MusicbuttonState = 0؛ // متغیر منطقی خاموش برای حساسیت به موسیقی

// روش راه اندازی Arduino

void setup () {

strip.begin ()؛

ledsOff ()؛ تأخیر (500) ؛ displayColor (چرخ (100)) ؛ strip.show ()؛ تأخیر (500) ؛ oddWheel (چرخ (100)) ؛ strip.show ()؛ تأخیر (500) ؛ pinMode (SwitchPinMusic ، INPUT) ؛ pinMode (SwitchPinSwirl ، INPUT) ؛ // attachInterrupt (4 ، Switched ، FALLING) ؛

}

// روش حلقه آردوینو

void loop () {SwirlbuttonState = digitalRead (SwitchPinSwirl) ؛ // HIGH اگر سوئیچ روی Music حساسیت تنظیم MusicbuttonState = digitalRead (SwitchPinMusic) ؛ // HIGH اگر سوئیچ روی Test pattern while (SwirlbuttonState == LOW) {readSamples ()؛ // اجرای معمول نمونه گیری موسیقی SwirlbuttonState = digitalRead (SwitchPinSwirl) ؛ // بررسی کنید که آیا سوئیچ تغییر کرده است} SwirlbuttonState = digitalRead (SwitchPinSwirl) ؛ MusicbuttonState = digitalRead (SwitchPinMusic) ؛ while (SwirlbuttonState == HIGH) {Dance ()؛ // اجرای الگوی آزمایشی چرخشی SwirlbuttonState = digitalRead (SwitchPinSwirl) ؛ // بررسی کنید که آیا سوئیچ تغییر کرده است یا خیر

}

}

void Dance () {

while (SwirlbuttonState == HIGH) {colorWipe (strip. Color (255، 0، 0)، 50)؛ // Red SwirlbuttonState = digitalRead (SwitchPinSwirl) ؛ colorWipe (نوار رنگ (0 ، 255 ، 0) ، 50) ؛ // Green SwirlbuttonState = digitalRead (SwitchPinSwirl) ؛ colorWipe (نوار رنگ (0 ، 0 ، 255) ، 50) ؛ // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl) ؛ //colorWipe(strip. Color(0، 0، 0، 255)، 50)؛ // سفید RGBW // ارسال پیکسل تئاتر در… SwirlbuttonState = digitalRead (SwitchPinSwirl)؛ theaterChase (نوار رنگ (127 ، 127 ، 127) ، 50) ؛ // White SwirlbuttonState = digitalRead (SwitchPinSwirl) ؛ TheaterChase (نوار رنگ (127 ، 0 ، 0) ، 50) ؛ // Red SwirlbuttonState = digitalRead (SwitchPinSwirl) ؛ TheaterChase (نوار رنگ (0 ، 0 ، 127) ، 50) ؛ // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl) ؛ رنگین کمان (20) ؛ SwirlbuttonState = digitalRead (SwitchPinSwirl) ؛ rainbowCycle (20) ؛ SwirlbuttonState = digitalRead (SwitchPinSwirl) ؛ TheaterChaseRainbow (50) ؛ SwirlbuttonState = digitalRead (SwitchPinSwirl) ؛ }} // داده های نمونه را از Mic بخوانید و پردازش کنید void readS نمونه () {برای (int i = 0؛ i0) {شیب = نمونه - نمونه [i -1] ؛ } else {شیب = نمونه - نمونه [N -1] ؛ } // بررسی کنید که آیا شیب بیشتر از noiseLevel است - صدایی که در سطح نویز نیست اگر (abs (شیب)> noiseLevel) {if (شیب <0) {calcPeriod (i)؛ if (periodChanged == 1) {displayColor (getColor (T)) ؛ }}} else {ledsOff ()؛ // theaterChaseRainbow (50) ؛ } periodFactor += 1؛ تأخیر (1) ؛ }}

دوره محاسبه دوره (int i)

{if (t1 == -1) {// t1 تنظیم نشده است t1 = i؛ } else {// t1 تنظیم شد بنابراین دوره دوره int period = periodFactor*(i - t1) ؛ periodChanged = T == دوره؟ 0: 1 ؛ T = دوره ؛ //Serial.println(T)؛ // تنظیم مجدد t1 به مقدار i جدید t1 = i؛ periodFactor = 0؛ }}

uint32_t getColor (دوره int)

{if (period == -1) return wheel (0)؛ در غیر این صورت (دوره> 400) بازگشت چرخ (5) ؛ else return Wheel (نقشه (-1*دوره ، -400 ، -1 ، 50 ، 255)) ؛ }

void fadeOut ()

{برای (int i = 0 ؛ i <5؛ i ++) {strip.setBrightness (110 - i*20) ؛ strip.show ()؛ // به روز رسانی تاخیر نوار (fadeDelay) ؛ periodFactor += fadeDelay؛ }}

void fadeIn ()

{strip.setBrightness (100) ؛ strip.show ()؛ // به روز رسانی نوار // محو شدن رنگ در for (int i = 0؛ i <5؛ i ++) {//strip.setBrightness(20*i+30)؛ //strip.show ()؛ // به روز رسانی تاخیر نوار (fadeDelay) ؛ periodFactor+= fadeDelay؛ }}

void ledsOff ()

{fadeOut ()؛ برای (int i = 0 ؛ i

void displayColor (رنگ uint32_t)

{برای (int i = 0 ؛ i

void oddWheel (رنگ uint32_t)

{for (int j = 0؛ j <256؛ j ++) {// تمام 256 رنگ موجود در چرخ را برای (int q = 0؛ q <3؛ q ++) {برای (uint16_t i = 24؛ i <36؛ i = i+3) {strip.setPixelColor (i+q ، چرخ ((i+j)٪ 255)) ؛ // هر پیکسل سوم را روشن کنید} strip.show ()؛

تأخیر (1) ؛

برای (uint16_t i = 24؛ i <36؛ i = i+3) {strip.setPixelColor (i+q، 0)؛ // هر پیکسل سوم را خاموش کنید}}} fadeIn ()؛ }

// نقاط را یکی پس از دیگری با رنگ پر کنید

void colorWipe (uint32_t c، uint8_t wait) {for (uint16_t i = 0؛ i

رنگین کمان خالی (uint8_t صبر کنید) {

uint16_t i، j؛

برای (j = 0؛ j <256؛ j ++) {برای (i = 0؛ i

// کمی متفاوت ، این باعث می شود رنگین کمان به طور مساوی در سراسر توزیع شود

void rainbowCycle (uint8_t wait) {uint16_t i، j؛

برای (j = 0 ؛ j <256*5 ؛ j ++) {// 5 چرخه از همه رنگها در چرخ برای (i = 0 ؛ i <strip.numPixels () ؛ i ++) {strip.setPixelColor (i ، Wheel (((i * 256 / strip.numPixels ()) + j) & 255))؛ } strip.show ()؛ تأخیر (صبر) ؛ }}

// چراغ های خزنده به سبک تئاتر.

void theaterChase (uint32_t c، uint8_t wait) {for (int j = 0؛ j <10؛ j ++) {// 10 چرخه تعقیب (int q = 0؛ q <3؛ q ++) {برای (uint16_t i = 0؛ i <strip.numPixels ()؛ i = i+3) {strip.setPixelColor (i+q، c)؛ // هر پیکسل سوم را روشن کنید} strip.show ()؛

تأخیر (صبر) ؛

برای (uint16_t i = 0؛ i <strip.numPixels ()؛ i = i+3) {strip.setPixelColor (i+q، 0)؛ // هر پیکسل سوم را خاموش کنید}}}}

// چراغ های خزنده به سبک تئاتر با جلوه رنگین کمان

void theaterChaseRainbow (uint8_t wait) {for (int j = 0؛ j <256؛ j ++) {// تمام 256 رنگ موجود در چرخ را برای (int q = 0؛ q <3؛ q ++) {برای (uint16_t i = 0 ؛ i <strip.numPixels ()؛ i = i+3) {strip.setPixelColor (i+q، Wheel ((i+j)٪ 255))؛ // هر پیکسل سوم را روشن کنید} strip.show ()؛

تأخیر (صبر) ؛

برای (uint16_t i = 0؛ i <strip.numPixels ()؛ i = i+3) {strip.setPixelColor (i+q، 0)؛ // هر پیکسل سوم را خاموش کنید}}}}

// مقدار 0 تا 255 را وارد کنید تا مقدار رنگ بدست آید.

// رنگها یک انتقال r - g - b - بازگشت به r هستند. uint32_t Wheel (byte WheelPos) {WheelPos = 255 - WheelPos؛ if (WheelPos <85) {strip return. Color (255 - WheelPos * 3 ، 0 ، WheelPos * 3) ؛ } if (WheelPos <170) {WheelPos -= 85؛ نوار بازگشت. رنگ (0 ، WheelPos * 3 ، 255 - WheelPos * 3) ؛ } WheelPos -= 170 ؛ نوار بازگشت. رنگ (WheelPos * 3 ، 255 - WheelPos * 3 ، 0) ؛ }

void Switched () {

strip.show ()؛ readSamples ()؛ }

قبل از اینکه در نظرات ذبح شوم (سیاست Be Nice را بخاطر بسپارید !!) بعد از بارگذاری این قسمت متوجه شدم که برخی از کد های من چقدر شلخته است. نیازی به آزمایش مداوم هر دو پین 4 و پین 8 برای HIGH نیست. از آنجا که سوئیچ دو پرتاب دو قطبی است ، می توان مقدار یکی را از دیگری استنباط کرد: شما فقط باید یکی را آزمایش کنید. بنابراین می توانید هرگونه اشاره ای به خواندن و نوشتن MusicButtonState را حذف کرده و حذف کنید و به سادگی با تست SwirlButtonState ، اگر حافظه کم دارید یا با روالهای دیگر تمدید نمی کنید ، کل کار را با کارآیی بیشتری اجرا کنید. اما کد بالا کار می کند.

و اگر کسی می خواهد این روالهای صوتی را تغییر دهد تا نه تنها سطح نویز بلکه فرکانس را نیز حس کند و یک کد صاف بنویسد تا طیف نور را در پاسخ به حرکت در طول طیف صوتی بالا و پایین کند ، پیوندی را در نظرات بگذارید. تو چطور انجامش دادی.

لذت بردن!

توصیه شده: