İçindekiler:

Arduino & Neopixel Kola Şişesi Gökkuşağı Parti Işığı: 7 Adım (Resimlerle)
Arduino & Neopixel Kola Şişesi Gökkuşağı Parti Işığı: 7 Adım (Resimlerle)

Video: Arduino & Neopixel Kola Şişesi Gökkuşağı Parti Işığı: 7 Adım (Resimlerle)

Video: Arduino & Neopixel Kola Şişesi Gökkuşağı Parti Işığı: 7 Adım (Resimlerle)
Video: Arduino Güneş Sistemi Projesi #arduino #shorts 2024, Kasım
Anonim
Image
Image

Bu yüzden oğlum Doon, eski kola şişelerinden ve Glow Sticks'in yapışkan iç parçalarından yapılmış çok havalı bir parti ışığı görüyor ve yaklaşan Okul Sınavları Bitti Üfleme PartAYYY için bir tane yapıp yapamayacağımızı soruyor! Elbette diyorum ama hakkında okuduğumuz o gösterişli Adafruit Neopiksel Halkalarından bazılarını almayı tercih etmez miydin… Bana boş bir bakış attı. Çünkü gerçek şu ki, neden bahsettiğimi bilmiyor, ama babam okuduğu Neopixel halkalarıyla oynama fırsatı buldu ve hepimiz biliyoruz ki inek babaların doğurduğu en önemli 10 nedenden biri bir Herkesin çocukları için olduğunu söyledikleri havalı aletlerle oynamak için bahane.

Bu gerçekten harika görünen süper basit bir proje. Kendimizi 3 eski kola şişesi, ahşap bir plaka ve bir oyun alanı direk braketi - bodrumda yatan şeyler - bir Arduino (bizim durumumuzda Leonardo, ancak herhangi bir Genuino panosu yapacak!) ve üç Neopiksel halka ile birleştirdik.. 9 LED'li bir halka sipariş ettim, ancak aynı fiyata 12 LED'li bir halka aldım. Bu hoştu, ancak kuyu deliklerinde bir değişiklik anlamına geliyordu - 12 LED halkalar 23 mm'nin aksine 35 mm genişliğindedir. Neye ihtiyacınız olacak:

  • Genuino/Arduino kartı (Leonardo kullandık, ancak hemen hemen her tahta yapacak)
  • 3 Neopiksel halka (her biri 12 LED): Onları Adafruit'ten alın ve bu güzel insanları destekleyin
  • 1000 µf 6.3v veya daha iyi kapasitör
  • 300-500 ohm direnç
  • Tahta bir plaka veya bir kare hurda odun veya neopikselleri yerleştirebileceğiniz ve kola şişelerini üstüne oturtabileceğiniz herhangi bir şey
  • Plaka için bir tür montaj - bir oyun alanı direk braketi bizim için harika çalıştı
  • 9v duvar siğil
  • 40 mm delik açıcı
  • Cıvatalar, Somunlar, Pullar, Ara Parçalar
  • Katı çekirdek tel
  • Bir havya ve lehim
  • ekmek tahtası
  • Arduino için plastik bir kasa. Dışarı çıkıp, kırılgan bir ortamda topraktan çıkarılan ve gezegenin diğer tarafında üretilen ve bir konteynır içinde size en yakın bir depoya gönderilen milyon yıllık petrolden yapılmış gerçekten güzel mükemmel oturan plastik kasayı satın alabilirsiniz. limanlar mükemmel bir hizada kesilir ve atmosfere karbondioksit yayan bir minibüs tarafından kapınıza teslim edilir. Ya da benim yaptığımı yapıp eski, atılmış bir plastik kutu kullanabilirsiniz.. bu durumda ecza dolabında duran bir Madagaskar yara bandı kutusu… ve içine birkaç delik açın. Ders burada bitiyor. Hadi yapalım…

Adım 1: Tabanı Yapın

Tabanı Yap
Tabanı Yap
Tabanı Yap
Tabanı Yap

Kendi bodrumunuzda sahip olduğunuz her türlü çöpten üssünüzü doğaçlama yapabilir veya hatta tahta bir kutu veya elektroniklerinizi saklayacak herhangi bir şey kullanabilirsiniz.

İlk önce, ahşap plaka üzerine eşit aralıklarla yerleştirilmiş, Neopixel halkalarının oturması için yeterince büyük üç delik açtık. Resimde delikler, bir kürek matkabı ile açılmış kuyulardır. Sonunda, 12 LED halkaların daha büyük boyutu nedeniyle, matkap ucuyla delikler açmak zorunda kaldık. Bu, plakanın sonuna kadar gitmek anlamına geliyordu ve halkaları düzgün bir kablo geçişi için merkez deliği olan ince hazırlanmış 2 mm derinliğindeki kuyularına güzelce sokmak yerine, halkaları… ahem… plakanın. Yargılama. Zaten tasarımımda plakanın altını göremezsiniz. Ve açıkken karanlık. Ve ayrıca -- koli bandının nesi var?

Plakanın altındaki bir devre tahtası ve bir bileşen - kapasitör ve devre tahtasından desteğin içine yerleştirmeyi planladığım Arduino'ya gitmesi gereken kablolar için plaka ile braket arasında boşluğa ihtiyacım vardı. Bu yüzden, yeterli boşluk sağlamak için cıvata millerine bir dizi geçici ara parçası koydum - yaklaşık 3 cm, devre tahtasının yüksekliği ve kabloları ezmemeniz için biraz. Köşe başına iki ahşap ankraj cıvatası kullandım çünkü bunlar doğru yükseklikteydi ve adam çekmecesinde yatıyordu… o kutu gevşek vidalar, cıvatalar, çiviler, paslı zincir bağlantıları, hortum bağlantıları, eski paralar, beklenmedik şekilde keskin nesneler ve her türlü şey. Tam olarak ihtiyacınız olan şey olmasa da, gayet iyi iş görecek bir şey sunarak sizi hırdavatçıya gitme zahmetinden sihirli bir şekilde kurtarabilecek küçük parçalar.

Bodrumda bulduğum oyun alanı direğiyle ilgili mutlu bir kaza, plakanın zaten içinden geçen delikler olmasıydı. Demir delmeye gerek yok! Tabanda dört cıvata deliği vardı ve buna uygun olarak ahşap plakaya dört gömme delik açtık.

Daha sonra her şeyi Gothic Black spreyle boyadık.

Adım 2: Neopiksel Halkalarını Hazırlama

Neopiksel Halkalarının Hazırlanması
Neopiksel Halkalarının Hazırlanması

Neopiksel halkalarınıza kablo lehimlemeniz gerekecek: hepsi için bir Veri Girişi kablosu, ikisi için bir Veri Çıkışı kablosu ve her biri için güç ve toprak. İhtiyacınız olduğunu düşündüğünüz uzunluk ne olursa olsun, biraz ekleyin. Fazla teli her zaman kesebilirsin, çok kısa olanı uzatamazsın. Adafruit'in uyarısına da dikkat edin:

Telleri bu halkalara lehimlerken, lehim lekeleri ve kısa devreler konusunda ekstra dikkatli olmanız gerekir. Bileşenler arasındaki boşluk çok dar! Kabloyu önden ve lehimi arkadan yerleştirmek genellikle en kolayıdır.

Keşke bunu cepheye lehimlemeden önce okusaydım. LED'lerimden hiçbirini yakmamayı başardım, ancak bir tanesini açana kadar beni terletecek şekilde kenarını yaktım. Ayrıca, ince kılavuzu okumuş olsaydım, LED'e bir timsah klipsi koymama uyarısını da okurdum. Yakınımdaki batıklar senin deniz fenerin olsun.

Neopiksel halkalar papatya zinciri, bu, bir halkanın ÇIKIŞINDAn diğerinin GİRİŞİNE bir kablo bağlayarak tüm LED'lerini aynı anda bir Arduino'dan kontrol edebileceğiniz anlamına gelir. Her halkanın da güç ve topraklama kablolarına ihtiyacı vardır.

Adım 3: Kablolama

Kablolama
Kablolama

Yukarıdaki Fritzing'de olduğu gibi bağlayın - Arduino'nun pim 6'sı verileri ilk halkaya alır, bu halkadan gelen Veri çıkışı, bir sonrakinin Veri girişine gider, bunun Veri çıkışı, Son halkanın veri girişi. Son halkanın veri çıkış kablosuna ihtiyacınız yok.

1000 µf kapasite, breadboard'un pozitif ve negatif rayları arasında gider. Bu kapak, halkaları güç artışlarından korur ve Adafruit NeoPixel Uberguide'ın en iyi uygulama bölümü tarafından önerilir. İlk neopikseldeki Veri üzerindeki direnç Adafruit tarafından da tavsiye edilmektedir -- Fritzing'de 1K'dır ancak önerilen direnç 300-500 ohm'dur.

Yapımda, Neopiksellerden gelen kabloları plakanın arkasından merkeze sabitlenmiş bir devre tahtasına geçirdim. Bu şekilde, ana birime yalnızca üç uzun kablo bağlamanız gerekir: güç, toprak ve veri. Bu kabloları süper uzun yaptım -- tabanda bol miktarda saklama alanı var ve bu, yeniden programlama için kartın dışarı çekilebilmesini kolaylaştırıyor.

Adım 4: Kod

"loading="lazy", oğlumun bunun müziğe duyarlı bir versiyonunu istediğinden bahsetti. Alışması 18. doğum gününe kadar sürdü, ama işte burada!

Ek ekipman parçaları:

1 Tek kutuplu, Çift Yönlü Anahtar1 Otomatik Kazanç Kontrol Mikrofonu (AdaFruit'in MAX9184'ünü kullandım) 1 1uF-100uF kapasitör (Herhangi bir değerde)

Bunun düzgün çalışması için mikrofonun gerçekten Otomatik Kazanç Kontrolüne sahip olması gerekir. AGC sürekli olarak ortam gürültüsünü örnekleyecek ve arka plan olarak kabul ettiği eşiği yükseltip alçaltacaktır, böylece ışığınız bu arka plana karşı ani yükselmelere tepki verecektir. AdaFruit'in mikrofonu harika: Tek bir sesin onu tetikleyeceği sessiz bir odadan, gençlerle dolu ve müziğin çaldığı bir oda dolusu parti moduna geçebilir ve müziğin ritmini anında yakalayabilirsiniz. iyi. Alternatif, Ayarlanabilir Kazanç Mikrofonu, kart üzerinde inanılmaz derecede hassas ve zahmetli olan küçük bir potansiyometreye sahiptir. Üniteyi işe yaramaz hale getirmek için ortam sesinde çok fazla değişiklik gerekmez: ışıklar sürekli yanar veya sürekli karanlık. AGC sihir gibi çalışır.

Girdap testi desenini veya müziği kullanma seçeneğini istedim, bu yüzden bir anahtarın orta ucunu VIN'e ve bir ucu pim 4'e, diğerini de Leonardo'nun pim 8'ine bağladım. Bu pinleri YÜKSEK veya DÜŞÜK için test ederek, anahtarın hangi durumda olduğunu ve buna göre şube kodunu öğrenebiliriz.

7. Adım: Mikrofonu Kablolama

Mikrofonu Bağlama
Mikrofonu Bağlama

Mic girişini bu 1-100µF kapasitör aracılığıyla Analog Pin 0'a besleyin. Kondansatörünüz polarize ise, çıkış pimi pozitif tarafa (Yeşil kablo) gider.

Aşağıda uyarladığım Biblo-Renk-by-Sound rutini için CodeGirlJP'ye teşekkürler:

// Arduino ve NeoPixels ile ses aktif LED'ler

#Dahil etmek

#define MIC_PIN A0 // Leonardo'daki a0 pinine mikrofon takılı

#define LED_PIN 6 // Leonardo'daki pim 6'ya bağlı NeoPixel LED dizisi #define N_PIXELS 36 // LED dizisindeki piksel sayısı !!!!!! Kurulumunuzdaki piksel sayısına ayarlayın. Bu, 3 Neopiksel halka için doğrudur !!!!!! #define N 100 // Her okumada alınacak örnek sayısı Örneklere #define fadeDelay 5 // her sönümleme miktarı için gecikme süresi #define noiseLevel 30 // sessiz ortalama mikrofon gürültüsünün eğim seviyesi

//NeoPixel şeridini yukarıda tanımlanan değerlerle başlatın:

Adafruit_NeoPixel şeridi = Adafruit_NeoPixel(N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);

int örnekler[N]; // bir örnek toplama seti için depolama

int periodFaktörü = 0; // periyot hesaplaması için ms sayısını takip et int t1 = -1; // eğim sayısı > 100 algılandı. int T; // milisaniye olarak ölçeklenen zamanlar arasındaki süre int eğim; // toplanan iki veri örnek noktasının eğimi bayt periodChanged = 0; const int SwitchPinMusic = 4; // Anahtar konumu için pin müzik duyarlılığı const int SwitchPinSwirl = 8; // Anahtar konumu için pin Test Modeli (girdap) int MusicbuttonState = 0; // Müzik duyarlılığı için açık kapalı mantık değişkeni

// Arduino kurulum Yöntemi

geçersiz kurulum() {

strip.begin();

ledlerKapalı(); gecikme(500); displayColor(Tekerlek(100)); şerit.göster(); gecikme(500); tekTekerlek(Tekerlek(100)); şerit.göster(); gecikme(500); pinMode(SwitchPinMusic, INPUT); pinMode(SwitchPinSwirl, INPUT); //attachInterrupt(4, Switched, FALLING);

}

// Arduino döngü Yöntemi

void loop() { SwirlbuttonState = digitalRead(SwitchPinSwirl); //Eğer anahtar Müzik duyarlılığına ayarlanmışsa YÜKSEK MusicbuttonState = digitalRead(SwitchPinMusic); //Eğer anahtar Test deseni olarak ayarlanmışsa YÜKSEK while (SwirlbuttonState == LOW) { readSamples(); //Müzik örnekleme rutinini çalıştırın SwirlbuttonState = digitalRead(SwitchPinSwirl); //Anahtarın değiştirilip değiştirilmediğini kontrol edin } SwirlbuttonState = digitalRead(SwitchPinSwirl); MusicbuttonState = digitalRead(SwitchPinMusic); while (SwirlbuttonState == YÜKSEK) { Dance(); // Girdaplı test deseni rutinini çalıştırın SwirlbuttonState = digitalRead(SwitchPinSwirl); // Anahtarın değiştirilip değiştirilmediğini kontrol edin

}

}

geçersiz Dans() {

while (SwirlbuttonState == YÜKSEK) { colorWipe(strip. Color(255, 0, 0), 50); // Red SwirlbuttonState = digitalRead(SwitchPinSwirl); colorWipe(şerit. Color(0, 255, 0), 50); // Yeşil SwirlbuttonState = digitalRead(SwitchPinSwirl); colorWipe(şerit. Renk(0, 0, 255), 50); // Blue SwirlbuttonState = digitalRead(SwitchPinSwirl); //colorWipe(şerit. Color(0, 0, 0, 255), 50); // Beyaz RGBW // Şuraya bir sinema piksel takibi gönder… SwirlbuttonState = digitalRead(SwitchPinSwirl); tiyatroChase(şerit. Renk(127, 127, 127), 50); // Beyaz SwirlbuttonState = digitalRead(SwitchPinSwirl); tiyatroChase(şerit. Renk(127, 0, 0), 50); // Red SwirlbuttonState = digitalRead(SwitchPinSwirl); tiyatroChase(şerit. Color(0, 0, 127), 50); // Blue SwirlbuttonState = digitalRead(SwitchPinSwirl); gökkuşağı(20); SwirlbuttonState = digitalRead(SwitchPinSwirl); gökkuşağı Döngüsü(20); SwirlbuttonState = digitalRead(SwitchPinSwirl); tiyatroChaseRainbow(50); SwirlbuttonState = digitalRead(SwitchPinSwirl); } } // Mikrofondan Örnek Verileri Okuyun ve İşleyin void readSamples() { for(int i=0; i0) { eğim = örnekler - örnekler[i-1]; } başka { eğim = örnekler - örnekler[N-1]; } // Slope'nin noiseLevel'den büyük olup olmadığını kontrol edin - gürültü seviyesinde olmayan ses tespit edildi if(abs(slope) > noiseLevel) { if(slope < 0) { hesapPeriod(i); if(periodChanged == 1) { displayColor(getColor(T)); } } } başka { ledsOff(); // theatreChaseRainbow(50); } periodFaktörü += 1; gecikme(1); } }

geçersiz hesaplamaPeriod(int i)

{ if(t1 == -1) { // t1 ayarlanmadı t1 = i; } else { // t1 hesap periyodu int period = periodFactor*(i - t1); periodChanged = T==dönem ? 0: 1; T = dönem; //Seri.println(T); // t1'i yeni i değerine sıfırla t1 = i; periodFaktörü = 0; } }

uint32_t getColor(int nokta)

{ if(periyot == -1) return Wheel(0); else if(dönem > 400) return Wheel(5); else return Wheel(harita(-1*period, -400, -1, 50, 255); }

geçersiz fadeOut()

{ for(int i=0; i<5; i++) { strip.setBrightness(110 - i*20); şerit.göster(); // Şerit gecikmesini güncelle(fadeDelay); periodFactor +=fadeDelay; } }

geçersiz fadeIn()

{ strip.setBrightness(100); şerit.göster(); // Stripi güncelle // rengi soldur for(int i=0; i<5; i++) { //strip.setBrightness(20*i + 30); //şerit.göster(); // Şerit gecikmesini güncelle(fadeDelay); periodFactor+=fadeDelay; } }

geçersiz led'lerKapalı()

{ fadeOut(); for(int i=0; ben

geçersiz displayColor(uint32_t color)

{ for(int i=0; ben

geçersiz garipTekerlek(uint32_t rengi)

{ for (int j=0; j < 256; j++) { // çarktaki 256 rengin hepsini çevir for (int q=0; q < 3; q++) { for (uint16_t i=24; i < 36; i =i+3) { strip.setPixelColor(i+q, Wheel((i+j) % 255)); //her üçüncü pikseli } strip.show();

gecikme(1);

for (uint16_t i=24; i < 36; i=i+3) { strip.setPixelColor(i+q, 0); // her üçüncü pikseli kapat } } } fadeIn(); }

// Noktaları arka arkaya bir renkle doldurun

void colorWipe(uint32_t c, uint8_t bekle) { for(uint16_t i=0; i

void gökkuşağı(uint8_t bekleyin) {

uint16_t ben, j;

for(j=0; j<256; j++) { for(i=0; i

// Biraz farklı, bu gökkuşağının her yere eşit dağılmasını sağlar

void RainbowCycle(uint8_t bekle) { uint16_t i, j;

for(j=0; j<256*5; j++) { // çarktaki tüm renklerin 5 döngüsü for(i=0; i< strip.numPixels(); i++) { strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255); } şerit.göster(); gecikme(bekle); } }

//Tiyatro tarzı gezici ışıklar.

void TheaterChase(uint32_t c, uint8_t wait) { for (int j=0; j<10; j++) { //10 döngü takip for (int q=0; q < 3; q++) { for (uint16_t i=) 0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, c); //her üç pikselden birini çevir } strip.show();

gecikme(bekle);

for (uint16_t i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, 0); // her üçüncü pikseli kapat } } } }

//Gökkuşağı efektli tiyatro tarzı sürünen ışıklar

void TheaterChaseRainbow(uint8_t wait) { for (int j=0; j < 256; j++) { // çarktaki 256 rengin hepsini döndürün for (int q=0; q < 3; q++) { for (uint16_t i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, Wheel((i+j) % 255); //her üçüncü pikseli } strip.show();

gecikme(bekle);

for (uint16_t i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, 0); // her üçüncü pikseli kapat } } } }

// Bir renk değeri elde etmek için 0 ile 255 arasında bir değer girin.

// Renkler r - g - b - r'ye bir geçiştir. uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if(WheelPos < 85) { dönüş şeridi. Color(255 - WheelPos * 3, 0, WheelPos * 3); } if(WheelPos < 170) { WheelPos -= 85; dönüş şeridi. Renk(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; dönüş şeridi. Renk(WheelPos * 3, 255 - WheelPos * 3, 0); }

geçersiz Anahtarlı(){

şerit.göster(); örnek okuma(); }

Yorumlarda katledilmeden önce (İyi Ol politikasını hatırlayın!!) Bunu yükledikten sonra bazı kodlarımın ne kadar özensiz olduğunu fark ettim. Hem Pin 4'ü hem de Pin 8'i HIGH için sürekli olarak test etmeye gerek yoktur. Anahtar Tek kutuplu çift atış olduğundan birinin değeri diğerinden çıkarılabilir: sadece birini test etmeniz yeterlidir. Böylece, MusicButtonState'i okumak ve yazmak için yapılan her referansı gözden geçirebilir ve kaldırabilir ve hafızanız düşükse veya diğer rutinlerle genişletme yapıyorsanız SwirlButtonState'i test ederek her şeyi daha verimli bir şekilde çalıştırabilirsiniz. Ama yukarıdaki kod çalışıyor.

Ve herhangi biri bu ses rutinlerini sadece gürültü seviyelerini değil aynı zamanda frekansı da algılamak ve ses spektrumu boyunca hareketlere yanıt olarak ışık spektrumunu yukarı ve aşağı kaydırmak için düzgün bir kod yazmak için değiştirmek isterse, yorumlara bir bağlantı bırakın. bunu nasıl yaptın.

Eğlence!

Önerilen: