Tabla de contenido:

Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 pasos (con imágenes)
Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 pasos (con imágenes)

Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 pasos (con imágenes)

Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 pasos (con imágenes)
Video: Arduino & Neopixel Coke Bottle Party Light 2024, Diciembre
Anonim
Image
Image

Así que mi hijo Doon ve una lámpara de fiesta genial hecha de botellas de coca-cola viejas y las entrañas pegajosas de Glow Sticks, y pregunta si podemos hacer una para su próxima fiesta de exámenes escolares ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ Digo que sí, pero ¿no preferirías tener algunos de esos elegantes anillos de Adafruit Neopixel sobre los que hemos estado leyendo…? Me lanza una mirada en blanco. Porque el hecho es que él no sabe de lo que estoy hablando, pero papá ha visto la oportunidad de jugar con esos anillos de Neopixel sobre los que ha estado leyendo, y todos sabemos que una de las 10 razones principales por las que los papás geek procrean es tener un excusa para jugar con artilugios geniales que dicen que todos son para sus hijos.

Este es un proyecto súper simple que se ve realmente genial. Construimos el nuestro con 3 botellas de coca-cola viejas, una placa de madera y un soporte para poste de juegos, cosas que están en el sótano, combinadas con un Arduino (Leonardo en nuestro caso, ¡pero cualquier tablero Genuino servirá!) Y tres anillos Neopixel.. Pedí un anillo de 9 LED, pero terminé con un anillo de 12 LED por el mismo precio. Lo cual fue agradable, pero significó una repetición en los orificios del pozo: los anillos de 12 LED tienen 35 mm de ancho, en lugar de 23 mm. Lo que necesitarás:

  • Placa Genuino / Arduino (Usamos un Leonardo, pero casi cualquier placa servirá)
  • 3 anillos de Neopixel (12 LED cada uno): consígalos de Adafruit y apoye a esas buenas personas
  • Condensador de 1000 µf 6.3v o mejor
  • Resistencia de 300-500 ohmios
  • Un plato de madera, o un cuadrado de madera de desecho, o cualquier cosa en la que puedas colocar los neopíxeles y colocar las botellas de cocaína encima.
  • Algún tipo de soporte para la placa: un soporte para poste de juegos funcionó muy bien para nosotros
  • Verruga de pared 9v
  • Taladro de 40 mm
  • Pernos, tuercas, arandelas, espaciadores
  • Alambre de núcleo sólido
  • Un soldador y una soldadura.
  • Tablero de circuitos
  • Un estuche de plástico para Arduino. Puede salir y comprar una caja de plástico realmente bonita que se ajusta perfectamente hecha de petróleo de un millón de años extraído del suelo en un entorno frágil y fabricado en el otro lado del planeta y enviado en un contenedor a un almacén cerca de usted con todos los los puertos se cortan en perfecta alineación y lo entregan en su puerta una camioneta que arroja dióxido de carbono a la atmósfera. O puedes hacer lo que yo hice y usar una vieja caja de plástico desechada … en este caso, una caja de curitas de Madagascar que está en el botiquín … y perforar algunos agujeros en ella. Aquí termina la conferencia. Hagamos…

Paso 1: haz la base

Haz la base
Haz la base
Haz la base
Haz la base

Puedes improvisar tu base con cualquier basura que tengas en tu propio sótano, o incluso usar una caja de madera o cualquier cosa que esconda tus dispositivos electrónicos.

Primero perforamos tres agujeros, espaciados uniformemente en la placa de madera, lo suficientemente grandes para que los anillos de Neopixel se asentaran. En la imagen, los agujeros son pozos perforados con un taladro de pala. Al final, debido al tamaño más grande de los anillos de 12 LED, tuvimos que perforar agujeros con una broca. Esto significó atravesar todo el plato, y en lugar de ajustar los anillos muy bien en sus pequeños pozos de 2 mm de profundidad finamente elaborados con un orificio central para un tendido de cable limpio, terminé asegurando los anillos con … ejem … cinta adhesiva en la parte inferior del plato. No juzgues. De todos modos, no puedes ver la parte inferior de la placa en mi diseño. Y está oscuro cuando está encendido. Y además, ¿qué pasa con la cinta adhesiva?

Necesitaba espacio entre la placa y el soporte para una placa en la parte inferior de la placa y un componente: el condensador, y para los tramos de cables que tendrían que ir de la placa a Arduino, que planeaba colocar dentro del soporte. Así que coloqué un juego de espaciadores improvisados en los ejes de los pernos para dejar suficiente espacio, aproximadamente 3 cm, la altura de la placa de pruebas y un poco para que no aplaste el cableado. Usé dos pernos de anclaje de madera por esquina porque tenían la altura correcta y estaban en el cajón del hombre … esa caja de tornillos sueltos, pernos, clavos, eslabones de cadena oxidados, acoplamientos de manguera, monedas viejas, objetos inesperadamente afilados y todo tipo de cosas. de bits y bobs que mágicamente pueden ahorrarle un viaje a la ferretería al ofrecer, si no exactamente lo que necesita, algo que funcionará bien.

Feliz accidente sobre el poste del patio de recreo que encontré en el sótano era que ya tenía agujeros atravesando la placa. ¡No es necesario taladrar hierro! La base tenía cuatro orificios para pernos, y perforamos cuatro orificios avellanados en la placa de madera para que coincidieran.

Luego pintamos con spray todo el conjunto Gothic Black.

Paso 2: preparación de los anillos de Neopixel

Preparación de los anillos de Neopixel
Preparación de los anillos de Neopixel

Necesitará soldar cables en sus anillos de neopixel: un cable de entrada de datos para todos ellos, un cable de salida de datos para dos de ellos y alimentación y tierra para cada uno. Independientemente de la longitud que crea que necesita, agregue un poco. Siempre puede cortar el exceso de cable, no puede estirar uno que sea demasiado corto. Y tenga en cuenta la advertencia de Adafruit:

Al soldar cables a estos anillos, debe estar muy atento a las manchas de soldadura y los cortocircuitos. ¡El espacio entre los componentes es muy estrecho! A menudo, es más fácil insertar el cable desde el frente y soldarlo en la parte posterior.

Ojalá leyera eso antes de soldar al frente. Me las arreglé para no quemar ninguno de mis LED, pero quemé el borde de uno de una manera que me hizo sudar hasta que lo encendí. Además, si hubiera leído el excelente manual, también habría leído la advertencia de no poner una pinza de cocodrilo en el LED. Deja que mis casi naufragios sean tu faro.

Neopixel suena en cadena, lo que significa que puede controlar todos sus LED simultáneamente desde un Arduino conectando un cable desde la SALIDA de un anillo a la ENTRADA de otro. Cada anillo también necesita cables de alimentación y de tierra.

Paso 3: el cableado

El cableado
El cableado

Conéctelo como en el Fritzing anterior: el pin 6 del Arduino lleva los datos al primer anillo, la salida de datos de ese anillo va a la entrada de datos del siguiente, la salida de datos de ese va a la Entrada de datos del último anillo. No necesita el cable de salida de datos del anillo final.

La capacidad de 1000 µf va entre los rieles positivo y negativo de la placa de pruebas. Esta gorra protege los anillos de los picos de energía y es recomendada por la sección de mejores prácticas de Adafruit NeoPixel Uberguide. Adafruit también recomienda la resistencia en el Data en el primer neopixel: es 1K en el Fritzing, pero la resistencia recomendada es de 300-500 ohmios.

En mi construcción, pasé los cables de los Neopixels a través de la parte posterior de la placa a una placa de pruebas fijada en el centro. De esa manera, solo tiene que pasar tres cables largos hasta la unidad base: energía, tierra y datos. Hice estos cables muy largos: hay mucho espacio de almacenamiento en la base y hace que sea conveniente poder sacar la placa para reprogramarla.

Paso 4: el código

"loading =" lazy "mencionó que mi hijo quería una versión de esto que reaccionara con la música. Le tomó hasta su cumpleaños número 18 para hacerlo, ¡pero aquí está!

Equipos adicionales:

1 interruptor de un solo polo y doble tiro 1 micrófono de control automático de ganancia (utilicé el MAX9184 de AdaFruit) 1 condensador de 1 uF-100 uF (cualquier valor)

El micrófono realmente tiene que tener control automático de ganancia para que esto funcione correctamente. AGC muestreará constantemente el ruido ambiental y aumentará y disminuirá el umbral que considera el fondo, por lo que su luz responderá a los picos contra ese fondo. El micrófono de AdaFruit es brillante: puede pasar de una habitación silenciosa en la que el sonido de una sola voz lo activará al modo de fiesta completo con una habitación llena de adolescentes y música a todo volumen, y captará el ritmo de la música simplemente multa. La alternativa, un micrófono de ganancia ajustable, tiene un pequeño potenciómetro en el tablero que es increíblemente delicado y complicado. No se necesitan muchos cambios en el sonido ambiental para inutilizar la unidad: las luces se encienden constantemente o se apagan constantemente. AGC funciona como por arte de magia.

Quería la opción de usar el patrón de prueba de remolino o la música, así que conecté el cable central de un interruptor al VIN y un cable al pin 4 y el otro al pin 8 del Leonardo. Al probar esos pines para ALTO o BAJO, podemos saber en qué estado se encuentra el interruptor y el código de sucursal en consecuencia.

Paso 7: cableado del micrófono

Cableado del micrófono
Cableado del micrófono

Alimente la entrada de micrófono, a través de ese capacitor de 1-100µF, en el pin analógico 0. Si su capacitor está polarizado, el pin de salida va al lado positivo (cable verde).

Gracias a CodeGirlJP por su rutina Trinket-Color-by-Sound, que adapté a continuación:

// LEDs activados por sonido con Arduino y NeoPixels

#incluir

#define MIC_PIN A0 // El micrófono está conectado al pin a0 del Leonardo

#define LED_PIN 6 // Línea de LED NeoPixel adjunta al pin 6 en el Leonardo #define N_PIXELS 36 // ¡¡¡Número de píxeles en la cadena de LED !!!!!! Ajústelo al número de píxeles de su configuración. Esto es correcto para 3 anillos de Neopixel !!!!!! #define N 100 // Número de muestras a tomar cada vez que readSamples se llama #define fadeDelay 5 // tiempo de retardo para cada cantidad de fade #define noiseLevel 30 // nivel de pendiente del ruido de micrófono promedio sin sonido

// Inicializa la tira de NeoPixel con los valores definidos arriba:

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

int muestras [N]; // almacenamiento para un juego de recolección de muestras

int periodFactor = 0; // realizar un seguimiento del número de ms para el cálculo del período int t1 = -1; // tiempos de pendiente> 100 detectados. int T; // período entre tiempos escalado a milisegundos int pendiente; // la pendiente de dos puntos de muestra de datos recopilados byte periodChanged = 0; const int SwitchPinMusic = 4; // Pin para la posición del interruptor sensibilidad musical const int SwitchPinSwirl = 8; // Pin para la posición del interruptor Patrón de prueba (remolino) int MusicbuttonState = 0; // Variable lógica on off para sensibilidad musical

// Método de configuración de Arduino

configuración vacía () {

strip.begin ();

ledsOff (); retraso (500); displayColor (Rueda (100)); strip.show (); retraso (500); oddWheel (Rueda (100)); strip.show (); retraso (500); pinMode (SwitchPinMusic, ENTRADA); pinMode (SwitchPinSwirl, ENTRADA); // attachInterrupt (4, Switched, FALLING);

}

// Método de bucle de Arduino

bucle vacío () {SwirlbuttonState = digitalRead (SwitchPinSwirl); // ALTO si el interruptor está configurado en Sensibilidad musical MusicbuttonState = digitalRead (SwitchPinMusic); // ALTO si el interruptor está configurado en Patrón de prueba while (SwirlbuttonState == LOW) {readSamples (); // Ejecuta la rutina de muestreo de música SwirlbuttonState = digitalRead (SwitchPinSwirl); // Compruebe si se cambió el interruptor} SwirlbuttonState = digitalRead (SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); while (SwirlbuttonState == HIGH) {Dance (); // Ejecuta la rutina de patrón de prueba swirly SwirlbuttonState = digitalRead (SwitchPinSwirl); // Verifica si se cambió el interruptor

}

}

void Dance () {

while (SwirlbuttonState == HIGH) {colorWipe (strip. Color (255, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (tira. Color (0, 255, 0), 50); // Green SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (tira. Color (0, 0, 255), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); //colorWipe(strip. Color(0, 0, 0, 255), 50); // White RGBW // Envía una persecución de píxeles de teatro en… SwirlbuttonState = digitalRead (SwitchPinSwirl); theatreChase (tira. Color (127, 127, 127), 50); // White SwirlbuttonState = digitalRead (SwitchPinSwirl); theatreChase (tira. Color (127, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); theatreChase (tira. Color (0, 0, 127), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); arco iris (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); rainbowCycle (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); theaterChaseRainbow (50); SwirlbuttonState = digitalRead (SwitchPinSwirl); }} // Leer y procesar datos de muestra del micrófono void readSamples () {for (int i = 0; i0) {pendiente = samples - samples [i-1]; } else {pendiente = muestras - muestras [N-1]; } // Compruebe si la pendiente es mayor que el nivel de ruido - sonido que no está en el nivel de ruido detectado if (abs (pendiente)> noiseLevel) {if (pendiente <0) {calculatePeriod (i); if (periodChanged == 1) {displayColor (getColor (T)); }}} else {ledsOff (); // theatreChaseRainbow (50); } periodFactor + = 1; retraso (1); }}

void calculatePeriod (int i)

{if (t1 == -1) {// t1 no se ha establecido t1 = i; } else {// t1 se estableció de modo que calc period int period = periodFactor * (i - t1); periodChanged = T == período? 0: 1; T = período; //Serial.println(T); // restablece t1 al nuevo valor de i t1 = i; periodFactor = 0; }}

uint32_t getColor (período int)

{if (período == -1) return Wheel (0); else if (período> 400) return Wheel (5); else return Wheel (mapa (-1 * período, -400, -1, 50, 255)); }

vacío fadeOut ()

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

vacío fadeIn ()

{strip.setBrightness (100); strip.show (); // Actualizar la tira // fundir el color para (int i = 0; i <5; i ++) {//strip.setBrightness(20*i + 30); //strip.show (); // Actualizar el retardo de la tira (fadeDelay); periodFactor + = fadeDelay; }}

ledsOff vacío ()

{fadeOut (); 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 ++) {// cicla los 256 colores de la rueda 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)); // activa cada tercer píxel} strip.show ();

retraso (1);

para (uint16_t i = 24; i <36; i = i + 3) {strip.setPixelColor (i + q, 0); // apaga cada tercer píxel}}} fadeIn (); }

// Rellena los puntos uno tras otro con un color

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

arco iris vacío (uint8_t espera) {

uint16_t i, j;

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

// Ligeramente diferente, esto hace que el arco iris se distribuya por igual en todo

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

for (j = 0; j <256 * 5; j ++) {// 5 ciclos de todos los colores en la rueda para (i = 0; i <strip.numPixels (); i ++) {strip.setPixelColor (i, Wheel (((i * 256 / strip.numPixels ()) + j) y 255)); } strip.show (); retrasar (esperar); }}

// Luces de arrastre estilo teatro.

void theaterChase (uint32_t c, uint8_t espera) {for (int j = 0; j <10; j ++) {// haz 10 ciclos de persecución for (int q = 0; q <3; q ++) {for (uint16_t i = 0; i <strip.numPixels (); i = i + 3) {strip.setPixelColor (i + q, c); // activa cada tercer píxel} strip.show ();

retrasar (esperar);

para (uint16_t i = 0; i <strip.numPixels (); i = i + 3) {strip.setPixelColor (i + q, 0); // apagar cada tercer píxel}}}}

// Luces que se arrastran al estilo de un teatro con efecto arcoíris

void theaterChaseRainbow (uint8_t espera) {for (int j = 0; j <256; j ++) {// cicla los 256 colores en la rueda 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)); // activa cada tercer píxel} strip.show ();

retrasar (esperar);

para (uint16_t i = 0; i <strip.numPixels (); i = i + 3) {strip.setPixelColor (i + q, 0); // apagar cada tercer píxel}}}}

// Ingrese un valor de 0 a 255 para obtener un valor de color.

// Los colores son una transición r - g - b - de regreso a r. uint32_t Wheel (byte WheelPos) {WheelPos = 255 - WheelPos; if (WheelPos <85) {return strip. Color (255 - WheelPos * 3, 0, WheelPos * 3); } si (WheelPos <170) {WheelPos - = 85; return strip. Color (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos - = 170; return strip. Color (WheelPos * 3, 255 - WheelPos * 3, 0); }

vacío Cambiado () {

strip.show (); readSamples (); }

Antes de que me mataran en los comentarios (¡recuerde la política de Be Nice!), Me di cuenta, después de subir esto, de lo descuidado que es parte de mi código. No es necesario probar constantemente tanto el Pin 4 como el Pin 8 para ALTO. Como el interruptor es monopolar de doble tiro, el valor de uno se puede inferir del otro: solo necesita probar uno. Por lo tanto, puede revisar y eliminar todas las referencias a la lectura y escritura de MusicButtonState y simplemente ejecutar todo de manera más eficiente probando SwirlButtonState, si tiene poca memoria o amplía con otras rutinas. Pero el código anterior funciona.

Y si alguien quiere modificar esas rutinas de audio para detectar no solo los niveles de ruido sino también la frecuencia, y escribir un código suave para deslizarse hacia arriba y hacia abajo en el espectro de luz en respuesta a los movimientos a lo largo del espectro de audio, coloque un enlace en los comentarios para como lo hiciste.

¡Disfrutar!

Recomendado: