Tabla de contenido:

Sombrero LED de lujo: 5 pasos (con imágenes)
Sombrero LED de lujo: 5 pasos (con imágenes)

Video: Sombrero LED de lujo: 5 pasos (con imágenes)

Video: Sombrero LED de lujo: 5 pasos (con imágenes)
Video: Quien ganará?🤔 2024, Noviembre
Anonim
Image
Image
Sombrero LED de lujo
Sombrero LED de lujo

Siempre quise hacer un proyecto de Arduino, pero nunca tuve grandes ideas para uno hasta que invitaron a mi familia a una elegante fiesta de sombreros. Con dos semanas de tiempo de espera, tenía curiosidad por saber si podía planificar y ejecutar un sombrero de animación LED sensible al movimiento. ¡Resulta que podría! Probablemente me excedí un poco, pero el proyecto total costó alrededor de $ 80. Con experimentación y algo de codificación, podría hacerlo por menos.

El gol con el sombrero fue el siguiente:

  1. Haga que un juego de luces se mueva desde el centro del frente del sombrero hacia la parte posterior, una luz a cada lado
  2. Cambia la velocidad del viaje de la luz dictada por la inclinación del sombrero de adelante hacia atrás.
  3. Permita que las luces se inviertan cuando la banda del sombrero esté inclinada hacia abajo (es decir, emule el efecto de la gravedad en las luces)
  4. Cambiar el color según la inclinación del sombrero de izquierda a derecha
  5. Detecta las conmociones y muestra un efecto especial
  6. Sienta al usuario girando y muestre un efecto especial
  7. Tenerlo completamente contenido en el sombrero.

Paso 1: Piezas necesarias

Piezas necesarias
Piezas necesarias
Piezas necesarias
Piezas necesarias
Piezas necesarias
Piezas necesarias

Usé los siguientes componentes principales (se incluyen enlaces de Amazon no afiliados):

  • Microcontrolador Teensy LC: lo elegí en lugar de un Arduino normal debido a su pequeño tamaño y tiene una conexión especial para controlar mis LED, así como un fuerte apoyo de la biblioteca y la comunidad.
  • Sensor de posición basado en Bosch BNO055: sinceramente, uno de los primeros en los que encontré documentación. Hay opciones mucho menos costosas, sin embargo, una vez que descubre el Bosch, hace mucho por usted que de otro modo tendría que hacer en el código.
  • Tira de LED direccionable WS2812: elegí una longitud de 1 metro con 144 LED por metro. Tener esa densidad ayuda a que la luz parezca más en movimiento, en lugar de elementos individuales iluminándose en secuencia.

Y los siguientes componentes menores:

  • Un sombrero: cualquier sombrero con una cinta para el sombrero servirá. Este es un sombrero de $ 6 de una tienda local. Si tiene una costura en la parte posterior, será más fácil pasar el cableado. Preste atención a si la banda del sombrero está pegada, ya que eso también causará alguna dificultad adicional. Este está cosido a lo largo de la parte superior, pero la parte inferior se levanta fácilmente.
  • Resistencias de 4.7K ohmios
  • Caja de 3 pilas AAA: el uso de 3 pilas AAA genera un voltaje exactamente en el rango que desean los dispositivos electrónicos, lo que simplifica las cosas. AAA cabe en un sombrero más fácilmente que AA y aún tiene un gran tiempo de ejecución.
  • Cable de calibre pequeño: utilicé un cable sólido que tenía de un proyecto LED anterior.
  • Soldador y soldadura
  • Un poco de licra que combine con el color interior del sombrero e hilo.

Sugerido, pero opcional:

  • Conectores rápidos para los cables de la batería
  • Herramienta Helping Hands, estas cosas son muy pequeñas y difíciles de soldar.

Paso 2: modifica el sombrero

Modificar el sombrero
Modificar el sombrero
Modificar el sombrero
Modificar el sombrero
Modificar el sombrero
Modificar el sombrero
Modificar el sombrero
Modificar el sombrero

Necesitará un lugar en el sombrero para montar los componentes electrónicos y un lugar para la batería. Mi esposa trabaja profesionalmente con la ropa, así que le pedí consejo y ayuda. Terminamos creando dos bolsillos con elastano. El primer bolsillo más pequeño hacia el frente tiene la punta del sombrero en sí, de modo que cuando se instalan los componentes electrónicos, el sensor de posición se mantiene en su lugar bastante bien, pero se puede quitar fácilmente si es necesario. El segundo bolsillo hacia la parte posterior sirve para sujetar la batería en su lugar.

Los bolsillos se sembraron con hilo a juego con el color del sombrero, todo lo largo de la línea de la corona. Dependiendo del estilo de sombrero y materiales se fabrica en YMMV con esta técnica.

También descubrimos que la banda del sombrero se metía dentro de un lado y estaba completamente cosida al sombrero en ese lugar. Tuvimos que quitar la costura original para colocar los LED debajo de la banda. Durante la construcción, se mantuvo en su lugar con alfileres y luego se cosió con hilo a juego cuando se completó.

Finalmente abrimos la costura en la parte de atrás del sombrero donde está cubierta por la banda. Metimos el mazo de cables que venía con los LED a través de esa costura y alineamos el primer LED en la tira para que quede justo en la costura. Luego envolvimos los LED alrededor del sombrero y cortamos la tira para que el último LED quede justo al lado del primero. La tira de LED se puede mantener en su lugar solo con la banda del sombrero, sin embargo, dependiendo de su banda y material, es posible que deba asegurar los LED cosiendo o pegando.

Paso 3: Conéctelo

Conéctelo
Conéctelo

La placa Teensy y los LED funcionarán con una potencia de 3.3v a 5v. Es por eso que elegí usar 3 baterías AAA, el voltaje de salida de 4.5v está bien en ese rango, y tienen mucho tiempo de ejecución para la forma en que he programado el funcionamiento de los LED. Debería poder obtener más de 8 horas de tiempo de ejecución.

Cableado de la energía

Conecté los cables positivo y negativo de la caja de la batería y los LED juntos, luego los soldé al Teensy en los lugares apropiados. El positivo de la batería debe conectarse al pin superior derecho del Teensy en el diagrama (etiquetado como Vin en la placa), y el negativo se puede conectar a cualquier pin etiquetado como GND. Convenientemente, hay uno directamente en el lado opuesto del tablero, o justo al lado del pin Vin. El diagrama completo de distribución de pines de la placa se puede encontrar en la parte inferior de esta página. Y en algunos casos se incluye una copia en papel cuando pides la pizarra.

Si planea ejecutar un código que solo tiene unos pocos LED encendidos a la vez, puede encender los LED desde el Teensy en sí, utilizando una salida de 3.3v y GND, sin embargo, si intenta extraer demasiada energía, puede dañar el tablero. Entonces, para tener la mayor cantidad de opciones, es mejor conectar los LED a la fuente de la batería directamente.

Cableado de los LED

Elegí el Teensy LC para este proyecto porque tiene un pin que hace que sea mucho más fácil conectar los LED direccionables. En la parte inferior del tablero, el pin que es el segundo desde el izquierdo refleja el Pin # 17, pero también tiene 3.3v. Esto se conoce como pull-up, y en otras placas tendría que conectar una resistencia para proporcionar ese voltaje. En el caso del Teensy LC, puede simplemente conectar desde ese pin directamente al cable de datos de los LED.

Cableado del sensor de posición

Algunas de las placas BNO055 disponibles son mucho más estrictas en cuanto a voltaje y solo quieren 3.3v. Debido a esto, conecté el Vin en la placa BNO055 desde la salida dedicada de 3.3v en el Teensy, que es el tercer pin a la derecha. Luego puede conectar el GND en el BNO055 a cualquier GND en el Teensy.

El sensor de posición BNO055 usa I2c para hablar con Teensy. I2c requiere pull-ups, así que conecté dos resistencias de 4.7K ohmios desde una salida de 3.3v en el Teensy a los pines 18 y 19. Luego conecté el pin 19 al pin SCL en la placa BNO055 y el 18 al pin SDA.

Consejos / trucos de cableado

Para hacer este proyecto utilicé alambre macizo en lugar de trenzado. Una ventaja del cable sólido es que se suelda en prototipos de placas como estas. Puede pelar un poco de cable, doblarlo a 90 grados e insertarlo a través de la parte inferior de uno de los terminales, de modo que el extremo cortado del cable sobresalga por encima de la placa. Luego, solo necesita una pequeña cantidad de soldadura para sujetarlo al terminal, y puede cortar el exceso fácilmente.

Puede resultar más difícil trabajar con el alambre macizo, ya que tiende a querer permanecer como está doblado. Sin embargo, para este proyecto eso fue una ventaja. Corté y di forma a mis cables de tal manera que la orientación del sensor de posición fuera consistente mientras insertaba y quitaba la electrónica del sombrero para ajustar y programar.

Paso 4: programación

Ahora que todo está ensamblado, necesitará una herramienta de programación compatible con Arduino. Usé el IDE de Arduino real (funciona con Linux, Mac y PC). También necesitará el software Teensyduino para interactuar con la placa Teensy. Este proyecto utiliza en gran medida la biblioteca FastLED para realizar la programación de color y posición de los LED.

Calibrando

Lo primero que querrá hacer es ir al excelente repositorio de GitHub de Kris Winer para el BNO055 y descargar su boceto BNO_055_Nano_Basic_AHRS_t3.ino. Instale ese código con el Monitor serial en ejecución y le dirá si la placa BNO055 se conecta correctamente y pasa sus autopruebas. También lo guiará a través de la calibración del BNO055, lo que le dará resultados más consistentes más adelante.

Comenzando con el boceto Fancy LED

El código para el sombrero Fancy LED está específicamente adjunto, y también en mi repositorio de GitHub. Planeo hacer más ajustes al código y esos se publicarán en el repositorio de GitHub. El archivo aquí refleja el código cuando se publicó este Instructable. Después de descargar y abrir el boceto, hay algunas cosas que deberá cambiar. La mayoría de los valores importantes para cambiar están en la parte superior como declaraciones #define:

Línea 24: #define NUM_LEDS 89 - cambie esto al número real de LED en su tira de LED

Línea 28: #define SERIAL_DEBUG falso - probablemente querrá hacer esto verdadero, para que pueda ver la salida en el monitor serial

Código de detección de posición

La detección de posición y la mayoría de sus ajustes comienzan en la línea 742 y pasan por 802. Obtenemos datos de Pitch, Roll y Yaw del sensor de posición y los usamos para establecer valores. Dependiendo de cómo estén montados sus componentes electrónicos, es posible que deba cambiarlos. Si monta el sensor de posición con el chip hacia la parte superior del sombrero y la flecha junto a la X impresa en el tablero apuntando hacia el frente del sombrero, debería ver lo siguiente:

  • Pitch asiente con la cabeza
  • Roll es inclinar la cabeza, p. Ej. toca tu oreja a tu hombro
  • El guiñada es en qué dirección. está orientado (norte, oeste, etc.).

Si su placa está montada en una orientación diferente, deberá intercambiar Pitch / Roll / Yaw para que se comporten como le gustaría.

Para ajustar la configuración de Rollo, puede cambiar los siguientes valores #define:

  • ROLLOFFSET: con su sombrero estable y tan centrado como sea posible, si el Roll no es 0, cambie esto por la diferencia. Es decir. Si ves Roll a -20 cuando tu sombrero está centrado, haz este 20.
  • ROLLMAX: el valor máximo a utilizar para la medición de rollo. Es más fácil de encontrar usando el sombrero y moviendo la oreja derecha hacia el hombro derecho. Necesitará un cable USB largo para hacer esto mientras usa el monitor en serie.
  • ROLLMIN: el valor más bajo para usar para la medición de rollo, para cuando inclinas la cabeza hacia la izquierda

Del mismo modo, para Pitch:

  • MAXPITCH: el valor máximo cuando mira hacia arriba
  • MINPITCH: el valor mínimo cuando mira hacia abajo
  • PITCHCENTER: el valor de tono cuando mira hacia adelante

Si establece SERIALDEBUG en verdadero en la parte superior del archivo, debería ver los valores actuales para la salida Roll / Pitch / Yaw en el monitor en serie para ayudar a modificar estos valores.

Otros parámetros que puede querer cambiar

  • MAX_LED_DELAY 35: lo más lento que puede moverse la partícula LED. Esto es en milisegundos. Es el retraso de pasar de un LED al siguiente en la cadena.
  • MIN_LED_DELAY 10 - el ayuno que la partícula LED puede moverse. Como arriba, está en milisegundos.

Conclusión

Si has llegado hasta aquí, ¡deberías tener un sombrero LED divertido y en pleno funcionamiento! Si desea hacer más con él, la página siguiente tiene información avanzada sobre cómo cambiar la configuración y hacer sus propias cosas. así como una explicación de lo que está haciendo el resto de mi código.

Paso 5: avanzado y opcional: dentro del código

Detección de impacto y giro

La detección de impacto / giro se realiza utilizando las funciones del sensor de alta G del BNO055. Puede modificar su sensibilidad con las siguientes líneas en initBNO055 ():

  • Línea # 316: BNO055_ACC_HG_DURATION - cuánto tiempo debe durar el evento
  • Línea # 317: BNO055_ACC_HG_THRESH - qué tan duro debe ser el impacto
  • Línea # 319: BNO055_GYR_HR_Z_SET - umbral de velocidad de rotación
  • Línea # 320: BNO055_GYR_DUR_Z - cuánto tiempo debe durar la rotación

Ambos valores son binarios de 8 bits, actualmente el impacto se establece en B11000000, que es 192 de 255.

Cuando se detecta un impacto o un giro, el BNO055 establece un valor que el código busca justo al comienzo del bucle:

// Detecta cualquier interrupción activada, es decir, debido a un byte G alto intStatus = readByte (BNO055_ADDRESS, BNO055_INT_STATUS); if (intStatus> 8) {impacto (); } else if (intStatus> 0) {spin (); }

Busque la línea void impact () arriba en el código para cambiar el comportamiento en el impacto, o void spin () para cambiar el comportamiento de giro.

Ayudantes

He creado una función auxiliar simple (void setAllLeds ()) para configurar rápidamente todos los LED en un solo color. Uno lo usa para apagarlos a todos:

setAllLeds (CRGB:: Negro);

O puede elegir cualquier color reconocido por la biblioteca FastLED:

setAllLeds (CRGB:: Red);

También hay una función fadeAllLeds () que atenuará todos los LED en un 25%.

La clase de partículas

Para simplificar enormemente el cableado, quería usar una sola cadena de LED, pero que se comportaran como múltiples cadenas. Dado que este era mi primer intento, quería mantenerlo lo más simple posible, por lo que trato la cadena como dos, con los LED del medio allí donde estaría la división. Dado que podríamos tener un número par o un número impar, debemos tenerlo en cuenta. Empiezo con algunas variables globales:

/ * * Variable y contenedores para LEDs * / leds CRGB [NUM_LEDS]; static unsigned int curLedDelay = MAX_LED_DELAY; static int centerLed = NUM_LEDS / 2; static int maxLedPos = NUM_LEDS / 2; static bool oddLeds = 0; partículas bool estáticasDir = 1; static bool speedDir = 1; unsigned long dirCount; hueCount largo sin firmar;

Y algo de código en setup ():

si (NUM_LEDS% 2 == 1) {oddLeds = 1; maxLedPos = NUM_LEDS / 2; } más {oddLeds = 0; maxLedPos = NUM_LEDS / 2 - 1; }

Si tenemos números impares, queremos usar el punto 1/2 como el medio, de lo contrario, queremos el punto 1/2 - 1. Esto es fácil de ver con 10 u 11 LED:

  • 11 LED: 11/2 con números enteros deben evaluarse como 5. y las computadoras cuentan desde 0. Entonces, 0 - 4 es la mitad, 6 - 10 es la otra mitad y 5 está entre ellos. Tratamos el n. ° 5 en este caso como si fuera parte de ambos, es decir, es el n. ° 1 para ambas cadenas virtuales de LED
  • 10 LED: 10/2 es 5. Pero como las computadoras cuentan desde 0, necesitamos eliminar uno. Entonces tenemos 0 - 4 para una mitad y 5 - 9 para la otra. El n. ° 1 para la primera cadena virtual será 4 y el n. ° 1 para la segunda cadena virtual será el n. ° 5.

Luego, en nuestro código de partículas, tenemos que contar desde nuestra posición general hasta las posiciones reales en la cadena de LED:

if (oddLeds) {Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } else {Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; }

El código también tiene condiciones en las que la partícula puede cambiar de dirección, por lo que también debemos tener eso en cuenta:

if (dirDepartícula) {if ((currPos == NUM_LEDS / 2) && oddLeds) {currPos = 0; } más si ((currPos == NUM_LEDS / 2 - 1) && (! oddLeds)) {currPos = 0; } else {currPos ++; }} else {if ((currPos == 0) && oddLeds) {currPos = centerLed; } más si ((currPos == 0) && (! oddLeds)) {currPos = centerLed - 1; } else {currPos--; }}

Por lo tanto, usamos la dirección deseada (PartículaDir) para calcular qué LED debe encenderse a continuación, pero también debemos considerar si hemos alcanzado el final real de la cadena de LED o nuestro punto central, que también actúa como un final para cada una de las cadenas virtuales.

Una vez que hemos descubierto todo eso, encendemos la siguiente luz según sea necesario:

if (dirDepartícula) {if (OddLeds) {Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } else {Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; }} else {if (oddLeds) {Pos1 = centerLed - currPos; Pos2 = centerLed + currPos; } else {Pos1 = centerLed - currPos; Pos2 = (centerLed -1) + currPos; }} leds [Pos1] = CHSV (currHue, 255, 255); leds [Pos2] = CHSV (currHue, 255, 255); FastLED.show ();}

¿Por qué hacer de esto una clase en absoluto? Tal como está, esto es bastante sencillo y realmente no necesita estar en una clase. Sin embargo, tengo planes futuros para actualizar el código para permitir que ocurra más de una partícula a la vez, y hacer que algunas funcionen a la inversa mientras que otras avanzan. Creo que existen grandes posibilidades para la detección de espines usando múltiples partículas.

Recomendado: