В прошлой статье я рассказал как собрать светодиодную гирлянду-экран из адресных светодиодов. Однако, у такой конструкции есть вполне очевидный недостаток - необходимость работы компьютера с управляющей программой Jinx! В этой статье я расскажу как избавиться от компьютера в этой схеме и обеспечить автономную работу гирлянды.
Применение для управления гирляндой протокола ArtNet дает как огромную гибкость, так и проблему в виде наличия управляющего компьютера. Держать включенным мощный настольный компьютер ради гирлянды - не особенно то и удобно, шумно, да и электричества он потребляет достаточно много. Один из вариантов решения - переработать код управляющего контроллера таким образом, чтобы в отсутствие сигнала ArtNet экран воспроизводил какие-либо эффекты сам, либо считывал их с какой-либо внешней памяти.
Я же пошел по пути замены мощного настольного компьютера дешевым одноплантным компьютером, который воспроизводит предварительно записаную последовательность пакетов ArtNet. Я применил дешевый Orange Pi Zero в варианте с 256Мб оперативки, но можно использовать любой другой одноплатник с Linux на борту.

Добыть такой же можно на всеми любимом AliExpress. Следующим шагом нужно поставить на него операционку - я выбрал Armbian. В случае другого одноплатника операционка может быть и другой, однако, если дистрибутив на основе Debian - принципиально ничего не поменяется. Внимание! Конкретно у этой модели есть проблемы с стабильностью работы встроенного модуля Wi-Fi. Поэтому, если хочется идеальной работы - лучше соединить компьютер с роутером Ethernet-кабелем. Либо взять USB Wi-Fi модуль. Ну, или другую модель.
Установив Armbian на одноплатник и проведя базовую настройку системы и сети, переходим к программе, которая обеспечит воспроизвдеение заранее записанных пакетов ArtNet. Называется она udpreplay, и взять ее можно в виде исходных кодов с GitHub.
Для этого создадим каталог, перейдем в него и воспользуемся командой
git clone https://github.com/rigtorp/udpreplay.git
После чего перейдем в директорию src и сделаем небольшой патч в файле udpreplay.c, который не даст программе останавливатся с ошибкой если по каким-либо причинам пакет не будет отправлен.
Для этого в сегменте кода
if (n != len) {
std::cerr << "sendto: " << strerror(errno) << std::endl;
return 1;
}
Просто комментируем возврат единицы, чтобы получилось так:
if (n != len) {
std::cerr << "sendto: " << strerror(errno) << std::endl;
//return 1;
}
Далее поднимаеся в базовый каталог и выполняем данную последовательность команд.
sudo apt install cmake libpcap-dev g++
cd udpreplay
mkdir build && cd build
cmake ..
make
Поздравляю, программа собрана и установлена. Осталось добавить ее в автозапуск. Для этого мы создадим сервис.
sudo nano /etc/systemd/system/led.service
В созданном файле нужно написать следующий код:
[Unit]
Description=Leds
After=network.target auditd.service
[Service]
Type=simple
Restart=on-failture
RestartSec=5
StartLimitIntervalSec=0
ExecStart=/usr/local/bin/udpreplay -i wlan0 -r -1 -c 40 /home/user/ny.pcapng
[Install]
WantedBy=multi-user.target
Назначим флаг исполнения и обновим настройки сервисов
sudo chmod +x /etc/systemd/system/led.service
sudo systemctl daemon-reload
sudo systemctl enable led.service
Наш сервис настроен и будет воспроисзодить файл пакетов /home/user/ny.pcapng сразу после старта. Осталось записать нужные пакеты и загрузить их на одноплатник. Для этого, на компьютере, где мы ранее поставили и настроили Jinx! ставим программу Wireshark. После чего запускаем ее, активируем захват пакетов и стартуем Jinx!. Играем с эффектами, формируя нужную последовательность, после чего выключаем Jinx! и останавливаем запись пакетов. Сохраняем файл захвата куда-нибудь, назвав его, например ny.pcapng. Все, что сталось - передать его на одноплатник, для этого мне нравится использовать утилиту pscp.exe из пакета Putty.
pscp.exe ny.pcapng user@singleboard.ip:/home/user/ny.pcapng
Вводим пароль пользователя и дожидаемся конца передачи файла. Все, все готово! Осталось подать питание на гирлянду и одноплатник - и все весело оживет.
С Новым годом! Увидимся в новом году!