Tabla de contenido:

Una lámpara LED Mood de $ 1 con ATtiny13 y WS2812: 7 pasos
Una lámpara LED Mood de $ 1 con ATtiny13 y WS2812: 7 pasos

Video: Una lámpara LED Mood de $ 1 con ATtiny13 y WS2812: 7 pasos

Video: Una lámpara LED Mood de $ 1 con ATtiny13 y WS2812: 7 pasos
Video: WLED Sound Reactive - Complete Setup Tutorial 2024, Noviembre
Anonim
Una lámpara LED Mood de $ 1 con ATtiny13 y WS2812
Una lámpara LED Mood de $ 1 con ATtiny13 y WS2812

Por arduinocelentano Siga más por el autor:

Servidor CalDAV personal en una computadora de placa única
Servidor CalDAV personal en una computadora de placa única
Servidor CalDAV personal en una computadora de placa única
Servidor CalDAV personal en una computadora de placa única
LCD Invaders: un juego similar a Space Invaders en una pantalla LCD de caracteres de 16x2
LCD Invaders: un juego similar a Space Invaders en una pantalla LCD de caracteres de 16x2
LCD Invaders: un juego similar a Space Invaders en una pantalla LCD de caracteres de 16x2
LCD Invaders: un juego similar a Space Invaders en una pantalla LCD de caracteres de 16x2
Octarine: un juego de combinación de colores con LED RGB WS2812
Octarine: un juego de combinación de colores con LED RGB WS2812
Octarine: un juego de combinación de colores con LED RGB WS2812
Octarine: un juego de combinación de colores con LED RGB WS2812

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

Configuración del software
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

Programación del microcontrolador
Programación del microcontrolador
Programación del microcontrolador
Programación del microcontrolador
Programación del microcontrolador
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: