Inhaltsverzeichnis:

Eine LED-Stimmungslampe für 1 $ mit ATtiny13 und WS2812 - Gunook
Eine LED-Stimmungslampe für 1 $ mit ATtiny13 und WS2812 - Gunook

Video: Eine LED-Stimmungslampe für 1 $ mit ATtiny13 und WS2812 - Gunook

Video: Eine LED-Stimmungslampe für 1 $ mit ATtiny13 und WS2812 - Gunook
Video: WILIT T3 5W Schreibtischlampe, Stimmungslampe, 3 Helligkeitsstufen 2024, November
Anonim
Eine LED-Stimmungslampe für 1 USD mit ATtiny13 und WS2812
Eine LED-Stimmungslampe für 1 USD mit ATtiny13 und WS2812

Von arduinocelentanoFolgen Sie mehr vom Autor:

Persönlicher CalDAV-Server auf einem Einplatinencomputer
Persönlicher CalDAV-Server auf einem Einplatinencomputer
Persönlicher CalDAV-Server auf einem Einplatinencomputer
Persönlicher CalDAV-Server auf einem Einplatinencomputer
LCD Invaders: ein Space Invaders Like Game auf 16x2 LCD Character Display
LCD Invaders: ein Space Invaders Like Game auf 16x2 LCD Character Display
LCD Invaders: ein Space Invaders Like Game auf 16x2 LCD Character Display
LCD Invaders: ein Space Invaders Like Game auf 16x2 LCD Character Display
Octarine: ein Farbanpassungsspiel mit WS2812 RGB-LEDs
Octarine: ein Farbanpassungsspiel mit WS2812 RGB-LEDs
Octarine: ein Farbanpassungsspiel mit WS2812 RGB-LEDs
Octarine: ein Farbanpassungsspiel mit WS2812 RGB-LEDs

Dies ist eine kostengünstige Stimmungslampe mit vier Modi.

1. Regenbogenfunke. Ein Lichtfunke bewegt sich immer wieder nach oben und verändert nach und nach die Farbe.

2. Regenbogenglühen. Ein stabiles Leuchten, das die Farbe allmählich ändert.

3. Kerzenfeuersimulation.

4. Aus.

Sie können den Modus wechseln, indem Sie oben auf eine Touch-Schaltfläche tippen. Der aktuelle Modus wird nach dem Ausschalten im EEPROM-Speicher gespeichert.

Wie klein ist ATtiny13?

Die Idee war, mit minimaler Hardware maximale Funktionen zu erzielen, etwas komplexer als automatisierte Schalter oder Thermometer, ein Projekt, das am Rande dieses winzigen Mikrocontrollers liegt. Schließlich machen Einschränkungen Sie kreativ, oder? Naja, am Anfang sah es danach aus.

Die größte Herausforderung in diesem Projekt bestand darin, den gesamten Code in ATtiny13 zu schieben. Der Mikrocontroller hat 1K Byte Flash und nur 64 Byte RAM. Ja, wenn ich „Bytes“sage, meine ich solche, die aus acht Bits bestehen. 64 Byte für alle Ihre lokalen Variablen und Aufrufliste. Um es klar zu machen, bedenken Sie, dass wir 8 RGB-LEDs steuern müssen. Jeder von ihnen ist durch 3 Bytes definiert (jeweils eines für den Rot-, Grün- und Blaukanal). Um den Zustand von 8 LEDs zu speichern, müssen wir also ein Array von 8 Strukturen mit jeweils 3 Byte implementieren und ein Zeiger auf den Anfang dieses Arrays würde ein weiteres Byte benötigen. Somit sind 25 von 64 Bytes out. Wir haben gerade 39 % des Arbeitsspeichers verbraucht und noch nicht richtig angefangen. Um sieben grundlegende Regenbogenfarben zu speichern, benötigen Sie außerdem 7 × 3 = 21 Byte, also sind 72 % des RAM leer. Nun, bei den Grundfarben übertreibe ich: Wir brauchen nicht alle gleichzeitig im RAM und sie ändern sich nie, also können sie als konstantes Array implementiert werden, das im Flash statt im RAM gespeichert wird. Auf jeden Fall vermittelt es einen Gesamteindruck über gebrauchte Hardware.

Ich erinnere mich an Knuths Aussage zur vorzeitigen Optimierung und begann damit, drei Lampenmodi separat zu prototypieren, um zu sehen, was passiert. Ich habe sie separat getestet, um sicherzustellen, dass sie richtig funktionieren und jeder zu meinem Mikrocontroller passt. Es hat ein paar Abende gedauert, um es zu bewerkstelligen und alles lief gut… bis ich versuchte, sie in der switch-Anweisung zusammenzufügen. Das Dienstprogramm avr-size meldete eine Textabschnittsgröße von 1,5 KB (mit dem Flag -s von avr-gcc). In diesem Moment war meine ursprüngliche Absicht, mir ATtiny25 mit 2Kb Flash zu schnappen und das hätte das Happy End dieser Geschichte sein können.

Aber irgendwie hatte ich das Gefühl, dass ich es nach beträchtlicher Optimierung schaffen könnte, diesen beschissenen Code auf 1 KB zu verkleinern. Es dauerte jedoch eine weitere Woche, um zu erkennen, dass es unmöglich ist, und eine weitere Woche, um es trotzdem zu schaffen. Ich musste einen Regenbogen auf fünf Grundfarben (ohne signifikanten visuellen Unterschied) zuschneiden. Ich habe case-Anweisungen beseitigt und eine Kette von if-then-if verwendet, um die Binärcodegröße zu verringern. Die Feueranimation benötigt einen ziemlich sperrigen Pseudozufallszahlengenerator, daher habe ich eine vereinfachte Version von LFSR mit konstantem Anfangswert implementiert. Ich interessiere mich nicht für die volle Zykluslänge von PRNG und suche nur nach einem absteigenden Gleichgewicht zwischen Codegröße und "realistischer Feueranimation". Ich habe auch viele kleinere Optimierungen implementiert, an die ich mich gerade nicht erinnern kann, und es sogar geschafft, alle Modi außer Feuer in den Chip zu flashen. Als mir die Ideen ausgingen, war mein Gesamtcode ungefähr 1200 Bytes.

Ich habe mir eine Auszeit genommen und viel über AVR-Code-Optimierung gelesen. Ich war kurz davor, aufzugeben und alles in Assembler umzuschreiben, gab ihm aber die letzte Chance. Während des letzten Optimierungsrausches habe ich einen Regenbogen in drei Grundfarben geschnitten und andere im Handumdrehen berechnet, ich habe alles inspiziert und die AVR-Optimierungsempfehlungen befolgt und schließlich…

avrdude: Flash schreiben (1004 Byte):

Schreiben | ################################################ | 100 % 0,90 s

Ich brauche nicht zu sagen, dass ich fast den gesamten RAM und nur ein Byte EEPROM verwendet habe, um den aktuellen Modus zu speichern. Ich behaupte nicht, dass dies eine ideale und ultimative Implementierung ist. Es funktioniert einfach und passt zum Mikrocontroller. Ich bin sicher, du könntest es besser machen. Ich bin wirklich. Ich möchte nur den Spaß teilen, ein scheinbar unpraktisches Problem zu lösen, das Sie am Anfang für fast unmöglich halten. „Hacking bedeutet also, die Grenzen des Möglichen auszuloten…“– Richard Stallman.

Lieferungen:

1x ATtiny13 MCU (0,28 $ = 0,24 $ für MCU im SOP-8-Paket und 0,04 $ für DIP8-Adapter)

8x WS2812 RGB-LEDs (ich empfehle eine Platine oder ein Stück LED-Streifen) (0,42 $)

1x TTP223-Touch-Taste (0,10 USD)

1x Micro-USB-auf-DIP-Adapter (0,14 $)

1x 10kΩ Widerstand (<$0,01)

1x 100nF Keramikkondensator (<$ 0,01)

1x 10–47µF Elektrolytkondensator (<0,01 $)

Gesamt <0,97 $

Schritt 1: Software-Setup

Software-Setup
Software-Setup

Sie benötigen die avr-gcc-Toolchain zum Kompilieren des Quellcodes und das avrdude-Dienstprogramm zum Hochladen des ROM des Mikrocontrollers. Der Installationsprozess ist ziemlich einfach und unkompliziert, hängt jedoch von Ihrem Betriebssystem ab. Wenn Sie irgendeine Art von GNU/Linux verwenden, haben Sie wahrscheinlich bereits die richtigen Pakete in Ihrem Repository-Baum. Der Quellcode dieses Projekts kann hier heruntergeladen werden:

github.com/arduinocelentano/t13_ws2812_lamp

Sie benötigen außerdem eine light_ws2812-Bibliothek:

github.com/cpldcpu/light_ws2812

Sobald Sie die avr-gcc-Toolchain und die Projektquellen haben, führen Sie Ihr Terminal aus und geben Sie den folgenden Code ein:

CD-Pfad/zum/Projekt

machen

Schritt 2: Programmierung des Mikrocontrollers

Programmierung des Mikrocontrollers
Programmierung des Mikrocontrollers
Programmierung des Mikrocontrollers
Programmierung des Mikrocontrollers
Programmierung des Mikrocontrollers
Programmierung des Mikrocontrollers

Wenn Sie eine Art USBASP-Programmierer haben, verbinden Sie ihn einfach entsprechend seiner Pinbelegung mit Attiny. Normalerweise würde es so aussehen, aber ich empfehle dringend, Ihre tatsächliche Pinbelegung zu überprüfen!

Alternativ können Sie ein Arduino-Board als Programmierer verwenden. Öffnen Sie die Arduino IDE und suchen Sie das Arduino ISP-Beispiel im Menü „Datei→Beispiele“. Nach dem Hochladen der Skizze fungiert Ihr Arduino-Board als Programmierer. Die Kommentare im Sketch-Code geben Ihnen einen Hinweis auf die Pinbelegung.

Jetzt lauf

blitz machen

um die MCU zu flashen und

Sicherung machen

Fuse-Bits zu setzen.

Empfohlen: