Spisu treści:

Arduino i Neopixel Coke Bottle Rainbow Party Light: 7 kroków (ze zdjęciami)
Arduino i Neopixel Coke Bottle Rainbow Party Light: 7 kroków (ze zdjęciami)

Wideo: Arduino i Neopixel Coke Bottle Rainbow Party Light: 7 kroków (ze zdjęciami)

Wideo: Arduino i Neopixel Coke Bottle Rainbow Party Light: 7 kroków (ze zdjęciami)
Wideo: Arduino & Neopixel Coke Bottle Party Light 2024, Lipiec
Anonim
Image
Image

Więc mój syn Doon dostrzega bardzo fajną imprezową lampkę zrobioną ze starych butelek po coli i lepkich wnętrzności świecących pałeczek i pyta, czy możemy zrobić jedną na jego nadchodzące egzaminy szkolne Are Over Blowout PartAYYY!!! Mówię pewnie, ale czy nie wolałbyś mieć tych fajnych Neopikselowych Pierścieni Adafruit, o których czytaliśmy… Posyła mi puste spojrzenie. Bo faktem jest, że nie wie, o czym mówię, ale tata zauważył okazję, by bawić się tymi pierścieniami Neopixel, o których czytał, a wszyscy znamy jeden z 10 głównych powodów, dla których tatusiowie geeków rozmnażają się, aby mieć pretekst do zabawy z fajnymi gadżetami, które mówią, że wszyscy są dla swoich dzieci.

To super prosty projekt, który wygląda naprawdę świetnie. Zbudowaliśmy nasze 3 stare butelki po coli, drewniany talerz i wspornik słupka na plac zabaw - rzeczy leżące w piwnicy - w połączeniu z Arduino (w naszym przypadku Leonardo, ale każda płyta Genuino wystarczy!) i trzema pierścieniami Neopixel. Zamówiłem pierścień z 9 diodami, ale skończyło się na pierścieniu 12 diod w tej samej cenie. Co było miłe, ale oznaczało zrezygnowanie z otworów studni - pierścienie z 12 diodami LED mają szerokość 35 mm, w przeciwieństwie do 23 mm. Co będziesz potrzebował:

  • Płyta Genuino/Arduino (użyliśmy Leonardo, ale prawie każda płyta będzie pasować)
  • 3 pierścienie Neopixel (po 12 diod LED): zdobądź je od Adafruit i wspieraj tych dobrych ludzi
  • 1000 µf kondensator 6,3 v lub lepszy
  • Rezystor 300-500 omów
  • Drewniany talerz, kawałek drewna lub cokolwiek, w co można umieścić neopiksele i postawić na wierzchu butelki po coli
  • Jakaś forma mocowania do płyty - wspornik słupka na plac zabaw sprawdził się dla nas świetnie
  • brodawka ścienna 9v
  • wiertło 40mm
  • Śruby, nakrętki, podkładki, przekładki
  • Drut z rdzeniem stałym
  • Lutownica i lut
  • Deska do krojenia chleba
  • Plastikowa obudowa do Arduino. Możesz wyjść i kupić naprawdę ładną, idealnie dopasowaną plastikową skrzynkę wykonaną z milionowej ropy naftowej wydobytej z ziemi w jakimś delikatnym środowisku i wyprodukowanej po drugiej stronie planety i wysłanej w kontenerze do pobliskiego magazynu ze wszystkimi porty są idealnie dopasowane i dostarczane pod drzwi furgonetką wyrzucającą dwutlenek węgla do atmosfery. Albo możesz zrobić to, co ja zrobiłem i użyć starego wyrzuconego plastikowego pudełka… w tym przypadku madagaskarskiego pudełka na bandaże leżącego w apteczce… i wywiercić w nim kilka otworów. Tutaj kończy się wykład. Zróbmy…

Krok 1: Stwórz bazę

Stwórz bazę
Stwórz bazę
Stwórz bazę
Stwórz bazę

Możesz improwizować swoją bazę ze śmieci, które masz we własnej piwnicy, a nawet po prostu użyć drewnianego pudełka lub czegokolwiek, co ukryje twoją elektronikę.

Najpierw wywierciliśmy trzy otwory, równomiernie rozmieszczone na drewnianej płycie, wystarczająco duże, aby mogły się w nich osadzić pierścienie Neopixel. Na zdjęciu są to dołki wywiercone wiertłem łopatkowym. W końcu, ze względu na większy rozmiar pierścieni 12-LED, musieliśmy wywiercić otwory wiertłem wiertniczym. Oznaczało to przejście przez całą płytkę i zamiast ładnie wpasować pierścienie w ich precyzyjnie wykonane małe studzienki o głębokości 2 mm z środkowym otworem na schludny przebieg drutu, ostatecznie zabezpieczyłem pierścienie… hmm… taśmą klejącą na dole płyty. Nie oceniaj. W moim projekcie i tak nie widać spodu płyty. I jest ciemno, kiedy jest włączony. A poza tym -- co jest nie tak z taśmą klejącą?

Potrzebowałem odstępu między płytą a wspornikiem na płytkę stykową na dole płytki i jeden element - kondensator i na biegi przewodów, które musiałyby przejść od płytki stykowej do Arduino, które planowałem umieścić wewnątrz wspornika. Więc umieściłem zestaw prowizorycznych przekładek na wałkach śrub, aby zapewnić wystarczający prześwit - około 3 cm, wysokość płytki stykowej i trochę, aby nie zmiażdżyć okablowania. Użyłem dwóch drewnianych śrub kotwiących w każdym rogu, ponieważ miały odpowiednią wysokość i leżały w męskiej szufladzie… to pudełko z luźnymi śrubami, śrubami, gwoździami, zardzewiałymi ogniwami łańcucha, złączkami do węży, starymi monetami, niespodziewanie ostrymi przedmiotami i wszelkimi innymi bitów i bobów, które w magiczny sposób mogą zaoszczędzić ci podróży do sklepu ze sprzętem, oferując, jeśli nie dokładnie to, czego potrzebujesz, coś, co będzie dobrze.

Szczęśliwym wypadkiem ze słupka zabaw, który znalazłem w piwnicy, było to, że miał już dziury biegnące przez płytę. Nie trzeba wiercić żelaza! Podstawa miała cztery otwory na śruby, a w drewnianej płycie wywierciliśmy cztery otwory z łbem stożkowym.

Następnie pomalowaliśmy sprayem całość Gothic Black.

Krok 2: Przygotowanie pierścieni Neopixel

Przygotowanie pierścieni Neopixel
Przygotowanie pierścieni Neopixel

Będziesz musiał przylutować przewody do pierścieni neopikselowych: przewód wejścia danych dla każdego z nich, przewód wyjścia danych dla dwóch z nich oraz zasilanie i uziemienie dla każdego. Niezależnie od tego, jakiej długości uważasz, że potrzebujesz, dodaj trochę. Zawsze możesz odciąć nadmiar drutu, nie możesz rozciągnąć zbyt krótkiego. I bądź świadomy ostrzeżenia Adafruit:

Podczas lutowania przewodów do tych pierścieni należy zachować szczególną czujność na plamy lutownicze i zwarcia. Odstęp między elementami jest bardzo mały! Często najłatwiej jest włożyć przewód od przodu, a lutować z tyłu.

Chciałbym to przeczytać zanim przylutowałem do przodu. Udało mi się nie przepalić żadnej z moich diod LED, ale przypaliłem krawędź jednej w taki sposób, że pociłem się, dopóki go nie włączyłem. Ponadto, gdybym przeczytał dobrą instrukcję, przeczytałbym również ostrzeżenie, aby nie zakładać zacisku krokodylkowego na diodę LED. Niech moje wraki będą twoją latarnią morską.

Neopixel rings daisy-chain, co oznacza, że możesz sterować wszystkimi diodami LED jednocześnie z Arduino, podłączając przewód z wyjścia OUT jednego pierścienia do wejścia IN drugiego. Każdy pierścień wymaga również przewodów zasilających i uziemiających.

Krok 3: Okablowanie

Okablowanie
Okablowanie

Podłącz go tak, jak w powyższym Fritzing - pin 6 Arduino przenosi dane do pierwszego pierścienia, dane wychodzące z tego pierścienia trafiają do wejścia danych następnego, dane wychodzące z tego pierścienia trafiają do Wejście danych ostatniego dzwonka. Nie potrzebujesz przewodu wyjściowego z ostatniego pierścienia.

Pojemność 1000 µf przechodzi między dodatnią i ujemną szyną płytki stykowej. Ta nasadka chroni pierścienie przed skokami mocy i jest zalecana przez sekcję najlepszych praktyk Adafruit NeoPixel Uberguide. Rezystor na wejściu Data do pierwszego neopiksela jest również zalecany przez Adafruit - to 1K w Fritzing, ale zalecana rezystancja to 300-500 omów.

W mojej konstrukcji poprowadziłem przewody od Neopikseli z tyłu płyty do płytki stykowej zamocowanej pośrodku. W ten sposób do jednostki podstawowej wystarczy poprowadzić trzy długie przewody: zasilanie, uziemienie i dane. Zrobiłem te przewody bardzo długie - w podstawie jest dużo miejsca do przechowywania, co ułatwia wyciągnięcie płytki w celu przeprogramowania.

Krok 4: Kodeks

"loading="leniwy" wspomniał, że mój syn chciał mieć wersję muzyczną tego. Zajęło mu 18. urodziny, aby się do tego zabrać, ale oto jest!

Dodatkowe elementy wyposażenia:

1 jednobiegunowy przełącznik podwójnego rzutu 1 automatyczny mikrofon kontroli wzmocnienia (użyłem MAX9184 firmy AdaFruit) 1 kondensator 1uF-100uF (dowolna wartość)

Mikrofon naprawdę musi mieć automatyczną kontrolę wzmocnienia, aby działał poprawnie. AGC będzie stale próbkować szum otoczenia oraz podnosić i obniżać próg, który bierze pod uwagę jako tło, dzięki czemu światło będzie reagowało na skoki na tym tle. Mikrofon AdaFruit jest genialny: możesz przejść z cichego pokoju, w którym dźwięk jednego głosu uruchomi go, do pełnego trybu imprezy z pokojem pełnym nastolatków i ryczącej muzyki, a on po prostu podbije rytm muzyki cienki. Alternatywa, mikrofon z regulowanym wzmocnieniem, ma maleńki potencjometr na płytce, który jest niewiarygodnie delikatny i nieporęczny. Nie potrzeba wiele zmian w dźwiękach otoczenia, aby urządzenie stało się bezużyteczne: świeci stale lub stale jest ciemno. AGC działa jak magia.

Chciałem mieć możliwość użycia wzorca testowego swirl lub muzyki, więc podłączyłem środkowy przewód przełącznika do VIN i jeden przewód do pinu 4, a drugi do pinu 8 Leonardo. Testując te piny pod kątem WYSOKIEGO lub NISKIEGO, możemy wiedzieć, w jakim stanie znajduje się przełącznik i odpowiednio kod rozgałęzienia.

Krok 7: Podłączanie mikrofonu

Podłączanie mikrofonu
Podłączanie mikrofonu

Wprowadzić wejście mikrofonowe przez ten kondensator 1-100 µF do styku analogowego 0. Jeśli kondensator jest spolaryzowany, styk wyjściowy przechodzi w stronę dodatnią (zielony przewód).

Podziękowania dla CodeGirlJP za jej rutynę Trinket-Color-by-Sound, którą zaadaptowałem poniżej:

// Aktywowane dźwiękiem diody LED z Arduino i NeoPixels

#włączać

#define MIC_PIN A0 // Mikrofon jest podłączony do pinu a0 w Leonardo

#define LED_PIN 6 // Linka NeoPixel LED podłączona do pinu 6 w Leonardo #define N_PIXELS 36 // ilość pikseli w nitce LED !!!!!! Dostosuj do liczby pikseli w konfiguracji. Dotyczy to 3 pierścieni Neopixel !!!!!! #define N 100 // Liczba próbek do pobrania za każdym razem readSamples nazywa się #define fadeDelay 5 // czas opóźnienia dla każdej wielkości zanikania #define noiseLevel 30 // poziom nachylenia średniego szumu mikrofonu bez dźwięku

//Zainicjuj pasek NeoPixel przy użyciu zdefiniowanych powyżej wartości:

Pasek Adafruit_NeoPixel = Adafruit_NeoPixel(N_PIKSELE, LED_PIN, NEO_GRB + NEO_KHZ800);

próbki wewnętrzne[N]; // miejsce na zestaw do pobierania próbek

int współczynnik okresu = 0; // śledź liczbę ms do obliczenia okresu int t1 = -1; // wykryto czasy nachylenia > 100. int T; // okres pomiędzy czasami przeskalowanymi do milisekund int nachylenie; // nachylenie dwóch zebranych punktów próbkowania danych byte periodChanged = 0; const int PrzełączPinMuzyka = 4; // Pin dla pozycji przełącznika czułość na muzykę const int SwitchPinSwirl = 8; // Pin dla pozycji przełącznika Wzorzec testowy (swirl) int MusicbuttonState = 0; // Włącz zmienną logiczną dla czułości muzyki

// Metoda konfiguracji Arduino

pusta konfiguracja () {

strip.początek();

diodyWyłączone(); opóźnienie (500); displayColor (Koło (100)); strip.pokaż(); opóźnienie (500); nieparzyste koło (koło (100)); strip.pokaż(); opóźnienie (500); pinMode(SwitchPinMusic, INPUT); pinMode(SwitchPinSwirl, INPUT); //attachInterrupt(4, Przełączane, Opadające);

}

// Metoda pętli Arduino

void loop() { SwirlbuttonState = digitalRead(SwitchPinSwirl); //HIGH, jeśli przełącznik ustawiony na czułość muzyki MusicbuttonState = digitalRead(SwitchPinMusic); //HIGH jeśli przełącznik jest ustawiony na Wzorzec testowy while (SwirlbuttonState == LOW) { readSamples(); //Uruchom procedurę próbkowania muzyki SwirlbuttonState = digitalRead(SwitchPinSwirl); //Sprawdź, czy przełącznik został zmieniony } SwirlbuttonState = digitalRead(SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); while (SwirlbuttonState == HIGH) { Dance(); //Uruchom swirly procedurę wzorca testowego SwirlbuttonState = digitalRead(SwitchPinSwirl); //Sprawdź, czy przełącznik został zmieniony

}

}

nieważny taniec () {

while (SwirlbuttonState == HIGH) { colorWipe(strip. Color(255, 0, 0), 50); // Czerwony SwirlbuttonState = digitalRead(SwitchPinSwirl); colorWipe(strip. Color(0, 255, 0), 50); // Zielony SwirlbuttonState = digitalRead(SwitchPinSwirl); colorWipe(strip. Color(0, 0, 255), 50); // Niebieski SwirlbuttonState = digitalRead(SwitchPinSwirl); //colorWipe(strip. Color(0, 0, 0, 255), 50); // Biały RGBW // Wyślij chase pikseli teatralnych w… SwirlbuttonState = digitalRead(SwitchPinSwirl); teatrChase(strip. Color(127, 127, 127), 50); // Biały SwirlbuttonState = digitalRead(SwitchPinSwirl); teatrChase(pasek. Kolor(127, 0, 0), 50); // Czerwony SwirlbuttonState = digitalRead(SwitchPinSwirl); teatrChase(pasek. Kolor(0, 0, 127), 50); // Niebieski SwirlbuttonState = digitalRead(SwitchPinSwirl); tęcza(20); SwirlbuttonState = digitalRead (SwitchPinSwirl); cykl tęczy(20); SwirlbuttonState = digitalRead (SwitchPinSwirl); teatr ChaseTęcza(50); SwirlbuttonState = digitalRead (SwitchPinSwirl); } } // Odczytaj i przetwórz przykładowe dane z mikrofonu void readSamples() { for(int i=0; i0) { slope = sample - sample[i-1]; } else { nachylenie = sample - sample[N-1]; } // Sprawdź, czy Slope większe niż noiseLevel - wykryto dźwięk, który nie jest na poziomie szumu if(abs(slope) > noiseLevel) { if(slope < 0) { includePeriod(i); if(okresZmiana == 1) { displayColor(getColor(T)); } } } else { ledsOff(); // teatrChaseRainbow(50); } Współczynnik okresu += 1; opóźnienie(1); } }

void obliczyćOkres(int i)

{ if(t1 == -1) { // t1 nie został ustawiony t1 = i; } else { // t1 został ustawiony tak, że calc period int period = periodFactor*(i - t1); periodChanged = T==okres ? 0:1; T = okres; //Serial.println(T); // zresetuj t1 do nowej wartości i t1 = i; Współczynnikokresu = 0; } }

uint32_t pobierzKolor(okres wewnętrzny)

{ if(okres == -1) return Wheel(0); w przeciwnym razie if(okres > 400) return Wheel(5); w przeciwnym razie return Wheel(map(-1*okres, -400, -1, 50, 255)); }

nieważne zanikanie()

{ for(int i=0; i<5; i++) { strip.setBrightness(110 - i*20); strip.pokaż(); // Zaktualizuj opóźnienie paska(fadeDelay); Współczynnikokresu +=opóźnienie zanikania; } }

nieważne zanikanie()

{ strip.setJasność(100); strip.pokaż(); // Aktualizuj pasek // zanikaj kolor in for(int i=0; i<5; i++) { //strip.setBrightness(20*i + 30); //strip.show(); // Zaktualizuj opóźnienie paska(fadeDelay); Współczynnikokresu+=opóźnienie zaniku; } }

puste diodyWyłączone()

{ zanikanie(); for(int i=0; i

nieważny kolor wyświetlacza (kolor uint32_t)

{ for(int i=0; i

nieważne koło nieparzyste (kolor uint32_t)

{ for (int j=0; j < 256; j++) { // cykl wszystkich 256 kolorów w kole 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)); //włącz co trzeci piksel na } strip.show();

opóźnienie(1);

for (uint16_t i=24; i < 36; i=i+3) { strip.setPixelColor(i+q, 0); //wyłącz co trzeci piksel } } } fadeIn(); }

// Wypełnij kropki jedna po drugiej kolorem

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

void rainbow(uint8_t czekaj) {

uint16_ti, j;

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

// Nieco inaczej, dzięki temu tęcza jest równomiernie rozłożona

void rainbowCycle(uint8_t czekaj) { uint16_t i, j;

for(j=0; j<256*5; j++) { // 5 cykli wszystkich kolorów na kole for(i=0; i< strip.numPixels(); i++) { strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) i 255)); } strip.show(); opóźnienie (czekaj); } }

//Lampki w stylu teatralnym.

void teatrChase(uint32_t c, uint8_t czekaj) { for (int j=0; j<10; j++) { //zrób 10 cykli pogoni za (int q=0; q < 3; q++) { for (uint16_t i= 0;i < strip.numPixels();i=i+3) { strip.setPixelColor(i+q, c); //włącz co trzeci piksel na } strip.show();

opóźnienie (czekaj);

for (uint16_t i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, 0); //wyłącz co trzeci piksel } } } }

//pełzające światła w stylu teatralnym z efektem tęczy

void theaterChaseRainbow(uint8_t wait) { for (int j=0; j < 256; j++) { // cykl wszystkich 256 kolorów w kole 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)); //włącz co trzeci piksel na } strip.show();

opóźnienie (czekaj);

for (uint16_t i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, 0); //wyłącz co trzeci piksel } } } }

// Wprowadź wartość od 0 do 255, aby uzyskać wartość koloru.

// Kolory są przejściem r - g - b - z powrotem do r. uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if(WheelPos < 85) { return strip. Color(255 - WheelPos * 3, 0, WheelPos * 3); } if(PozycjaKół < 170) { PozycjaKół -= 85; powrotna listwa. Kolor(0, Pozycja koła * 3, 255 - Pozycja koła * 3); } Pozycja koła -= 170; return strip. Color(WheelPos * 3, 255 - WheelPos * 3, 0); }

nieważne przełączenie (){

strip.pokaż(); przeczytajPrzykłady(); }

Zanim zostanę zabity w komentarzach (pamiętaj o polityce Be Nice!!), zdałem sobie sprawę po tym, jak wrzuciłem to, jak niechlujny jest mój kod. Nie ma potrzeby ciągłego testowania pinu 4 i pinu 8 pod kątem WYSOKIEGO. Ponieważ przełącznik jest jednobiegunowy, podwójny, wartość jednego można wywnioskować z drugiego: wystarczy przetestować tylko jeden. Możesz więc przejrzeć i usunąć wszelkie odniesienia do odczytu i zapisu MusicButtonState i po prostu uruchomić całość bardziej wydajnie, testując SwirlButtonState, jeśli masz mało pamięci lub rozszerzasz ją o inne procedury. Ale powyższy kod działa.

A jeśli ktoś chce dostosować te procedury audio, aby wyczuć nie tylko poziom hałasu, ale także częstotliwość, i napisać płynny kod, aby przesuwać w górę i w dół widmo światła w odpowiedzi na ruchy wzdłuż widma dźwięku, upuść link w komentarzach do jak to zrobiłeś.

Cieszyć się!

Zalecana: