Spisu treści:
Wideo: Lampa nastrojowa LED o wartości 1 USD z ATtiny13 i WS2812: 7 kroków
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:26
By arduinocelentanoObserwuj Więcej autora:
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
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
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:
Lampa nastrojowa LED z nadrukiem 3D: 15 kroków (ze zdjęciami)
3D Printed LED Mood Lamp: Zawsze fascynowały mnie lampy, więc możliwość połączenia drukowania 3D i Arduino z diodami LED była czymś, czego potrzebowałem. Koncepcja jest bardzo prosta, a wynik jest jednym z najbardziej satysfakcjonujących efektów wizualnych doświadczenia, które możesz umieścić
Super jasna latarka o wartości 100 USD za mniej niż 10 USD!: 5 kroków
100 $ Super Bright Flashlight za mniej niż 10 $!: Powiem z góry, że inspirację dla tego Instructable przypisuje się dchall8 za jego Tactical Flashlight Instructable. Pomyślałem, że musi być łatwiejszy sposób na zmodyfikowanie mniejszej latarki przy użyciu mniejszej ilości sprzętu i takiej, która zajmuje mniej czasu. ja p
Lampa nastrojowa LED Low Poly: 9 kroków (ze zdjęciami)
Lampa nastrojowa LED Low Poly: Świetny dodatek do każdego biurka, półki lub stołu! Dyskretny przycisk znajdujący się na podstawie umożliwia przełączanie różnych wzorów oświetlenia LED. Nie ma znaczenia, czy chcesz używać lampy do nauki, relaksu, a nawet imprezowania… jest kilka
Łatwa inteligentna lampa o wartości 5 USD z interfejsem internetowym smartfona: 4 kroki
Łatwa inteligentna lampa o wartości 5 USD z interfejsem sieciowym smartfona: Cześć! Nazywam się Rafał. To jest mój pierwszy Instruktaż! Moim głównym motywem stworzenia tej lampy jest pomoc w życiu osób niepełnosprawnych ruchowo. Kiedyś nie będziemy mieć przełączników na ścianach czy trudno dostępnych wtyczek, ale raczej nasze smartfony do sterowania
Lampka LED o wartości 2 USD do wideo i zdjęć: 11 kroków
Lampka LED o wartości 2 USD do wideo i zdjęć: AKTUALIZACJA: Mam nową i ulepszoną wersję z 180 lumenami wideo MOV lub MPG tutaj i t