Índice:

Luz de festa arco-íris da garrafa de Coca Arduino e Neopixel: 7 etapas (com fotos)
Luz de festa arco-íris da garrafa de Coca Arduino e Neopixel: 7 etapas (com fotos)
Anonim
Image
Image

Então meu filho Doon vê uma luz de festa muito legal feita de garrafas velhas de coca e as entranhas pegajosas de Glow Sticks, e pergunta se podemos fazer uma para seus próximos Exames Escolares Estouram PartAYYY !!! Eu digo que sim, mas você não preferia alguns daqueles anéis de Neopixel Adafruit sofisticados sobre os quais estivemos lendo … Ele me lança um olhar vazio. Porque o fato é que ele não sabe do que estou falando, mas papai viu uma oportunidade de brincar com aqueles anéis de Neopixel sobre os quais ele está lendo, e todos nós sabemos que um dos 10 principais motivos pelos quais pais geeks procriam é ter um desculpa para brincar com aparelhos legais que dizem que todos são para seus filhos.

Este é um projeto super simples que parece realmente ótimo. Construímos o nosso com 3 velhas garrafas de coca-cola, uma placa de madeira e um suporte de coluna de playground - coisas espalhadas no porão - combinadas com um Arduino (Leonardo no nosso caso, mas qualquer placa Genuino serve!) E três anéis de Neopixel. Encomendei um anel de 9 LED, mas acabei com um anel de 12 LED pelo mesmo preço. O que foi legal, mas significou uma reformulação nos orifícios do poço - os anéis de 12 LEDs têm 35 mm de largura, em vez de 23 mm. O que você precisará:

  • Placa Genuino / Arduino (usamos um Leonardo, mas quase qualquer placa serve)
  • 3 anéis de Neopixel (12 LEDs cada): obtenha-os da Adafruit e apoie essas pessoas excelentes
  • 1000 µf 6,3v ou melhor capacitor
  • Resistor de 300-500 ohm
  • Uma placa de madeira, ou um quadrado de sucata, ou qualquer coisa em que você possa colocar os neopixels e colocar as garrafas de coca em cima
  • Alguma forma de montagem para a placa - um suporte de coluna de playground funcionou muito bem para nós
  • Verruga de parede 9v
  • Furador de 40mm
  • Parafusos, porcas, arruelas, espaçadores
  • Fio de núcleo sólido
  • Um ferro de solda e solda
  • Tábua de pão
  • Uma caixa de plástico para o Arduino. Você pode sair e comprar uma caixa de plástico realmente bonita e perfeitamente ajustada feita de petróleo de um milhão de anos perfurado do solo em algum ambiente frágil e fabricado no outro lado do planeta e enviado em um contêiner para um armazém perto de você com todos os portas cortadas em perfeito alinhamento e entregues em sua porta por uma van que expele dióxido de carbono na atmosfera. Ou você pode fazer o que eu fiz e usar uma velha caixa de plástico descartada … neste caso, uma caixa de band-aid de Madagascar jogada no armário de remédios … e fazer alguns furos nela. Aqui termina a palestra. Vamos fazer…

Etapa 1: Faça a Base

Faça a Base
Faça a Base
Faça a Base
Faça a Base

Você pode improvisar sua base com qualquer lixo que tenha em seu porão, ou até mesmo usar uma caixa de madeira ou qualquer coisa que esconda seus eletrônicos.

Primeiro, fizemos três furos, espaçados uniformemente na placa de madeira, grandes o suficiente para os anéis de Neopixel se encaixarem. Na imagem, os furos são poços perfurados com uma broca de espada. No final, devido ao tamanho maior dos anéis de 12 LEDs, tivemos que fazer furos com uma broca. Isso significava percorrer todo o caminho através da placa e, em vez de prender os anéis bem em seus pequenos poços de 2 mm de profundidade finamente trabalhados com um orifício central para uma passagem de fio limpa, acabei prendendo os anéis com … ahem … fita adesiva na parte inferior do prato. Não julgue. Você não pode ver o fundo da placa em meu projeto de qualquer maneira. E está escuro quando está ligado. Além disso - o que há de errado com a fita adesiva?

Eu precisava de espaço entre a placa e o suporte para uma placa de ensaio na parte inferior da placa e um componente - o capacitor, e para os fios que teriam que ir da placa de ensaio ao Arduino, que planejei colocar dentro do suporte. Então, coloquei um conjunto de espaçadores improvisados nos eixos dos parafusos para dar espaço suficiente - cerca de 3 cm, a altura da placa de ensaio e um pouco para que você não esmague a fiação. Usei dois parafusos de ancoragem de madeira por canto porque eram da altura certa e espalhados na gaveta do homem … aquela caixa de parafusos soltos, parafusos, pregos, elos de corrente enferrujados, acoplamentos de mangueiras, moedas velhas, objetos inesperadamente pontiagudos e de todo tipo de bits e bobs que podem magicamente economizar uma ida à loja de ferragens, oferecendo, se não a coisa exata de que você precisa, algo que servirá perfeitamente.

Feliz acidente sobre o poste do playground que encontrei no porão já tinha buracos na placa. Não há necessidade de furar o ferro! A base tinha quatro furos para parafusos, e nós fizemos quatro furos rebaixados na placa de madeira para combinar.

Em seguida, pintamos tudo com spray Gothic Black.

Etapa 2: Preparando os anéis de neopixel

Preparando os anéis de neopixel
Preparando os anéis de neopixel

Você precisará soldar os fios em seus anéis de neopixel: um fio de entrada de dados para todos eles, um fio de saída de dados para dois deles e alimentação e aterramento para cada um. Seja qual for o comprimento que você acha que precisa, adicione um pouco. Você sempre pode cortar o excesso de fio, não pode esticar um que seja muito curto. E fique atento ao aviso da Adafruit:

Ao soldar fios a esses anéis, você precisa estar mais atento a bolhas de solda e curtos-circuitos. O espaçamento entre os componentes é muito pequeno! Muitas vezes, é mais fácil inserir o fio pela frente e soldar na parte de trás.

Eu gostaria de ler isso antes de soldar na frente. Consegui não queimar nenhum dos meus LEDs, mas queimei a borda de um de uma forma que me fez suar até ligá-lo. Além disso, se eu tivesse lido o bom manual, também teria lido o aviso para não colocar uma pinça de crocodilo no LED. Deixe meus quase naufrágios serem o seu farol.

Anéis de Neopixel em cadeia, o que significa que você pode controlar todos os LEDs simultaneamente de um Arduino conectando um fio da saída de um anel à entrada de outro. Cada anel também precisa de fios de alimentação e aterramento.

Etapa 3: a fiação

A fiação
A fiação

Conecte-o como no Fritzing acima - o pino 6 do Arduino leva os dados para o primeiro anel, a saída de dados desse anel vai para a entrada de dados do próximo, a saída de dados daquele vai para o Data-in do último toque. Você não precisa do fio de saída de dados do anel final.

A capacidade de 1000 µf vai entre os trilhos positivos e negativos da placa de ensaio. Esta tampa protege os anéis de picos de energia e é recomendada pela seção de melhores práticas do Adafruit NeoPixel Uberguide. O resistor no Data in para o primeiro neopixel também é recomendado pela Adafruit - é 1K no Fritzing, mas a resistência recomendada é 300-500 ohms.

Na minha construção, passei os fios dos Neopixels na parte de trás da placa até uma placa de ensaio fixada no centro. Dessa forma, você só precisa instalar três fios longos na unidade base: energia, aterramento e dados. Fiz esses fios muito longos - há muito espaço de armazenamento na base e é conveniente poder puxar a placa para reprogramação.

Etapa 4: O Código

"loading =" preguiçoso "mencionou que meu filho queria uma versão musical reativa disso. Demorou até seu 18º aniversário para resolver isso, mas aqui está!

Equipamentos adicionais:

1 Único pólo, interruptor de lance duplo1 Microfone de controle de ganho automático (usei MAX9184 da AdaFruit) 1 capacitor 1uF-100uF (qualquer valor)

O microfone realmente precisa ter Controle Automático de Ganho para funcionar corretamente. O AGC testará constantemente o ruído ambiente e aumentará e diminuirá o limite que considera o plano de fundo, de modo que sua luz responderá a picos contra aquele plano de fundo. O microfone da AdaFruit é brilhante: você pode ir de uma sala silenciosa em que o som de uma única voz o acionará para o modo de festa completo com uma sala cheia de adolescentes e música estridente, e ele vai pegar o ritmo da música apenas multar. A alternativa, um microfone de ganho ajustável, tem um pequeno potenciômetro na placa que é impossivelmente delicado e complicado. Não são necessárias muitas mudanças no som ambiente para tornar a unidade inútil: luzes acesas ou apagadas constantemente. AGC funciona como mágica.

Eu queria a opção de usar o padrão de teste de turbulência ou música, então conectei o fio central de uma chave ao VIN e um fio ao pino 4 e o outro ao pino 8 do Leonardo. Ao testar esses pinos para HIGH ou LOW, podemos saber em qual estado o switch está e desviar o código de acordo.

Etapa 7: conectando o microfone

Fiação do microfone
Fiação do microfone

Alimente a entrada do Mic, por meio desse capacitor de 1-100µF, no Pino Analógico 0. Se o seu capacitor for polarizado, o pino de saída vai para o lado positivo (fio verde).

Obrigado a CodeGirlJP por sua rotina Trinket-Color-by-Sound, que adaptei abaixo:

// LEDs ativados por som com o Arduino e NeoPixels

#incluir

#define MIC_PIN A0 // O microfone está conectado ao pino a0 no Leonardo

# define LED_PIN 6 // fio de LED NeoPixel conectado ao pino 6 no Leonardo # define N_PIXELS 36 // número de pixels no fio de LED !!!!!! Ajuste o número de pixels em sua configuração. Isso é correto para 3 anéis de Neopixel !!!!!! #define N 100 // Número de amostras a tomar cada vez que readSamples é chamado #define fadeDelay 5 // tempo de atraso para cada quantidade de fade #define noiseLevel 30 // nível de declive do ruído médio do microfone sem som

// Inicialize a faixa NeoPixel com os valores definidos acima:

Tira Adafruit_NeoPixel = Adafruit_NeoPixel (N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);

amostras int [N]; // armazenamento para um conjunto de coleta de amostra

int periodFactor = 0; // monitora o número de ms para o cálculo do período int t1 = -1; // tempos de inclinação> 100 detectados. int T; // período entre os tempos escalado para milissegundos int slope; // a inclinação de dois pontos de amostra de dados coletados byte periodChanged = 0; const int SwitchPinMusic = 4; // Pino para a sensibilidade à música da posição da chave const int SwitchPinSwirl = 8; // Pino para a posição da chave Test Pattern (redemoinho) int MusicbuttonState = 0; // Variável lógica desligada para sensibilidade musical

// Método de configuração do Arduino

void setup () {

strip.begin ();

ledsOff (); atraso (500); displayColor (roda (100)); strip.show (); atraso (500); oddWheel (roda (100)); strip.show (); atraso (500); pinMode (SwitchPinMusic, INPUT); pinMode (SwitchPinSwirl, INPUT); // attachInterrupt (4, Switched, FALLING);

}

// Método de loop Arduino

loop vazio () {SwirlbuttonState = digitalRead (SwitchPinSwirl); // HIGH se a chave estiver definida como Sensibilidade da música MusicbuttonState = digitalRead (SwitchPinMusic); // HIGH se a chave for definida para o padrão de teste while (SwirlbuttonState == LOW) {readSamples (); // Executa a rotina de amostragem de música SwirlbuttonState = digitalRead (SwitchPinSwirl); // Verifique se a opção foi alterada} SwirlbuttonState = digitalRead (SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); while (SwirlbuttonState == HIGH) {Dance (); // Executa a rotina de padrão de teste swirly SwirlbuttonState = digitalRead (SwitchPinSwirl); // Verifique se a chave foi alterada

}

}

void Dance () {

while (SwirlbuttonState == HIGH) {colorWipe (strip. Color (255, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (strip. Color (0, 255, 0), 50); // Green SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (strip. Color (0, 0, 255), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); //colorWipe(strip. Color(0, 0, 0, 255), 50); // RGBW branco // Envia uma perseguição de pixel de teatro em… SwirlbuttonState = digitalRead (SwitchPinSwirl); theaterChase (strip. Color (127, 127, 127), 50); // White SwirlbuttonState = digitalRead (SwitchPinSwirl); theaterChase (strip. Color (127, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); theaterChase (strip. Color (0, 0, 127), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); arco-íris (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); rainbowCycle (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); theaterChaseRainbow (50); SwirlbuttonState = digitalRead (SwitchPinSwirl); }} // Ler e processar dados de amostra do microfone void readSamples () {for (int i = 0; i0) {slope = samples - samples [i-1]; } else {declive = amostras - amostras [N-1]; } // Verifique se Slope é maior que noiseLevel - som que não está no nível de ruído detectado if (abs (slope)> noiseLevel) {if (slope <0) {ComputPeriod (i); if (periodChanged == 1) {displayColor (getColor (T)); }}} else {ledsOff (); // theaterChaseRainbow (50); } periodFactor + = 1; atraso (1); }}

void calculPeriod (int i)

{if (t1 == -1) {// t1 não foi definido t1 = i; } else {// t1 foi definido de forma calc period int period = periodFactor * (i - t1); periodChanged = T == período? 0: 1; T = período; //Serial.println(T); // redefine t1 para o novo valor i t1 = i; periodFactor = 0; }}

uint32_t getColor (período interno)

{if (período == -1) return Wheel (0); senão se (período> 400) retornar Roda (5); senão retornar Wheel (map (-1 * período, -400, -1, 50, 255)); }

void fadeOut ()

{para (int i = 0; i <5; i ++) {strip.setBrightness (110 - i * 20); strip.show (); // Atualizar retardo da tira (fadeDelay); periodFactor + = fadeDelay; }}

void fadeIn ()

{strip.setBrightness (100); strip.show (); // Atualizar faixa // cor esmaecida para (int i = 0; i <5; i ++) {//strip.setBrightness(20*i + 30); //strip.show (); // Atualizar retardo da tira (fadeDelay); periodFactor + = fadeDelay; }}

void ledsOff ()

{ desaparecer(); para (int i = 0; i

void displayColor (uint32_t color)

{para (int i = 0; i

void oddWheel (uint32_t color)

{for (int j = 0; j <256; j ++) {// percorrer todas as 256 cores na roda para (int q = 0; q <3; q ++) {for (uint16_t i = 24; i <36; i = i + 3) {strip.setPixelColor (i + q, Wheel ((i + j)% 255)); // liga cada terceiro pixel} strip.show ();

atraso (1);

para (uint16_t i = 24; i <36; i = i + 3) {strip.setPixelColor (i + q, 0); // desliga cada terceiro pixel}}} fadeIn (); }

// Preencha os pontos um após o outro com uma cor

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

void rainbow (uint8_t wait) {

uint16_t i, j;

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

// Ligeiramente diferente, isso torna o arco-íris igualmente distribuído por toda a

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

for (j = 0; j <256 * 5; j ++) {// 5 ciclos de todas as cores na roda para (i = 0; i <strip.numPixels (); i ++) {strip.setPixelColor (i, Wheel (((i * 256 / strip.numPixels ()) + j) & 255)); } strip.show (); atrasar (esperar); }}

// Luzes rastejantes estilo teatro.

void theaterChase (uint32_t c, uint8_t wait) {for (int j = 0; j <10; j ++) {// faça 10 ciclos de perseguição para (int q = 0; q <3; q ++) {for (uint16_t i = 0; i <strip.numPixels (); i = i + 3) {strip.setPixelColor (i + q, c); // liga cada terceiro pixel} strip.show ();

atrasar (esperar);

para (uint16_t i = 0; i <strip.numPixels (); i = i + 3) {strip.setPixelColor (i + q, 0); // desativa cada terceiro pixel}}}}

// Luzes rastejantes estilo teatro com efeito arco-íris

void theaterChaseRainbow (uint8_t wait) {for (int j = 0; j <256; j ++) {// ciclo todas as 256 cores na roda para (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)); // liga cada terceiro pixel} strip.show ();

atrasar (esperar);

para (uint16_t i = 0; i <strip.numPixels (); i = i + 3) {strip.setPixelColor (i + q, 0); // desativa cada terceiro pixel}}}}

// Insira um valor de 0 a 255 para obter um valor de cor.

// As cores são uma transição r - g - b - de volta para r. uint32_t Wheel (byte WheelPos) {WheelPos = 255 - WheelPos; if (WheelPos <85) {return strip. Color (255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos <170) {WheelPos - = 85; return strip. Color (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos - = 170; return strip. Color (WheelPos * 3, 255 - WheelPos * 3, 0); }

void Switched () {

strip.show (); readSamples (); }

Antes de ser abatido nos comentários (lembre-se da política do Be Nice !!), percebi depois de fazer o upload disso como parte do meu código é desleixada. Não há necessidade de testar constantemente os pinos 4 e 8 para ALTO. Como o switch é de lançamento duplo de pólo único, o valor de um pode ser inferido do outro: você só precisa testar um. Portanto, você pode percorrer e remover todas as referências à leitura e gravação do MusicButtonState e simplesmente executar tudo com mais eficiência testando o SwirlButtonState, se estiver com pouca memória ou estendendo com outras rotinas. Mas o código acima funciona.

E se alguém quiser ajustar essas rotinas de áudio para detectar não apenas os níveis de ruído, mas também a frequência, e escrever algum código suave para deslizar para cima e para baixo no espectro de luz em resposta a movimentos ao longo do espectro de áudio, coloque um link nos comentários para como você fez isso.

Aproveitar!

Recomendado: