Управление адресной светодиодной лентой через NRF24L01+

Zarboz

✩✩✩✩✩✩✩
17 Фев 2019
4
2
Народ, всем доброго времени суток! Задача: есть 2 костюма, на которые будут нашиваться куски адресных лент. Нужно обеспечить полную синхронность отображения эффектов на этих костюмах. Если их просто одновременно включить - боюсь через какое-то время появится сдвиг по времени отображения, а это недопустимо. Хочу использовать для управления модуль NRF24L01+ без антенны. Один управляющий блок, и два приемных. По факту на приемниках будут зашиты сами эффекты, а через NRF нужно только передавать номер эффекта и внутренности функции LOOP. Кто-то реализовывал что-либо подобное? С какими подводными камнями (помимо питания) вы сталкивались?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,185
1,280
Москва
боюсь через какое-то время появится сдвиг по времени
Правильно боитесь.
Я такое не делал, но немного думал про это.
Первое , что приходит в голову - максимально синхронизировать время. На одном ПК вывести в монитор что то и второй вывод сделать скажем через час. Т.е. используя delay(3600000); А далее для обоих лент вычислить реальную секунду, скажем 984 для одой 1003 для другой. Так можно минимизировать расхождение.
Использование внешних синхронизаторов. Тут есть некоторые ограничения. Например у NRF максимальная скорость 2мбит/сек, т.е. ~ 260 000 байт. При частоте обновления ленты 25 получается... хм, получается 3400 светодиодв, оказывается вполне прилично! (что ж я раньше то не считал?) .
Т.е. теоретически можно на одном устройстве создать массив данных и отправить его на вторую ленту (если отправлять на 2 ленты нужно в 2 раза больше времени и вероятность ошибки тоже повысится). При этом нужно будет только синхронизировать вызов команд отображения - на ведущей ленте настроить задержку. Но могут быть ошибки передачи и пропуски данных. С этим придется бороться. На 2мбит работает автоподтверждение приема, и если оно не будет получено - то надо повторять весь пакет. Тут уже надо придумывать протокол передачи , или найти подходящую настройку. Можно снизить скорость передачи данных до 1мбит - все равно должно хватить.
Да, NRF совсем без антенны работать не будет. Видимо имеется ввиду антенна на самой плате. Так вот дальность у них сильно ограничена.
Есть еще вариант требующих нестандартных усилий в качестве программиста: для каждого из эффектов придумать функцию, которая по уникальному номеру кадра будет считать цвет всех светодиодов. Такое очень просто реализуется для радуги, но как такое реализовать для эффектов со случайной генерацией цветов или шумов я не знаю. Но зато синхронизация идет отправкой буквально одного числа.
Так что самое простой получается передавать весь массив данных.
Начните с того, что подключите и соедините 2 модуля NRF и посмотрите как один передает данные другому. По возможности на максимальных предполагаемых расстояниях.
 

Сотнег

★★★★★★★
15 Янв 2020
4,123
1,439
@Zarboz,
в прошивке Gyverlamp2 для лампы Гайвера
можно посмотреть решения по синхронизации эффектов.
Вроде бы, там собственный рандомайзер с передачей текущего такта.
 

bort707

★★★★★★✩
21 Сен 2020
2,894
860
@Zarboz, если эффекты ленты заранее известны- то как вы и написали - нужно передавать только номер эффекта. Для синхронизации применяйте тактовые импульсы - то есть расставьте по эффектам ключевые точки и начинайте выполнение следующей части только по приходу импульса от "главного" модуля.
Работа нескольких приемников от одного передатчика нрф возможна, если выключить автоподтверждение
 
  • Лойс +1
Реакции: Zarboz

Старик Похабыч

★★★★★★★
14 Авг 2019
4,185
1,280
Москва
@bort707, Даже с подтверждением несколько приемников будет получать данные от одного передатчика. но не будет точно понятно от какого приемника пришло подтверждение. Лично я не пробовал, но вроде есть видео где то. Откуда то это же в голове есть?
 

bort707

★★★★★★✩
21 Сен 2020
2,894
860
@Старик Похабыч, с подтверждением не пробовал, и сомневаюсь, не сбрендит ли передатчик, получая по нескольку подтверждений на одну отправку. А без подтверждения все отлично работает, проверено лично.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,834
589
44
то есть расставьте по эффектам ключевые точки и начинайте выполнение следующей части только по приходу импульса от "главного" модуля
Если синхроимпульс по какой то причине не придет, то анимация пропустится на такт. Нужно начинать ждать синхроимпульс чуть заранее, если не приходит N времени - продолжать анимацию.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,185
1,280
Москва
Если синхроимпульс - последовательность чисел, то отследить пропуск элементарно и можно сделать нужное кол-во импульсов. Т.е. ведомый сможет догнать ведущего. Но это уже детали
 

Zarboz

✩✩✩✩✩✩✩
17 Фев 2019
4
2
@Zarboz, если эффекты ленты заранее известны- то как вы и написали - нужно передавать только номер эффекта. Для синхронизации применяйте тактовые импульсы - то есть расставьте по эффектам ключевые точки и начинайте выполнение следующей части только по приходу импульса от "главного" модуля.
Работа нескольких приемников от одного передатчика нрф возможна, если выключить автоподтверждение
Вот это я и хочу сделать. Именно по тактовым импульсам синхронизировать.
 

kostyamat

★★★★★★✩
29 Окт 2019
1,097
630
@Zarboz, масса эффектов использует в своей работе шумы и random(). Как вы их будете синхронизировать?
Единственный нормальный способ вижу в использовании esp8266 как приемник потока по протоколу E13.1 от ноутбука с программой Jinx, LedFX, xLights и т.п.
Готовое тут https://github.com/debsahu/E131_PixelPusher
 
  • Лойс +1
Реакции: Lumenjer

Lumenjer

★★★✩✩✩✩
10 Дек 2020
220
112
масса эффектов использует в своей работе шумы и random(). Как вы их будете синхронизировать?
Рандом можно поправить на "свой", у которого будет один и тот же seed на всех устройствах, а при переключении эффекта просто сбрасывать "счетчик" рандома.
 
  • Лойс +1
Реакции: bort707

kostyamat

★★★★★★✩
29 Окт 2019
1,097
630

@Lumenjer,
Та все можно написать, было бы время и желание. :)
Я уже говорил, что в принципе, эффекты можно вращать на третьем контроллере esp8266, и вместо вывода на ленту гнать вывод, в том же протоколе E13.1, исполнителям. Получится вполне себе автономная система. Это наверное проще написать, чем всю эту галиматью с синхронизацией, "своим" шумом/рандомом и т.п.

*** Имхо, задача не для Нано+ нрф.
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
375
94
Единственный нормальный способ вижу в использовании esp8266 как приемник потока по протоколу E13.1 от ноутбука с программой Jinx, LedFX, xLights и т.п.
С таким подходом целую серверную можно использовать.
А сихронизацию можно осуществить примерно так:
1. Даём некий сихроимпульс на первый костюм.
2. Первый костюм дает синхроимпульс на второй костюм.
Время на "обдумывание" и приём-передачу в районе 1 мс. Это до жо..в общем за глаза.
 

rkit

★★★✩✩✩✩
5 Фев 2021
479
114
боюсь через какое-то время появится сдвиг по времени отображения, а это недопустимо
А что, если вместо того, чтобы бояться, взять да посчитать реальный дрейф? Не выяснится ли, что даже с дешманским 30ппм кварцем, для рассинхронизации в десятую секунды нужно будет держать костюм включенным несколько суток?