Еще в процессе отладки первой версии появился интерес к тому, как можно сделать цветной вариант жезла. При этом желательно оставаясь в ардуиновском аппаратном и программном пространстве и, конечно, без больших затрат на комплектующие.
Один вариант содержал 16 RGB-светодиодов, зажигаемых Ардуиной через 6 сдвиговых регистров типа 74HC595 посредством библиотеки shiftPWM. Он был слишком трудоемок для «проекта выходного дня» по числу соединений при том, что требовал какой-то хорошей идеи для организации управления, т. к. появление цвета уже требовало возможности менять его по желанию на ходу. Также, shiftPWM в вышеуказанной конфигурации на ATmega328P был способен только на достаточно низкую частоту ШИМ, что конкретно для фризлайтового применения выливалось в то, что полутона превращались в явно видимый пунктир.
Второй вариант — на 16 программируемых RGB-светодиодах WS2812B, собранных в линейку наподобие Adafruit NeoPixel. Здесь уже все гораздо лучше и с простотой соединений и качеством полутонов, т. к. ШИМ светодиодов осуществляется встроенным контроллером на высокой частоте. Светодиоды-«пиксели» управляются Ардуиной по последовательной шине с помощью библиотеки Adafruit NeoPixel (хотя имеются и другие варианты). Но тут опять главной проблемой явилось отсутствие в голове интересной идеи по управлению всеми этими замечательными возможностями.
И вот дотянулись руки до метровой ленты из 60 светодиодов WS2812B. Лента имеет множество осветительных и декоративных применений, может быть разрезана вплоть до единичных светодиодов. Но раз есть метр — интересно его проверить именно метром. Для удобства манипуляций ленту можно наклеить на подходящих размеров носитель (кусок кабель-канала, например).
Электрические соединения ленты с Ардуино настолько тривиальны, что не заслуживают даже картинки со схемой — GND к GND; +5V к +5V; DIn к D6 Arduino (можно не к D6, если учесть это в коде). Т. е. буквально три провода. Дабы минимизировать риск повреждения пикселей, Adafruit рекомендует DIn подключать к контроллеру через резистор 300 — 500 Ом и поставить на линии питания конденсатор на 1000 мкФ. Впрочем, игнорируя эти рекомендации пока ничего спалить не удалось, но предупреждаю. Органы управления минимизируем до одной кнопки, которая при нажатии будет закорачивать на землю D3, например.
Пиковое потребление такой ленты составляет около 0,8А при 5В. Поскольку ее придется активно перемещать в пространстве, питание удобно организовать USB-кабелем от портативного аккумулятора (aka PowerBank).
Повторим материалы списком:
- Адресная светодиодная лента на WS2812B
- Arduino UNO (Duemilanove, Nano, в общем, любая)
- Тактовая кнопка
- Резистор для линии DIn на 300-500 Ом (необязательно, но рекомендуется)
- Конденсатор 1000 мкФ (необязательно, но рекомендуется)
Ну и раз фризлайт, то фотоаппарат, умеющий делать длинные выдержки.
Если поставить задачу сделать знакогенератор и некоторую систему управления строками, имея богатство в виде 60 цветных пикселей по вертикали, то сроки ее решения могут отодвинуться за горизонт. Оставим ее пытливым умам. Сами же, будучи уже весьма ленивыми, сформулируем задачу просто — приспособить ленту для рисования картинок, т. к. 60 пикселей — это уже масштабы спрайтов, а не символов. Далее упростим все, что только можно.
Возьмем картинку 90 на 60 пикселей (60 — количество лампочек в линейке, 90 — произвольный, но разумный максимум ширины). Были некоторые сомнения в том, что пиксели способны отображать 24-битный цвет, в смысле сомнения в его отличии от 16-битного. Возможно, напрасные, но с учетом задачи, и 16-битный пойдет, а памяти надо будет на треть меньше. Получается, что картинка займет около 11 кБ памяти, поэтому разместить ее на Arduino UNO-образных можно только в ПЗУ и не больше двух таких картинок. Оставим одну за раз.
Соответственно, потребуется ПО:
- Arduino IDE с библиотекой Adafruit NeoPixel (меню «Скетч» — «Подключить библиотеку» — «Управлять библиотеками…»; найти через строку поиска и установить «Adafruit NeoPixel»).
- Скетч, который нужно будет залить в Ардуину (см. комментарии в коде).
- Графический редактор, например, Paint, GIMP и т. п. В нем мы уменьшаем нарисованную или загруженную картинку до 90 х 60. Это максимальные границы, можно меньше. Или чуть больше, но на следующем этапе лишнее будет проигнорировано. Сохраняем картинку в формате BMP.
- Конвертор картинок в массив данных. Нажимаем кнопку, выбираем нашу картинку, программа преобразует цвет пикселей в 16-битный формат (по 5 бит на красный и синий и 6 — на зеленый каналы) и рядом с собой сформирует подключаемый файл «inc_pic.cpp», который содержит двумерный массив с данными картинки и указание разместить его в ПЗУ микроконтроллера. Упомянутый файл нужно скопировать в папку с ардуино-скетчем, переписав поверх такой уже имеющийся.
Скомпилируем и загрузим скетч в микроконтроллер. После сброса или включения пробегают три разноцветных тестовых «сосульки», дающие понять, что контроллер жив и все светится (или не все и тут удобно видеть, кто виноват на последовательной шине). Далее, по нажатию на кнопку начинают воспроизводиться столбики картинки — надо успевать двигать линейку перед камерой…
В рамках сформулированной задачи — все получилось. )
В качестве домашней работы для заинтересовавшихся назовем пару улучшений, которые были бы полезны в данном случае:
а) Изготовление рассеивающих колпачков (или подобного), чтобы смягчить проблему больших интервалов между светодиодами. Альтернатива — прилепить вплотную еще одну ленту со смещением в один «пиксель».
б) Вывод картинок не из ПЗУ, а с SD-карты (и, может, с конверсией из неподготовленных картинок «на лету»). Соответственно, некоторый интерфейс для пользователя, чтобы можно было эти картинки выбирать. Или прямая трансляция столбиков, прилетающих по последовательному интерфейсу/блютузу от компьютера или смартфона.
Ленту, контроллер и прочие детали в Новокузнецке можно приобрести в магазине ВсеКомпоненты.ру