Оглавление:

Светодиодная лампа для настроения за 1 доллар с ATtiny13 и WS2812: 7 шагов
Светодиодная лампа для настроения за 1 доллар с ATtiny13 и WS2812: 7 шагов

Видео: Светодиодная лампа для настроения за 1 доллар с ATtiny13 и WS2812: 7 шагов

Видео: Светодиодная лампа для настроения за 1 доллар с ATtiny13 и WS2812: 7 шагов
Видео: Светодиодный светильник 4х4х4 для Ардуино на 74CH595 2024, Ноябрь
Anonim
Светодиодная лампа для настроения за 1 доллар с ATtiny13 и WS2812
Светодиодная лампа для настроения за 1 доллар с ATtiny13 и WS2812

Подписаться Другие автора:

Персональный сервер CalDAV на одноплатном компьютере
Персональный сервер CalDAV на одноплатном компьютере
Персональный сервер CalDAV на одноплатном компьютере
Персональный сервер CalDAV на одноплатном компьютере
LCD Invaders: Space Invaders Like Game на символьном ЖК-дисплее 16x2
LCD Invaders: Space Invaders Like Game на символьном ЖК-дисплее 16x2
LCD Invaders: Space Invaders Like Game на символьном ЖК-дисплее 16x2
LCD Invaders: Space Invaders Like Game на символьном ЖК-дисплее 16x2
Octarine: игра подбора цветов с RGB-светодиодами WS2812
Octarine: игра подбора цветов с RGB-светодиодами WS2812
Octarine: игра подбора цветов с RGB-светодиодами WS2812
Octarine: игра подбора цветов с RGB-светодиодами WS2812

Это недорогая лампа для настроения с четырьмя режимами.

1. Радужная искра. Искра света раз за разом движется вверх и постепенно меняет цвет.

2. Свечение радуги. Стабильное свечение, постепенно меняющее цвет.

3. Моделирование огня свечи.

4. Выкл.

Вы можете переключать режимы, нажав сенсорную кнопку вверху. Текущий режим сохраняется в памяти EEPROM после выключения питания.

Насколько крошечный ATtiny13?

Идея заключалась в том, чтобы получить максимальные возможности от минимального количества оборудования, чего-то более сложного, чем автоматический выключатель или термометр, проект, близкий к краю этого крошечного микроконтроллера. В конце концов, ограничения заставляют вас мыслить творчески, верно? Ну, вначале так и было.

Самым сложным в этом проекте было поместить весь код в ATtiny13. Микроконтроллер имеет 1 Кбайт флэш-памяти и всего 64 байта ОЗУ. Да, когда я говорю «байты», я имею в виду те, которые состоят из восьми бит. 64 байта для всех ваших локальных переменных и стека вызовов. Чтобы было понятно, рассмотрим, что нам нужно управлять 8 светодиодами RGB. Каждый из них определяется 3 байтами (по одному для красного, зеленого и синего каналов соответственно). Итак, чтобы сохранить состояние 8 светодиодов, нам нужно реализовать массив из 8 структур по 3 байта каждая, а указатель на начало этого массива займет еще один байт. Таким образом, 25 байтов из 64 отсутствуют. Мы только что израсходовали 39% оперативной памяти и еще не начали. Кроме того, для хранения семи основных цветов радуги вам понадобится 7 × 3 = 21 байт, поэтому 72% ОЗУ не хватает. Что касается основных цветов, я преувеличиваю: нам не нужны все они одновременно в ОЗУ, и они никогда не меняются, поэтому их можно реализовать как постоянный массив, который будет храниться во флеш-памяти вместо ОЗУ. Во всяком случае, это дает общее представление об используемом оборудовании.

Помня заявление Кнута о преждевременной оптимизации, я начал с прототипа трех режимов лампы по отдельности, чтобы посмотреть, что произойдет. Я протестировал их по отдельности, чтобы убедиться, что они работают правильно и каждый из них подходит для моего микроконтроллера. На это потребовалось несколько вечеров, и все шло хорошо… пока я не попытался собрать их вместе внутри оператора switch. Утилита avr-size сообщила о размере текстового раздела 1,5 КБ (с флагом -s для avr-gcc). В тот момент моим первоначальным намерением было взять немного ATtiny25 со вспышкой 2Kb, и это могло стать счастливым концом этой истории.

