Оглавление:
Видео: Светодиодная лампа для настроения за 1 доллар с ATtiny13 и WS2812: 7 шагов
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:47
Подписаться Другие автора:
Это недорогая лампа для настроения с четырьмя режимами.
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 и
сделать предохранитель
для установки битов предохранителей.
Рекомендуемые:
Напечатанная на 3D-принтере светодиодная лампа для настроения: 15 шагов (с изображениями)
Светодиодная лампа для настроения с 3D-печатью: я всегда был очарован лампами, поэтому возможность сочетать 3D-печать и Arduino со светодиодами была тем, что мне нужно было реализовать. Концепция очень проста, а результат - один из самых приятных визуальных эффектов. впечатления, которые вы можете передать
Лампа для самодельного настроения: 6 шагов
Home Made Mood Lamp: Una Mood Lamp - это лампа для индивидуальной настройки цвета света. Продолжение се муэстра комо пуэдес хацер уна кон ун Принципиальный комплект Arduino y materiales caseros
Лампа для настроения RGB Icosahedron: 9 шагов (с изображениями)
RGB Icosahedron Mood Lamp: геометрические формы всегда привлекали наше внимание. Недавно наше любопытство привлекла одна такая удивительная форма: Икосаэдр. Икосаэдр - это многогранник с 20 гранями. Разных форм икосаэдров может быть бесконечно много, но
Низкополигональная светодиодная лампа для настроения: 9 шагов (с изображениями)
Низкополигональная светодиодная лампа для настроения: отличное дополнение к любому столу, полке или столу! Дискретная кнопка, расположенная на основании, позволяет переключаться между различными схемами светодиодного освещения. Неважно, хотите ли вы использовать свою лампу для учебы, отдыха или даже вечеринок … есть несколько
Светодиодная лампа для настроения: 9 шагов (с изображениями)
Светодиодная лампа для настроения: недавно я наткнулся на светодиодный куб Грега Дэвилла. Это отличное произведение искусства. Вдохновленный этим, даже мне захотелось сделать что-то подобное. Но этот был выходом из моей лиги. Я решил делать шаг за шагом и уменьшил v