Mündəricat:
- Addım 1: Baza yaradın
- Addım 2: Neopixel Üzüklərin Hazırlanması
- Addım 3: Kablolama
- Addım 4: Kod
- Addım 7: Mikrofonu bağlayın
Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 addım (şəkillərlə)
2024 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2024-01-30 07:43
Odur ki, oğlum Doon, köhnə koka şüşələrindən və Glow Sticks -in ağılsız içlərindən hazırlanan çox sərin bir partiya işığı görür və qarşıdan gələn Məktəb İmtahanları üçün PartAYYY bitdiyinə dair soruşa bilərikmi? Əminəm, amma oxuduğumuz Adafruit Neopixel Üzüklərindən bəzilərinə sahib olmaq istəməzdiniz … Mənə boş bir baxış verir. Çünki danışdığımı bilmir, amma atam oxuduğu Neopixel üzüklərlə oynamaq imkanı tapdı və hamımız inək babaların törətdiyi ən yaxşı 10 səbəbdən birini bilirik. Hər kəsin uşaqları üçün olduğunu söylədikləri sərin gadjetlərlə oynamaq üçün bəhanə.
Bu, həqiqətən əla görünən super sadə bir layihədir. Özümüzdən 3 köhnə koka şüşəsi, taxta boşqab və oyun meydançası dirəyindən - zirzəmidə yatan əşyalar - Arduino (bizim vəziyyətimizdə Leonardo, amma hər hansı bir Genuino taxtası edəcək!) Və üç Neopixel üzükdən tikdik.. 9 LEDli üzük sifariş etdim, amma eyni qiymətə 12 LED üzüklə başa çatdı. Hansı şirin idi, amma quyuların deşilməsini nəzərdə tuturdu-12 LED halqaların eni 35 mm, əksinə 23 mm-dir. Nə lazımdır:
- Genuino/Arduino lövhəsi (Leonardodan istifadə etdik, amma demək olar ki, hər hansı bir lövhə belə edəcək)
- 3 Neopixel üzük (hər biri 12 LED): Adafruit -dən alın və bu gözəl insanları dəstəkləyin
- 1000 µf 6.3v və ya daha yaxşı kondansatör
- 300-500 ohm müqavimət
- Taxta bir boşqab və ya bir kvadrat qırıntı və ya neopikselləri yerləşdirə biləcəyiniz bir şey və kok şüşələrini üstünə qoyun
- Plitə üçün bir növ montaj - oyun meydançası dirəyi bizim üçün əla işləyirdi
- 9v divar siğili
- 40 mm delik açan
- Boltlar, Fındıq, Yuyucular, Aralıqlar
- Qatı nüvəli tel
- Bir lehimləmə dəmiri və lehim
- Çörək lövhəsi
- Arduino üçün plastik qutu. Çölə çıxa bilərsiniz və bəzi kövrək mühitlərdə yerdən qazılmış və planetin o biri tərəfində istehsal edilən və bir konteynerdə yaxınlığınızdakı bir anbara göndərilən milyon illik neftdən hazırlanmış mükəmməl uyğun plastik qutu ala bilərsiniz. Limanlar mükəmməl uyğunlaşdırılmış şəkildə kəsilmiş və atmosferə karbon qazı tökən mikroavtobusla qapınıza çatdırılmalıdır. Ya da mənim etdiyimi edə bilərsən və köhnə atılmış bir plastik qutudan istifadə edə bilərsən.. bu halda dərman kabinetində uzanan Madaqaskar bant yardım qutusu… və içərisində bir neçə deşik aç. Burada mühazirə bitir. ETMƏK…
Addım 1: Baza yaradın
Öz zirzəminizdə olan hər hansı bir tullantıdan bazanızı doğaçlama edə bilərsiniz və ya hətta taxta bir qutu və ya elektronikanı gizlədəcək bir şey istifadə edə bilərsiniz.
Əvvəlcə taxta lövhədə bərabər şəkildə yerləşdirilmiş, Neopixel halqalarının oturması üçün kifayət qədər böyük olan üç deşik qazdıq. Şəkildə dəliklər matça ilə qazılan quyulardır. Sonda, 12 LED halqaların ölçüsü daha böyük olduğuna görə, bir delik açan deliklər qazmaq məcburiyyətində qaldıq. Bu, lövhənin hər tərəfinə keçmək demək idi və üzükləri səliqəli bir tel çəkmə üçün mərkəz çuxuru olan incə hazırlanmış kiçik 2 mm dərinliyindəki quyulara gözəl bir şəkildə bağlamaq əvəzinə, üzükləri bərkitməklə bitirdim… boşqabın. Mühakimə etməyin. Mənim dizaynımdakı boşqabın altını onsuz da görə bilməzsiniz. Və açıq olduqda qaranlıqdır. Və bundan başqa - yapışan bantda nə problem var?
Plitənin altındakı bir çörək taxtası və bir komponent - kondansatör və mötərizənin içərisinə qoymağı planlaşdırdığım çörək taxtasından Arduinoya keçməli olan tel xətləri üçün boşqabla mötərizə arasında boşluq lazım idi. Mən kifayət qədər boşluq təmin etmək üçün bolt şaftlarına bir sıra müvəqqəti boşluqlar qoydum - təxminən 3 sm, çörək taxtasının hündürlüyü və bir az da telləri əzməyin. Hər küncdə iki taxta ankraj cıvatası istifadə etdim, çünki onlar doğru hündürlükdə idi və kişi çekmecesinde yatırdı … boş qutu vintlər, boltlar, dırnaqlar, paslı zəncirbəndlər, hortum muftaları, köhnə sikkələr, gözlənilmədən iti əşyalar və hər cür ehtiyac duyduğunuz şey deyilsə, gözəl bir şey təklif edərək, hardware mağazasına səyahətinizi sehrli bir şəkildə xilas edə biləcək bitlər və boblar.
Zirzəmidə tapdığım oyun meydançası postu ilə əlaqədar xoşbəxt bir qəza, artıq boşqabdan keçən deliklər idi. Dəmir qazmağa ehtiyac yoxdur! Baza dörd bolt deşiyinə malik idi və biz taxta lövhədə uyğunlaşmaq üçün əks-batmış dörd delik açdıq.
Sonra hər şeyi Gothic Black ilə boyadıq.
Addım 2: Neopixel Üzüklərin Hazırlanması
Telləri neopixel halqalarınıza lehimləməlisiniz: hamısı üçün bir Məlumat Giriş teli, ikisi üçün Məlumat Çıxış teli və hər biri üçün güc və torpaq. Lazım olduğunu düşündüyünüz uzunluqda bir az əlavə edin. Həmişə artıq teli kəsə bilərsiniz, çox qısa olanı uzada bilməzsiniz. Adafruit -in xəbərdarlığından xəbərdar olun:
Telləri bu üzüklərə lehimləyərkən, lehim qabarcıqları və qısa dövrələr mövzusunda çox diqqətli olmalısınız. Komponentlər arasındakı məsafə çox sıxdır! Telin öndən və lehimdən arxaya daxil edilməsi çox vaxt ən asandır.
Kaş cəbhəyə lehimləməzdən əvvəl oxusaydım. LED -lərimin heç birini yandıra bilmədim, amma yandırıb açana qədər tərləməyim üçün bir kənarını yandırdım. İncə təlimatı oxusaydım, LED -ə timsah klipi qoymamaq barədə xəbərdarlığı da oxuyardım. Qoy yaxınlıqdakı gəmi qəzalarım sizin fənəriniz olsun.
Neopixel, papatya zənciri halqalarıdır, bu da bir LED-in bir halqasının Çıxışından digərinin IN girişinə bir tel bağlayaraq bütün Arduino-dan eyni vaxtda idarə edə biləcəyiniz deməkdir. Hər bir üzük də gücə və torpaq tellərinə ehtiyac duyur.
Addım 3: Kablolama
Yuxarıdakı Fritzing-də olduğu kimi bağlayın-Arduino'nun 6-cı pin məlumatları ilk halqaya aparır, bu halqadan verilənlər digərinin məlumatlarına, digərinin çıxışı isə Son halqanın məlumatı. Son halqanın məlumat ötürmə telinə ehtiyacınız yoxdur.
1000 µf tutumu çörək bişirmə panelinin müsbət və mənfi rayı arasında gedir. Bu qapaq üzükləri güc sıçrayışlarından qoruyur və Adafruit NeoPixel Uberguide-in ən yaxşı təcrübə bölməsi tərəfindən tövsiyə olunur. İlk neopikseldəki Data rezistoru da Adafruit tərəfindən tövsiyə olunur-Fritzing-də 1K, lakin tövsiyə olunan müqavimət 300-500 ohmdur.
Quruluşumda, Neopikseldən gələn telləri boşqabın arxasından mərkəzdə sabitlənmiş bir çörək taxtasına çəkdim. Bu yolla yalnız üç uzun teli əsas qurğuya daxil etməlisiniz: güc, torpaq və məlumat. Bu telləri çox uzun etdim-bazada çoxlu saxlama yeri var və yenidən proqramlaşdırma üçün lövhəni çıxarmağı rahat edir.
Addım 4: Kod
"loading =" tənbəl "oğlumun bunun musiqiyə reaktiv bir versiyasını istədiyini qeyd etdi. 18-ci doğum gününə qədər bu mövzuya yaxınlaşdı, amma buradadır!
Əlavə avadanlıqlar:
1 Tək Qütb, Cüt Atma Şalteri 1 Avtomatik Qazanc İdarəetmə Mikrofonu (AdaFruit MAX9184 istifadə etdim) 1 1uF-100uF kondansatör (İstənilən dəyər)
Bunun düzgün işləməsi üçün mikrofonun Avtomatik Qazanma İdarəçiliyi olmalıdır. AGC ətraf mühitin səs -küyünü daim nümunə götürəcək və fon hesab etdiyi eşikləri qaldıracaq və aşağı salacaq, buna görə də işığınız bu fonda sıçrayışlara cavab verəcək. AdaFruit-in mikrofonu möhtəşəmdir: tək səsin səsinin onu tetikleyeceği səssiz bir otaqdan, yeniyetmələr və musiqi səsləri ilə dolu bir otaqla tam əyləncə rejiminə keçə bilərsiniz və yalnız musiqinin ritmini alacaq. yaxşı Alternativ, Ayarlanabilir Gain Mic, lövhədə inanılmaz dərəcədə incə və qüsursuz bir kiçik potansiyometrə malikdir. Cihazı yararsız hala salmaq üçün ətraf mühitin səsi çox dəyişmir: işıqlar daim yanır və ya qaranlıqdır. AGC sehr kimi işləyir.
Döngə test nümunəsi və ya musiqidən istifadə etmə seçimini istədim, buna görə də VIN -ə, bir ucunu 4 -ə, digərini Leonardonun 8 -ci pininə bağladım. Bu sancaqları HIGH və ya LOW üçün sınayaraq, keçidin hansı vəziyyətdə olduğunu və buna uyğun olaraq filial kodunu bilə bilərik.
Addım 7: Mikrofonu bağlayın
Mikrofon girişini 1-100µF kondansatör vasitəsilə Analog Pin 0-a daxil edin. Kondansatörünüz qütbləşirsə, çıxış pimi müsbət tərəfə keçir (Yaşıl tel).
Aşağıda uyğunlaşdırdığım Trinket-Color-by-Sound rutini üçün CodeGirlJP sayəsində:
// Arduino və NeoPixels ilə səs aktivləşdirilmiş LEDlər
#daxil edin
#define MIC_PIN A0 // Mikrofon Leonardonun a0 pininə ilişib
#define LED_PIN 6 // Leonardo'nun 6 pininə bərkidilmiş NeoPixel LED şeridi #define N_PIXELS 36 // LED telindəki piksellərin sayı !!!!!! Quruluşunuzdakı piksel sayına uyğunlaşdırın. Bu 3 Neopixel üzük üçün doğrudur !!!!!! #define N 100 // Hər dəfə oxunduğu zaman götürüləcək nümunələrin sayı Nümunələrə #definefadeDelay 5 // hər solma miqdarı üçün gecikmə müddəti #deine səs -küySəviyyə 30 // səssiz orta mikrofon səs -küyünün meyl səviyyəsi
// NeoPixel zolağını yuxarıda göstərilən dəyərlərlə başladın:
Adafruit_NeoPixel şeridi = Adafruit_NeoPixel (N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);
int nümunələri [N]; // nümunə toplama dəsti üçün saxlama
int periodFactor = 0; // dövrün hesablanması üçün ms sayını izləyin int t1 = -1; // 100 yamac zamanı aşkarlandı. int T; // millisekundlara qədər yamacda ölçülən vaxtlar arasındakı dövr; // iki toplanmış məlumat nümunəsinin yamacı bayt periodChanged = 0; const int SwitchPinMusic = 4; // Switch mövqeyi üçün musiqi həssaslığı const int SwitchPinSwirl = 8; // Keçid mövqeyi üçün pin Test Nümunəsi (girdab) int MusicbuttonState = 0; // Musiqi həssaslığı üçün açıq məntiq dəyişənidir
// Arduino quraşdırma metodu
boş quraşdırma () {
strip.begin ();
ledsOff (); gecikmə (500); displayColor (Təkər (100)); strip.show (); gecikmə (500); tək təkər (Təkər (100)); strip.show (); gecikmə (500); pinMode (SwitchPinMusic, GİRİŞ); pinMode (SwitchPinSwirl, GİRİŞ); // attachInterrupt (4, Açıq, Düşən);
}
// Arduino loop metodu
void loop () {SwirlbuttonState = digitalRead (SwitchPinSwirl); // keçid Musiqi həssaslığı olaraq təyin edilərsə YÜKSƏK MusicbuttonState = digitalRead (SwitchPinMusic); // YÜKSƏK, əgər keçid Test nümunəsinə təyin edilərkən (SwirlbuttonState == LOW) {readSamples (); // SwirlbuttonState = digitalRead (SwitchPinSwirl); // Keçidin dəyişdirilib dəyişdirilmədiyini yoxlayın} SwirlbuttonState = digitalRead (SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); while (SwirlbuttonState == HIGH) {Dance (); // SwirlbuttonState = digitalRead (SwitchPinSwirl); // Şalterin dəyişdirilib dəyişdirilmədiyini yoxlayın
}
}
boş rəqs () {
while (SwirlbuttonState == HIGH) {colorWipe (strip. Color (255, 0, 0), 50); // Qırmızı SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (zolaq Rəng (0, 255, 0), 50); // Yaşıl SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (zolaq Rəng (0, 0, 255), 50); // Mavi SwirlbuttonState = digitalRead (SwitchPinSwirl); //colorWipe (şerit. Color(0, 0, 0, 255), 50); // Ağ RGBW // Teatrın piksel təqibini göndərin… SwirlbuttonState = digitalRead (SwitchPinSwirl); teatrChase (zolaq. Rəng (127, 127, 127), 50); // White SwirlbuttonState = digitalRead (SwitchPinSwirl); teatrChase (zolaq. Rəng (127, 0, 0), 50); // Qırmızı SwirlbuttonState = digitalRead (SwitchPinSwirl); teatrChase (zolaq. Rəng (0, 0, 127), 50); // Mavi SwirlbuttonState = digitalRead (SwitchPinSwirl); göy qurşağı (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); göy qurşağı dövrü (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); teatrChaseRainbow (50); SwirlbuttonState = digitalRead (SwitchPinSwirl); }} // Mikrofondan Nümunə Veriləri Oxuyun və İşləyin void readSamples () {for (int i = 0; i0) {eğim = nümunələr - nümunələr [i -1]; } başqa {yamac = nümunələr - nümunələr [N -1]; } // Yamacın noiseLevel -dən böyük olub olmadığını yoxlayın - (abs (yamac)> səs -küy səviyyəsi) {if (yamac <0) {hesablayınPeriod (i); if (periodChanged == 1) {displayColor (getColor (T)); }}} başqa {ledsOff (); // teatrChaseRainbow (50); } periodFactor += 1; gecikmə (1); }}
etibarsız hesablama müddəti (int i)
{if (t1 == -1) {// t1 təyin edilməmişdir t1 = i; } başqa {// t1 təyin olunduğu üçün hesablama dövrü int period = periodFactor*(i - t1); periodChanged = T == dövr? 0: 1; T = dövr; //Serial.println(T); // t1 -i yeni i dəyərinə qaytar t1 = i; periodFactor = 0; }}
uint32_t getColor (int dövrü)
{if (period == -1) return Wheel (0); başqa halda (dövr> 400) Təkər (5) qaytarılırsa; başqa qayıt Təkər (xəritə (-1*dövr, -400, -1, 50, 255)); }
void fadeOut ()
{for (int i = 0; i <5; i ++) {strip.setBrightness (110 - i*20); strip.show (); // Zolaq gecikməsini yeniləyin (fadeDelay); periodFactor += fadeDelay; }}
void fadeIn ()
{strip.setBrightness (100); strip.show (); // Zolağı yeniləyin // solğun rəng (for i = 0; i <5; i ++) {//strip.setBrightness(20*i+30); //strip.show (); // Zolaq gecikməsini yeniləyin (fadeDelay); periodFactor+= fadeDelay; }}
void ledsOff ()
{ solmaq(); üçün (int i = 0; i
void displayColor (uint32_t rəngli)
{üçün (int i = 0; i
boş tək təkər (uint32_t rəng)
{for (int j = 0; j <256; j ++) {// təkərdəki 256 rəngin hamısını (int q = 0; q <3; q ++) {for (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, Təkər ((i+j) % 255)); // hər üçüncü pikseli yandırın} strip.show ();
gecikmə (1);
for (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, 0); // hər üçüncü pikseli söndür}}} fadeIn (); }
// Nöqtələri bir -birinin ardınca rənglə doldurun
void colorWipe (uint32_t c, uint8_t gözləyin) {for (uint16_t i = 0; i
boş göy qurşağı (uint8_t gözləyin) {
uint16_t i, j;
üçün (j = 0; j <256; j ++) {üçün (i = 0; i
// Bir az fərqlidir, bu göy qurşağını hər tərəfə bərabər paylayır
boş göy qurşağı dövrü (uint8_t gözləyin) {uint16_t i, j;
for (j = 0; j <256*5; j ++) {// (i = 0; i <strip.numPixels (); i ++) {strip.setPixelColor (i, Wheel (((i * 256 / strip.numPixels ()) + j) & 255)); } strip.show (); gecikmə (gözləmək); }}
// Teatr tərzi sürünən işıqlar.
void teatrChase (uint32_t c, uint8_t gözləyin) {for (int j = 0; j <10; j ++) {// (int q = 0; q <3; q ++) {üçün (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, c); // hər üçüncü pikseli yandırın} strip.show ();
gecikmə (gözləmək);
for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // hər üçüncü pikseli söndürün}}}}
// Göy qurşağı effektli teatr tərzi sürünən işıqlar
void teatrChaseRainbow (uint8_t wait) {for (int j = 0; j <256; j ++) {// (int q = 0; q <3; q ++) {üçün (int j = 0; j <256; j ++) {// təkərdəki 256 rəngin hamısını döndərin (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, Təkər ((i+j) % 255))); // hər üçüncü pikseli yandırın} strip.show ();
gecikmə (gözləmək);
for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // hər üçüncü pikseli söndürün}}}}
// Rəng dəyəri əldə etmək üçün 0 -dan 255 -ə qədər bir dəyər daxil edin.
// Rənglər r - g - b - r -yə qayıdışdır. uint32_t Təkər (bayt WheelPos) {WheelPos = 255 - WheelPos; if (WheelPos <85) {qayıtma zolağı. Color (255 - WheelPos * 3, 0, WheelPos * 3); } əgər (WheelPos <170) {WheelPos -= 85; geri zolaq. Color (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; geri zolaq. Color (WheelPos * 3, 255 - WheelPos * 3, 0); }
boş keçid () {
strip.show (); readSamples (); }
Şərhlərdə öldürülməzdən əvvəl (Nice olmağı unutmayın!) Bunu yüklədikdən sonra başa düşdüm ki, kodumun bir hissəsi nə qədər səliqəsizdir. Həm Pin 4, həm də Pin 8 -i YÜKSEK olaraq sınamağa ehtiyac yoxdur. Keçid tək qütblü ikiqat atma olduğundan birinin dəyərini digərindən çıxarmaq olar: yalnız birini sınamaq lazımdır. Beləliklə, MusicButtonState -in oxunması və yazılması ilə bağlı bütün istinadları keçə və silə bilərsiniz və əgər yaddaşınız azdırsa və ya digər rutinlərlə uzanırsınızsa, SwirlButtonState -i sınayaraq hər şeyi daha səmərəli işlədə bilərsiniz. Ancaq yuxarıdakı kod işləyir.
Və kimsə bu səs prosedurlarını təkcə səs -küy səviyyəsini deyil, həm də tezliyi hiss etmək üçün düzəltmək və səs spektri boyunca hərəkətlərə cavab olaraq işıq spektrini yuxarı və aşağı sürüşdürmək üçün hamar bir kod yazmaq istəyirsə, şərhlərdə bir link buraxın. bunu nece etdin.
Zövq alın!
Tövsiyə:
FuseLight: Studio/Party Light daxil Old/Fused Tubelight: 3 Addım (Şəkillərlə)
FuseLight: köhnə/əridilmiş tüp işığını studiyaya/partiya işığına çevirin: burada bir neçə əsas alət, rgb işıqları və 3d çapdan istifadə edərək əridilmiş tüp işığını Studio/hissə işığına çevirdim
ROTARY CNC BOTTLE PLOTTER: 9 Addım (Şəkillərlə birlikdə)
ROTARY CNC BOTTLE PLOTTER: Yəqin ki, printerdə istifadə olunan bəzi silindirləri götürdüm. Onları CNC şüşə qurucusunun fırlanma oxuna çevirmək fikrinə gəldim. Bu gün bu silindrlərdən və digər qırıntılardan CNC şüşə çəkicinin necə qurulacağını paylaşmaq istərdim
Viski və Coke RFID Kilid Qutusu: 9 Addım (Şəkillərlə birlikdə)
Viski və Coke RFID Kilid Qutusu: Bu Təlimat sizə tam 3D çaplı " Viski və Koka " RFID kilid qutusu
Animasiya Mood Light & Night Light: 6 Addım (Şəkillərlə)
Animasiya Mood İşıq və Gecə İşığı: İşıqla vəsvəsə ilə məhdudlaşan bir cazibəyə sahib olaraq, hər hansı bir ölçüdə RGB işıqlı ekranlar yaratmaq üçün istifadə edilə bilən kiçik modul PCB -lərdən ibarət bir seçim yaratmağa qərar verdim. Modul PCB hazırladıqdan sonra onları bir yerə yığmaq fikrinə düşdüm
Neopixel Light Up Maple Syrup Şüşə Lampası: 4 Addım (Şəkillərlə birlikdə)
Neopixel Light Up Maple Syrup Şüşə Lampası: Masaüstündəki özünəməxsus bir sinifdə. Yol kənarındakı yeməkxanaların neon nişanlarından və Neopixel Akan Su Musluğu Lampasından ilham alın. NAFTA yenidən müzakirə edilməzdən əvvəl heç olmasa 100% Kanada şərbəti olan təzə bir şüşə alın