Съдържание:

LED лампа за настроение за $ 1 с ATtiny13 и WS2812: 7 стъпки
LED лампа за настроение за $ 1 с ATtiny13 и WS2812: 7 стъпки

Видео: LED лампа за настроение за $ 1 с ATtiny13 и WS2812: 7 стъпки

Видео: LED лампа за настроение за $ 1 с ATtiny13 и WS2812: 7 стъпки
Видео: ATtiny85 и светодиодная матрица 16x16 адресных светодиодов 2024, Декември
Anonim
LED лампа за настроение на стойност $ 1 с ATtiny13 и WS2812
LED лампа за настроение на стойност $ 1 с ATtiny13 и WS2812

От arduinocelentano Следвайте още от автора:

Личен сървър CalDAV на компютър с единична платка
Личен сървър CalDAV на компютър с единична платка
Личен CalDAV сървър на компютър с единична платка
Личен CalDAV сървър на компютър с единична платка
LCD Invaders: Space Invaders Like Game на 16x2 LCD дисплей с символи
LCD Invaders: Space Invaders Like Game на 16x2 LCD дисплей с символи
LCD Invaders: Space Invaders Like Game на 16x2 LCD дисплей с символи
LCD Invaders: Space Invaders Like Game на 16x2 LCD дисплей с символи
Октарин: Игра за съвпадение на цветовете с WS2812 RGB светодиоди
Октарин: Игра за съвпадение на цветовете с WS2812 RGB светодиоди
Октарин: Игра за съвпадение на цветовете с WS2812 RGB светодиоди
Октарин: Игра за съвпадение на цветовете с WS2812 RGB светодиоди

Това е евтина лампа за настроение с четири режима.

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 и

направете предпазител

за задаване на битове за предпазители.

Препоръчано: