Съдържание:
Видео: LED лампа за настроение за $ 1 с ATtiny13 и WS2812: 7 стъпки
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:49
От arduinocelentano Следвайте още от автора:
Това е евтина лампа за настроение с четири режима.
1. Дъгова искра. Искра светлина се движи нагоре след време и постепенно променя цвета.
2. Сияние на дъгата. Стабилен блясък, който постепенно променя цвета.
3. Симулация на огън на свещи.
4. Изкл.
Можете да превключвате режими, като докоснете бутон за докосване отгоре. Текущият режим се записва в паметта на EEPROM след изключване.
Колко малък е ATtiny13?
Идеята беше да се получат максимални характеристики от минимален хардуер, нещо по -сложно от автоматизирания превключвател или термометър, проект близо до ръба на този малък микроконтролер. В крайна сметка ограниченията ви карат да мислите креативно, нали? Е, така изглеждаше в началото.
Най -голямото предизвикателство в този проект беше да вкара целия код в ATtiny13. Микроконтролерът има 1K байтове флаш и само 64 байта RAM. Да, когато казвам „байтове“, имам предвид тези, състоящи се от осем бита. 64 байта за за всичките ви локални променливи и стека на повикванията. За да стане ясно, помислете, че трябва да контролираме 8 RGB светодиода. Всеки от тях се дефинира с 3 байта (по един за червен, зелен и син канал съответно). Така че, само за да съхраним състоянието на 8 светодиода, ще трябва да внедрим масив от 8 структури по 3 байта всеки и указател към началото на този масив ще отнеме още един байт. По този начин 25 от 64 байта са вън. Току -що използвахме 39% RAM и все още не сме започнали. Освен това, за да съхранявате седем основни цвята на дъгата, ще ви трябват 7 × 3 = 21 байта, така че 72% от RAM е излязло. Е, що се отнася до основните цветове, преувеличавам: нямаме нужда от всички едновременно в RAM и те никога не се променят, така че те могат да бъдат внедрени като постоянен масив, който да се съхранява във флаш, вместо в RAM. Както и да е, това създава цялостно впечатление за използвания хардуер.
Спомняйки си изявлението на Кнут за преждевременната оптимизация, започнах от прототипирането на три режима на лампата поотделно, за да видя какво се случва. Тествал съм ги отделно, за да се уверя, че работят правилно и всеки от тях отговаря на моя микроконтролер. Отне ми няколко вечери, за да го постигна и всичко мина добре … докато не се опитах да ги събера в изявлението за превключване. помощната програма с размер avr съобщава за размер на текстовата секция от 1,5 Kb (с флаг -s на avr-gcc). В този момент първоначалното ми намерение беше да грабна ATtiny25 с 2Kb флаш и това можеше да е щастливият край на тази история.
Но някак си почувствах, че след значителна оптимизация ще успея да свия този гаден код на 1Kb. Обаче отне още една седмица, за да се осъзнае, че е невъзможно, и още една седмица, за да се постигне това. Трябваше да изрежа дъгата до пет основни цвята (без значителна визуална разлика). Отървах се от операторите на случай и използвах верига от ако-след-ако, за да намаля размера на двоичния код. Fire animation се нуждае от генератор на псевдослучайни числа, който е доста обемист, затова внедрих опростена версия на LFSR с постоянна начална стойност. Не ме интересува продължителността на целия цикъл на PRNG и просто търся баланс между размера на кода и „реалистичната анимация на огъня“. Също така внедрих много малки оптимизации, които не мога да си спомня в момента и дори успях да прехвърля всички режими, освен огъня, в чипа. Когато ми свършиха идеите, общият ми код беше около 1200 байта.
Взех таймаут и бях чел много за оптимизиране на AVR кода. Бях близо до това да се откажа и да пренапиша всичко на асемблер, но му дадох последния шанс. По време на финалния оптимизационен прилив изрязах дъгата до три основни цвята и накарах други да бъдат изчислени в движение, проверих всичко и последвах препоръките за оптимизиране на AVR и накрая …
avrdude: запис на флаш (1004 байта):
Писане | ################################################# | 100% 0,90 сек
Няма нужда да казвам, че използвах почти цялата RAM и само един байт EEPROM за съхраняване на текущия режим. Не намеквам, че това е идеално и крайно изпълнение. Той просто работи и пасва на микроконтролера. Сигурен съм, че бихте могли да го направите по -добре. Наистина съм. Просто искам да споделя забавлението от решаването на очевидно непрактичен проблем, който смятате за почти невъзможен в началото. „По този начин хакерството означава проучване на границите на възможното …“-Ричард Столман.
Консумативи:
1x ATINy13 MCU ($ 0.28 = $ 0.24 за MCU в пакет SOP-8 и $ 0.04 за DIP8 адаптер)
8x WS2812 RGB светодиоди (препоръчвам дъска или парче LED лента) ($ 0.42)
1x бутон TTP223 Touch ($ 0,10)
1x Micro USB към DIP адаптер ($ 0.14)
1x 10kΩ резистор (<$ 0,01)
1x 100nF керамичен кондензатор (<$ 0,01)
1x 10–47µF електролитен кондензатор (<$ 0,01)
Общо <$ 0,97
Стъпка 1: Настройка на софтуера
Ще ви трябва avr-gcc toolchain за компилиране на изходния код и помощната програма avrdude за качване на ROM на микроконтролера. Процесът на инсталиране е доста прост и ясен, но зависи от вашата операционна система. Ако използвате някакъв GNU/Linux, вероятно вече имате подходящи пакети във вашето дърво на хранилището. Изходният код на този проект може да бъде изтеглен от тук:
github.com/arduinocelentano/t13_ws2812_lamp
Ще ви трябва и библиотека light_ws2812:
github.com/cpldcpu/light_ws2812
След като имате avr-gcc набор от инструменти и източници на проекти, стартирайте терминала си и въведете следния код:
cd път/към/проект
направете
Стъпка 2: Програмиране на микроконтролера
Ако имате някакъв USBASP програмист, просто го свържете към Attiny според неговия извод. Обикновено това би изглеждало така, но силно препоръчвам да проверите действителното си разпределение!
Като алтернатива можете да използвате дъска Arduino като програмист. Отворете Arduino IDE и намерете примера на ISP на Arduino в менюто „Файл → Примери“. След като качите скицата, вашата дъска Arduino действа като програмист. Коментарите в кода на скицата биха ви дали представа как да ги посочите.
Сега бягайте
направете светкавица
да мига MCU и
направете предпазител
за задаване на битове за предпазители.
Препоръчано:
3D печатна LED лампа за настроение: 15 стъпки (със снимки)
3D печатна LED лампа за настроение: Винаги съм имала това увлечение по лампите, така че възможността да комбинирам 3D печат и Arduino със светодиоди беше нещо, което трябваше да преследвам. Концепцията е много проста и резултатът е един от най -удовлетворяващите визуални опит, който можете да предадете
Говорител за настроение- мощен говорител за възпроизвеждане на музика на настроение въз основа на околната температура: 9 стъпки
Mood Speaker- Мощен говорител за възпроизвеждане на музика на настроение въз основа на температурата на околната среда: Здравейте! За моя училищен проект в MCT Howest Kortrijk направих Mood Speaker, това е интелигентно Bluetooth устройство с различни сензори, LCD и WS2812b Включен светодиод. Високоговорителят възпроизвежда фонова музика въз основа на температурата, но може
LED лампа за настроение с нисък поли: 9 стъпки (със снимки)
LED лампа за настроение с ниско ниво на поли: Чудесно допълнение към всяко бюро, рафт или маса! Дискретен бутон, разположен на основата, ви позволява да преминете през различни модели на LED осветление. Няма значение дали искате да използвате лампата си за учене, релакс или дори купон … има няколко
LED лампа за настроение: 9 стъпки (със снимки)
LED лампа за настроение: Наскоро попаднах на LED куб от Грег Давил. Това е страхотно произведение на изкуството. Вдъхновен от него, дори аз исках да направя нещо подобно. Но това беше изход от моята лига. Реших да направя стъпка по стъпка и направих начин по -малък v
ESP 8266 Nodemcu Ws 2812 Неопикселова LED лампа за настроение, контролирана от локален уеб сървър: 6 стъпки
ESP 8266 Nodemcu Ws 2812 LED MOOD лампа, управлявана от локален уеб сървър: ESP 8266 Nodemcu Ws 2812 Neopixel, базирана LED MOOD лампа, контролирана чрез уеб сървър