Но почему-то я почувствовал, что после значительной оптимизации мне удастся сжать этот дрянной код до 1 КБ. Однако потребовалась еще одна неделя, чтобы понять, что это невозможно, и еще одна неделя, чтобы это сделать. Пришлось разрезать радугу на пять основных цветов (без существенной визуальной разницы). Я избавился от операторов case и использовал цепочку if-then-if, чтобы уменьшить размер двоичного кода. Для анимации огня нужен генератор псевдослучайных чисел, который довольно громоздкий, поэтому я реализовал упрощенную версию LFSR с постоянным начальным значением. Меня не волнует полная длина цикла ГПСЧ, я просто ищу баланс между размером кода и «реалистичной анимацией огня». Я также реализовал множество мелких оптимизаций, которые сейчас не могу вспомнить, и мне даже удалось прошить все режимы, кроме огня, в чип. Когда у меня закончились идеи, мой общий код составлял около 1200 байт.

Я взял тайм-аут и много читал об оптимизации кода AVR. Я был близок к тому, чтобы сдаться и переписать все на ассемблере, но дал ему последний шанс. Во время финальной оптимизации я разделил радугу на три основных цвета и заставил рассчитывать другие на лету, я все проверил и выполнил рекомендации по оптимизации AVR и, наконец …

avrdude: запись flash (1004 байта):

Написание | #################################################################################################### | 100% 0,90 с

Нет необходимости говорить, что я использовал почти всю оперативную память и только один байт EEPROM для сохранения текущего режима. Я не говорю, что это идеальная и окончательная реализация. Он просто работает и подходит к микроконтроллеру. Я уверен, ты мог бы сделать это лучше. Я действительно. Я просто хочу поделиться удовольствием от решения явно непрактичной проблемы, которую вы вначале считали почти невозможной. «Таким образом, взлом означает исследование границ возможного…» - Ричард Столлман.

Запасы:

1x ATtiny13 MCU (0,28 доллара США = 0,24 доллара США за MCU в пакете SOP-8 и 0,04 доллара США за адаптер DIP8)

8x светодиодов WS2812 RGB (я рекомендую плату или кусок светодиодной ленты) (0,42 доллара США)

1x сенсорная кнопка TTP223 (0,10 доллара США)

1x переходник с Micro USB на DIP (0,14 доллара США)

1x резистор 10 кОм (<0,01 доллара США)

1x керамический конденсатор 100 нФ (<0,01 доллара США)

1x 10–47 мкФ электролитический конденсатор (<0,01 доллара США)

Итого <0,97 $

Шаг 1. Настройка программного обеспечения

Настройка программного обеспечения
Настройка программного обеспечения

Вам понадобится набор инструментов avr-gcc для компиляции исходного кода и утилита avrdude для загрузки ПЗУ микроконтроллера. Процесс установки довольно прост и понятен, но он зависит от вашей операционной системы. Если вы используете какую-то GNU / Linux, у вас, вероятно, уже есть подходящие пакеты в вашем дереве репозитория. Исходный код этого проекта можно скачать здесь:

github.com/arduinocelentano/t13_ws2812_lamp

Вам также понадобится библиотека light_ws2812:

github.com/cpldcpu/light_ws2812

Получив набор инструментов avr-gcc и исходники проекта, запустите терминал и введите следующий код:

cd путь / к / проекту

делать

Шаг 2: Программирование микроконтроллера

Программирование микроконтроллера
Программирование микроконтроллера
Программирование микроконтроллера
Программирование микроконтроллера
Программирование микроконтроллера
Программирование микроконтроллера

Если у вас есть какой-то программатор USBASP, просто подключите его к Attiny в соответствии с его распиновкой. Обычно это выглядит так, но я настоятельно рекомендую проверить вашу фактическую распиновку!

В качестве альтернативы вы можете использовать плату Arduino в качестве программиста. Откройте Arduino IDE и найдите пример Arduino ISP в меню «Файл → Примеры». После загрузки скетча ваша плата Arduino действует как программист. Комментарии в коде скетча дадут вам ключ к распиновке.

Теперь беги

сделать вспышку

прошить MCU и

сделать предохранитель

для установки битов предохранителей.

Рекомендуемые: