Taula de continguts:

Una làmpada d'ànim LED d'1 $ amb ATtiny13 i WS2812: 7 passos
Una làmpada d'ànim LED d'1 $ amb ATtiny13 i WS2812: 7 passos

Vídeo: Una làmpada d'ànim LED d'1 $ amb ATtiny13 i WS2812: 7 passos

Vídeo: Una làmpada d'ànim LED d'1 $ amb ATtiny13 i WS2812: 7 passos
Vídeo: El Chombo - Dame Tu Cosita feat. Cutty Ranks (Official Video) [Ultra Records] 2024, Desembre
Anonim
Una làmpada d'ànim LED d'1 $ amb ATtiny13 i WS2812
Una làmpada d'ànim LED d'1 $ amb ATtiny13 i WS2812

Per arduinocelentano Segueix més de l'autor:

Servidor personal CalDAV en un ordinador de placa única
Servidor personal CalDAV en un ordinador de placa única
Servidor personal CalDAV en un ordinador de placa única
Servidor personal CalDAV en un ordinador de placa única
LCD Invaders: un joc de Space Invaders com a pantalla de caràcters LCD de 16x2
LCD Invaders: un joc de Space Invaders com a pantalla de caràcters LCD de 16x2
LCD Invaders: un joc de Space Invaders com a pantalla de caràcters LCD de 16x2
LCD Invaders: un joc de Space Invaders com a pantalla de caràcters LCD de 16x2
Octarine: un joc de coincidència de colors amb LED RGB WS2812
Octarine: un joc de coincidència de colors amb LED RGB WS2812
Octarine: un joc de coincidència de colors amb LED RGB WS2812
Octarine: un joc de coincidència de colors amb LED RGB WS2812

Es tracta d’una làmpada d’ànim de baix cost amb quatre modes.

1. Espurna arc de Sant Martí. Una espurna de llum es mou cap amunt cada cop i canvia de color a poc a poc.

2. Resplendor de l’arc de Sant Martí. Un resplendor estable que canvia de color a poc a poc.

3. Simulació de foc d’espelmes.

4. Desactivat.

Podeu canviar de mode tocant un botó tàctil situat a la part superior. El mode actual es desa a la memòria EEPROM després d’apagar-lo.

Què tan petit és ATtiny13?

La idea era obtenir les màximes funcions del maquinari mínim, quelcom més complex que el commutador automàtic o el termòmetre, un projecte proper a la vora d’aquest petit microcontrolador. Al cap i a la fi, les restriccions et fan pensar creatiu, oi? Bé, semblava que al principi.

El més difícil d’aquest projecte va ser introduir tot el codi a ATtiny13. El microcontrolador té flash de 1K bytes i només 64 bytes de RAM. Sí, quan dic "bytes", em refereixo a aquells que consten de vuit bits. 64 bytes per a totes les vostres variables locals i pila de trucades. Per deixar-ho clar, considerem que hem de controlar 8 LED RGB. Cadascun d'ells està definit per 3 bytes (un per al canal vermell, verd i blau respectivament). Per tant, només per emmagatzemar l’estat dels vuit LEDs, haurem d’implementar una matriu de vuit estructures de 3 bytes cadascun i un punter al començament d’aquesta matriu prendria un byte més. Així, 25 de 64 bytes estan fora. Acabem d’utilitzar un 39% de memòria RAM i encara no hem començat. A més, per emmagatzemar set colors bàsics de l’arc de Sant Martí, necessitareu 7 × 3 = 21 bytes, de manera que el 72% de la memòria RAM està fora. Bé, pel que fa als colors bàsics, exagero: no els necessitem tots al mateix temps a la memòria RAM i mai canvien, de manera que es poden implementar com una matriu constant per emmagatzemar en flash en lloc de RAM. De tota manera, dóna una impressió general sobre el maquinari usat.

Recordant l’afirmació de Knuth sobre l’optimització prematura, vaig començar a prototipar tres modes de làmpades per separat per veure què passa. Els he provat per separat per assegurar-me que funcionen correctament i que cadascun s’adapta al meu microcontrolador. Va passar un parell de tardes per aconseguir-ho i tot va anar bé … fins que vaig intentar reunir-les dins de la declaració switch. La utilitat avr-size va informar d'una mida de secció de text d'1,5 Kb (amb el senyalador -s d'avr-gcc). En aquell moment la meva intenció original era agafar una mica d'ATtiny25 amb flash de 2 KB i aquest podria haver estat el final feliç d'aquesta història.

Però d'alguna manera vaig sentir que després d'una considerable optimització podia reduir aquest codi merdós a 1Kb. Tot i això, va trigar una setmana més a adonar-se que és impossible i una setmana més aconseguir-ho de totes maneres. Vaig haver de tallar un arc de Sant Martí a cinc colors bàsics (sense diferències visuals significatives). Em vaig desfer de les afirmacions de cas i vaig utilitzar una cadena de if-then-if per reduir la mida del codi binari. L'animació de foc necessita un generador de números pseudoreator que és bastant voluminós, de manera que vaig implementar una versió simplificada de LFSR amb un valor inicial constant. No m'importa la durada del cicle complet de PRNG i només busco un equilibri de descens entre la mida del codi i "l'animació de foc realista". També he implementat moltes optimitzacions menors que no recordo ara mateix i fins i tot he aconseguit fer passar tots els modes a part de disparar al xip. Quan em vaig quedar sense idees, el meu codi total era d’uns 1200 bytes.

Em vaig trigar i havia estat llegint molt sobre l’optimització del codi AVR. Vaig estar a punt de renunciar i reescriure tot en llenguatge assemblador, però vaig donar-li l’última oportunitat. Durant la punta d’optimització final, he tallat un arc de Sant Martí a tres colors bàsics i he fet que es calculessin altres sobre la marxa, ho inspeccionava tot i seguia les recomanacions d’optimització AVR i finalment …

avrdude: escriptura flash (1004 bytes):

Escriptura | ####################################################### | 100% 0,90

No cal dir que he utilitzat gairebé tota la memòria RAM i només un byte d'EEPROM per emmagatzemar el mode actual. No implica que es tracti d'una implementació ideal i definitiva. Simplement funciona i s’adapta al microcontrolador. Estic segur que ho podríeu fer millor. Realment ho estic. Només vull compartir la diversió de resoldre un problema aparentment poc pràctic que considereu gairebé impossible al principi. "Per tant, pirateria significa explorar els límits del que és possible …" - Richard Stallman.

Subministraments:

1 x MCU ATtiny13 (0,28 dòlars = 0,24 dòlars per a MCU al paquet SOP-8 i 0,04 dòlars per a l'adaptador DIP8)

8 LEDs RGB WS2812 (recomano una placa o una peça de banda LED) (0,42 dòlars)

1 botó tàctil TTP223 (0,10 dòlars)

1 adaptador Micro USB a DIP (0,14 dòlars)

1 resistència de 10 kΩ (<0,01 dòlars)

1x condensador ceràmic 100nF (<0,01 $)

1x condensador electrolític de 10–47µF (<0,01 $)

Total <0,97 USD

Pas 1: Configuració del programari

Configuració del programari
Configuració del programari

Necessitareu la cadena d’eines avr-gcc per compilar el codi font i la utilitat avrdude per penjar la ROM del microcontrolador. El procés d’instal·lació és pràcticament senzill i senzill, però depèn del vostre sistema operatiu. Si utilitzeu algun tipus de GNU / Linux, probablement ja tingueu paquets adequats a l'arbre del vostre dipòsit. El codi font d’aquest projecte es pot descarregar aquí:

github.com/arduinocelentano/t13_ws2812_lamp

També necessitareu una biblioteca light_ws2812:

github.com/cpldcpu/light_ws2812

Un cop tingueu les fonts del projecte i de la cadena d’eines avr-gcc, executeu el terminal i escriviu el codi següent:

camí del CD / a / projecte

fer

Pas 2: Programació del microcontrolador

Programació del microcontrolador
Programació del microcontrolador
Programació del microcontrolador
Programació del microcontrolador
Programació del microcontrolador
Programació del microcontrolador

Si teniu algun tipus de programador USBASP, connecteu-lo a Attiny segons el seu pinout. Normalment es veuria així, però us recomano que comproveu el vostre pinout real.

Com a alternativa, podeu utilitzar una placa Arduino com a programador. Obriu Arduino IDE i cerqueu l’exemple d’ISP Arduino al menú “Fitxer → Exemples”. Després de penjar l’esbós, la vostra placa Arduino fa de programador. Els comentaris del codi d’esbós us donarien una pista per identificar-los.

Ara corre

fer flaix

per llampar la MCU i

fer fusible

per configurar bits de fusibles.

Recomanat: