Spisu treści:

Lampa nastrojowa LED o wartości 1 USD z ATtiny13 i WS2812: 7 kroków
Lampa nastrojowa LED o wartości 1 USD z ATtiny13 i WS2812: 7 kroków

Wideo: Lampa nastrojowa LED o wartości 1 USD z ATtiny13 i WS2812: 7 kroków

Wideo: Lampa nastrojowa LED o wartości 1 USD z ATtiny13 i WS2812: 7 kroków
Wideo: AKTORKA FILM0W DLA D0R0$ŁYCH MÓWI O PROBLEMACH W POLSKIM SPOŁECZEŃSTWIE! KAŻDY OGLĄDA... #shorts 2024, Listopad
Anonim
Lampa nastrojowa LED za 1 USD z ATtiny13 i WS2812
Lampa nastrojowa LED za 1 USD z ATtiny13 i WS2812

By arduinocelentanoObserwuj Więcej autora:

Osobisty serwer CalDAV na komputerze jednopłytowym
Osobisty serwer CalDAV na komputerze jednopłytowym
Osobisty serwer CalDAV na komputerze jednopłytowym
Osobisty serwer CalDAV na komputerze jednopłytowym
LCD Invaders: Space Invaders jak gra na wyświetlaczu LCD 16x2
LCD Invaders: Space Invaders jak gra na wyświetlaczu LCD 16x2
LCD Invaders: Space Invaders jak gra na wyświetlaczu LCD 16x2
LCD Invaders: Space Invaders jak gra na wyświetlaczu LCD 16x2
Octarine: gra w dopasowywanie kolorów z diodami LED RGB WS2812
Octarine: gra w dopasowywanie kolorów z diodami LED RGB WS2812
Octarine: gra w dopasowywanie kolorów z diodami LED RGB WS2812
Octarine: gra w dopasowywanie kolorów z diodami LED RGB WS2812

To niedroga lampa nastrojowa z czterema trybami.

1. Tęczowa iskra. Iskra światła raz po raz unosi się w górę i stopniowo zmienia kolor.

2. Tęczowy blask. Stabilny blask, który stopniowo zmienia kolor.

3. Symulacja pożaru świecy.

4. Wył.

Możesz przełączać tryby, dotykając przycisku dotykowego na górze. Aktualny tryb jest zapisywany w pamięci EEPROM po wyłączeniu zasilania.

Jak mały jest ATtiny13?

Pomysł polegał na uzyskaniu maksymalnych funkcji z minimalnego sprzętu, czegoś bardziej złożonego niż automatyczny przełącznik lub termometr, projekt bliski krawędzi tego małego mikrokontrolera. W końcu ograniczenia sprawiają, że myślisz kreatywnie, prawda? Cóż, tak wyglądało na początku.

Największym wyzwaniem w tym projekcie było wrzucenie całego kodu do ATtiny13. Mikrokontroler ma 1K bajtów flash i tylko 64 bajty pamięci RAM. Tak, kiedy mówię „bajty”, mam na myśli te składające się z ośmiu bitów. 64 bajty dla wszystkich zmiennych lokalnych i stosu wywołań. Aby było jasne, rozważmy, że musimy sterować 8 diodami LED RGB. Każdy z nich jest zdefiniowany przez 3 bajty (jeden odpowiednio dla kanału czerwonego, zielonego i niebieskiego). Tak więc, aby zapisać stan 8 diod LED, będziemy musieli zaimplementować tablicę 8 struktur po 3 bajty każda, a wskaźnik na początek tej tablicy zająłby jeszcze jeden bajt. Tak więc 25 z 64 bajtów zostało usuniętych. Właśnie zużyliśmy 39% pamięci RAM i tak naprawdę jeszcze nie zaczęliśmy. Dodatkowo, aby przechowywać siedem podstawowych kolorów tęczy, potrzebujesz 7×3 = 21 bajtów, więc 72% pamięci RAM jest wyłączone. Cóż, co do podstawowych kolorów przesadzam: nie potrzebujemy ich wszystkich jednocześnie w pamięci RAM i nigdy się nie zmieniają, więc mogą być zaimplementowane jako stała tablica do przechowywania we flashu zamiast w pamięci RAM. W każdym razie daje to ogólne wrażenie o używanym sprzęcie.

Pamiętając oświadczenie Knutha o przedwczesnej optymalizacji, zacząłem od prototypowania trzech trybów lamp osobno, aby zobaczyć, co się stanie. Testowałem je osobno, aby upewnić się, że działają poprawnie i każdy z nich pasuje do mojego mikrokontrolera. Osiągnięcie tego zajęło kilka wieczorów i wszystko poszło dobrze… dopóki nie spróbowałem połączyć ich w oświadczenie przełącznika. Narzędzie avr-size zgłosiło rozmiar sekcji tekstu 1,5 KB (z flagą -s avr-gcc). W tym momencie moim pierwotnym zamiarem było zdobycie ATtiny25 z pamięcią flash 2Kb i to mogło być szczęśliwym zakończeniem tej historii.

Ale jakoś poczułem, że po znacznej optymalizacji uda mi się zmniejszyć ten gówniany kod do 1Kb. Jednak zajęło mi jeszcze jeden tydzień, aby zdać sobie sprawę, że to niemożliwe, i jeszcze jeden tydzień, aby to osiągnąć. Musiałem przyciąć tęczę do pięciu podstawowych kolorów (bez znaczącej różnicy wizualnej). Pozbyłem się instrukcji case i użyłem łańcucha if-then-if, aby zmniejszyć rozmiar kodu binarnego. Animacja ognia wymaga generatora liczb pseudolosowych, który jest dość nieporęczny, więc zaimplementowałem uproszczoną wersję LFSR ze stałą wartością początkową. Nie obchodzi mnie długość pełnego cyklu PRNG i po prostu szukam równowagi między rozmiarem kodu a „realistyczną animacją ognia”. Zaimplementowałem też wiele drobnych optymalizacji, których teraz nie pamiętam, a nawet udało mi się sflashować wszystkie tryby oprócz ognia do chipa. Kiedy skończyły mi się pomysły, cały kod miał około 1200 bajtów.

Zrobiłem sobie przerwę i dużo czytałem o optymalizacji kodu AVR. Byłem bliski rezygnacji i przepisania wszystkiego w asemblerze, ale dałem temu ostatnią szansę. W końcowym pośpiechu optymalizacji przyciąłem tęczę do trzech podstawowych kolorów i kazałem obliczyć inne w locie, sprawdziłem wszystko i postępowałem zgodnie z zaleceniami dotyczącymi optymalizacji AVR i wreszcie…

avrdude: zapis flasha (1004 bajty):

Pisanie | ################################################## | 100% 0.90s

Nie trzeba mówić, że do przechowywania aktualnego trybu użyłem prawie całej pamięci RAM i tylko jednego bajtu pamięci EEPROM. Nie sugeruję, że jest to idealna i ostateczna realizacja. Po prostu działa i pasuje do mikrokontrolera. Jestem pewien, że mógłbyś to zrobić lepiej. Naprawdę jestem. Chcę tylko podzielić się radością z rozwiązywania pozornie niepraktycznego problemu, który na początku uważasz za prawie niemożliwy. „Zatem hakowanie oznacza odkrywanie granic tego, co jest możliwe…” - Richard Stallman.

Kieszonkowe dzieci:

1x ATtiny13 MCU (0,28 USD = 0,24 USD za MCU w pakiecie SOP-8 i 0,04 USD za adapter DIP8)

8x diod LED RGB WS2812 (polecam płytkę lub kawałek paska LED) (0,42 USD)

1x przycisk dotykowy TTP223 (0,10 USD)

1x przejściówka Micro USB na DIP (0,14 USD)

1x rezystor 10kΩ (<0,01 USD)

1x kondensator ceramiczny 100nF (<0,01 USD)

1x kondensator elektrolityczny 10–47 µF (<0,01 USD)

Razem <0,97 USD

Krok 1: Konfiguracja oprogramowania

Konfiguracja oprogramowania
Konfiguracja oprogramowania

Będziesz potrzebować toolchaina avr-gcc do kompilacji kodu źródłowego i narzędzia avrdude do wgrania pamięci ROM mikrokontrolera. Proces instalacji jest dość prosty i bezpośredni, ale zależy od systemu operacyjnego. Jeśli używasz jakiegoś GNU/Linuksa, prawdopodobnie masz już odpowiednie pakiety w swoim drzewie repozytorium. Kod źródłowy tego projektu można pobrać tutaj:

github.com/arduinocelentano/t13_ws2812_lamp

Będziesz także potrzebować biblioteki light_ws2812:

github.com/cpldcpu/light_ws2812

Gdy masz avr-gcc toolchain i źródła projektu, uruchom terminal i wpisz następujący kod:

cd ścieżka/do/projektu

robić

Krok 2: Programowanie mikrokontrolera

Programowanie mikrokontrolera
Programowanie mikrokontrolera
Programowanie mikrokontrolera
Programowanie mikrokontrolera
Programowanie mikrokontrolera
Programowanie mikrokontrolera

Jeśli masz jakiś programator USBASP, po prostu podłącz go do Attiny zgodnie z jego pinoutem. Zwykle wyglądałoby to tak, ale zdecydowanie zalecam sprawdzenie aktualnego wyprowadzenia!

Alternatywnie możesz użyć płytki Arduino jako programatora. Otwórz Arduino IDE i znajdź przykład Arduino ISP w menu „Plik → Przykłady”. Po przesłaniu szkicu, Twoja płytka Arduino działa jako programista. Komentarze w kodzie szkicu dadzą ci wskazówkę do pinoutu.

Teraz biegnij

zrobić błysk

do flashowania MCU i

zrobić bezpiecznik

do ustawiania bezpieczników.

Zalecana: