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

Применение для управления гирляндой протокола ArtNet дает как огромную гибкость, так и проблему в виде наличия управляющего компьютера. Держать включенным мощный настольный компьютер ради гирлянды - не особенно то и удобно, шумно, да и электричества он потребляет достаточно много. Один из вариантов решения - переработать код управляющего контроллера таким образом, чтобы в отсутствие сигнала ArtNet экран воспроизводил какие-либо эффекты сам, либо считывал их с какой-либо внешней памяти.

Я же пошел по пути замены мощного настольного компьютера дешевым одноплантным компьютером, который воспроизводит предварительно записаную последовательность пакетов ArtNet. Я применил дешевый Orange Pi Zero в варианте с 256Мб оперативки, но можно использовать любой другой одноплатник с Linux на борту.

Orange Pi Zero

Добыть такой же можно на всеми любимом 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

Вводим пароль пользователя и дожидаемся конца передачи файла. Все, все готово! Осталось подать питание на гирлянду и одноплатник - и все весело оживет.

С Новым годом! Увидимся в новом году!