Tabla de contenido:
Video: Una lámpara LED Mood de $ 1 con ATtiny13 y WS2812: 7 pasos
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:40
Por arduinocelentano Siga más por el autor:
Esta es una lámpara ambiental de bajo costo con cuatro modos.
1. Chispa de arco iris. Una chispa de luz se mueve hacia arriba una y otra vez y cambia gradualmente de color.
2. Resplandor del arco iris. Un brillo estable que cambia gradualmente de color.
3. Simulación de fuego de velas.
4. Apagado.
Puede cambiar de modo tocando un botón táctil en la parte superior. El modo actual se guarda en la memoria EEPROM después de apagar.
¿Qué tan pequeño es ATtiny13?
La idea era obtener las máximas características de un hardware mínimo, algo más complejo que un interruptor automático o un termómetro, un proyecto cercano al borde de este pequeño microcontrolador. Después de todo, las restricciones te hacen pensar de forma creativa, ¿verdad? Bueno, lo parecía al principio.
El mayor desafío de este proyecto fue introducir todo el código en ATtiny13. El microcontrolador tiene flash de 1K bytes y solo 64 bytes de RAM. Sí, cuando digo "bytes", me refiero a los que constan de ocho bits. 64 bytes para todas sus variables locales y pila de llamadas. Para que quede claro, consideremos que tenemos que controlar 8 LED RGB. Cada uno de ellos está definido por 3 bytes (uno para el canal rojo, verde y azul respectivamente). Entonces, solo para almacenar el estado de 8 LED, necesitaremos implementar una matriz de 8 estructuras de 3 bytes cada una y un puntero al comienzo de esta matriz tomaría un byte más. Por lo tanto, están fuera 25 de 64 bytes. Acabamos de utilizar el 39% de la RAM y todavía no hemos empezado. Además, para almacenar siete colores básicos del arco iris, necesitará 7 × 3 = 21 bytes, por lo que se agotó el 72% de la RAM. Bueno, en cuanto a los colores básicos, exagero: no los necesitamos todos al mismo tiempo en la RAM y nunca cambian, por lo que pueden implementarse como una matriz constante para ser almacenados en flash en lugar de RAM. De todos modos, da una impresión general sobre el hardware usado.
Recordando la declaración de Knuth sobre la optimización prematura, comencé con la creación de prototipos de tres modos de lámpara por separado para ver qué sucedía. Los he probado por separado para asegurarme de que funcionan correctamente y que cada uno se ajusta a mi microcontrolador. Me tomó un par de tardes lograrlo y todo salió bien … hasta que traté de ponerlos juntos dentro de la declaración del interruptor. La utilidad avr-size informó un tamaño de sección de texto de 1,5 Kb (con el indicador -s de avr-gcc). En ese momento mi intención original era agarrar algo de ATtiny25 con flash de 2Kb y ese podría haber sido el final feliz de esta historia.
Pero de alguna manera sentí que después de una optimización considerable podía reducir ese código de mierda a 1Kb. Sin embargo, tomó una semana más para darse cuenta de que es imposible y una semana más para lograrlo de todos modos. Tuve que cortar un arco iris en cinco colores básicos (sin una diferencia visual significativa). Me deshice de las declaraciones de casos y usé una cadena de if-then-if para disminuir el tamaño del código binario. La animación de fuego necesita un generador de números pseudoaleatorios que es bastante voluminoso, así que implementé una versión simplificada de LFSR con un valor inicial constante. No me importa la duración del ciclo completo de PRNG y solo busco un equilibrio de descenso entre el tamaño del código y la "animación de fuego realista". También implementé muchas optimizaciones menores que no puedo recordar en este momento e incluso logré flashear todos los modos, excepto disparar al chip. Cuando me quedé sin ideas, mi código total era de unos 1200 bytes.
Me tomé un tiempo de espera y había estado leyendo mucho sobre la optimización del código AVR. Estuve a punto de rendirme y reescribir todo en lenguaje ensamblador, pero le di la última oportunidad. Durante la carrera de optimización final, corté un arco iris en tres colores básicos e hice que otros se calcularan sobre la marcha, inspeccioné todo y seguí las recomendaciones de optimización de AVR y finalmente …
avrdude: escritura flash (1004 bytes):
Escritura | ############################################### | 100% 0,90 s
No es necesario decir que utilicé casi toda la RAM y solo un byte de EEPROM para almacenar el modo actual. No quiero decir que esta sea una implementación ideal y definitiva. Simplemente funciona y se adapta al microcontrolador. Estoy seguro de que podrías hacerlo mejor. Realmente soy. Solo quiero compartir la diversión de resolver un problema aparentemente poco práctico que consideras casi imposible al principio. "Por lo tanto, piratear significa explorar los límites de lo que es posible …" - Richard Stallman.
Suministros:
1x MCU ATtiny13 ($ 0.28 = $ 0.24 para MCU en paquete SOP-8 y $ 0.04 para adaptador DIP8)
8 LED RGB WS2812 (recomiendo una placa o una tira de LED) ($ 0,42)
1x botón táctil TTP223 ($ 0.10)
1x Adaptador Micro USB a DIP ($ 0.14)
1x resistencia de 10kΩ (<$ 0.01)
Condensador cerámico 1x 100nF (<$ 0.01)
1 condensador electrolítico de 10–47 µF (<$ 0.01)
Total <$ 0.97
Paso 1: configuración del software
Necesitará la cadena de herramientas avr-gcc para compilar el código fuente y la utilidad avrdude para cargar la ROM del microcontrolador. El proceso de instalación es bastante simple y directo, pero depende de su sistema operativo. Si usa algún tipo de GNU / Linux, probablemente ya tenga los paquetes adecuados en su árbol de repositorio. El código fuente de este proyecto se puede descargar aquí:
github.com/arduinocelentano/t13_ws2812_lamp
También necesitará una biblioteca light_ws2812:
github.com/cpldcpu/light_ws2812
Una vez que tenga la cadena de herramientas avr-gcc y las fuentes del proyecto, ejecute su terminal y escriba el siguiente código:
cd ruta / a / proyecto
hacer
Paso 2: Programación del microcontrolador
Si tiene algún tipo de programador USBASP, simplemente conéctelo a Attiny de acuerdo con su pinout. Por lo general, se vería así, ¡pero recomiendo encarecidamente que revise su pinout real!
Alternativamente, puede utilizar una placa Arduino como programador. Abra Arduino IDE y busque el ejemplo de Arduino ISP en el menú "Archivo → Ejemplos". Después de cargar el boceto, su placa Arduino actúa como programador. Los comentarios en el código de boceto le darían una pista para el pinout.
Ahora corre
hacer flash
para flashear la MCU y
hacer fusible
para configurar bits de fusible.
Recomendado:
Lámpara LED Mood impresa en 3D: 15 pasos (con imágenes)
Lámpara LED Mood impresa en 3D: Siempre he tenido esta fascinación por las lámparas, por lo que tener la capacidad de combinar la impresión 3D y Arduino con LED era algo que necesitaba perseguir. El concepto es muy simple y el resultado es uno de los efectos visuales más satisfactorios. experiencias que puedes poner
Lámpara Como Hacer Una Mood (proyecto Uvg): 5 Pasos (con Imágenes)
Como Hacer Una Mood Lamp (proyecto Uvg): Esta es una mood lamp que funciona a base de un sensor DHT11 y 3 potenciómetros. tiene 2 modos: el primero el color cambia con los potenciómetros, y el segundo cambia a base de las lecturas del sensor DHT11
Lámpara Stencil - Una lámpara con muchas sombras: 5 pasos
Lámpara de plantilla: una lámpara con muchas sombras: este instructivo le mostrará cómo hacer una lámpara simple con pantallas intercambiables (es una pantalla de lámpara)
Haga una unidad de exposición de PCB adecuada con una lámpara de curado de uñas UV barata: 12 pasos (con imágenes)
Haga una unidad de exposición a PCB adecuada con una lámpara de curado de uñas UV barata: ¿Qué tienen en común la producción de PCB y las uñas postizas? Ambos utilizan fuentes de luz ultravioleta de alta intensidad y, por suerte, esas fuentes de luz tienen exactamente la misma longitud de onda. Solo los destinados a la producción de PCB suelen ser bastante costosos
PhotonLamp: una lámpara de diseño equipada con WS2812b con control MQTT: 5 pasos (con imágenes)
PhotonLamp: una lámpara de diseño equipada con WS2812b con control MQTT: Hace varios años compramos una lámpara de diseño que tenía una pantalla en forma de cigarro y estaba hecha de cristal de leche. Nos gustó el diseño particular de la pantalla y el aspecto general de la lámpara. Pero no estoy realmente satisfecho con la luz