Добавить отступы в матрице из ws2812b (NeoMatrix)

alwwwex

✩✩✩✩✩✩✩
22 Янв 2021
3
0
Добрый день!

Сделал большую матрицу на несколько окон из светодиодов WS2812B. Пока использую библиотеки от Adafruit (NeoMatrix), в дальнейшем можно будет перевести на любую более подходящую. Столкнулся с вопросом, для решением которого пока не нашел нормальных вариантов..

Светодиоды соединены следующим образом:

matrix.png

Стандартная змейка, с перемычками с окна на окно. Все работает как положено, однако из-за большого расстояния между окон (рама + диоды не у самого края) получается так, что при движении пикселей с одного окна на другое - изображение перескакивает сразу и визуально растягивается на ширину между пикселями окон, это вполне логично...

Первое решение - просто добавить еще 12 пикселей (2 ряда - синие на картинке) между окнами и спрятать их куда-то. После этого задекларировать матрицу как бОльшую по ширине и при переходе с окна на окно картинка будет "скрываться" за рамами - решение проблемы, однако весьма не рациональное..

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

Я пытаюсь добавить данную возможность в библиотеку NeoPixel, но возможно кто-то знает более простое решение вопроса или уже существующую библиотеку с поддержкой вот таких "слепых" зон?

Спасибо!
 

kDn

★★★★★✩✩
18 Ноя 2019
1,103
437
Да элементарно все делается. В нашем варианте прошивки через кастом мапинг, т.е. есть единая функция пересчета координат в которой можно задать произвольное расположение диодов. Но это под FastLed, поглядите может что-то аналогичное и под NeoPixel есть.
 

alwwwex

✩✩✩✩✩✩✩
22 Янв 2021
3
0
Проект ожил очередной раз к новому году) В прошлом году отказался от анимации из окна в окно и решил что оставлю на следующий год. Сейчас уже неделю пытаюсь разобраться с FastLed. В целом на нее уже есть портированные функции (например библиотека - FastLed-NeoMatrix) которая позволяет использовать Adafruit_GFX с FastLed. Однако если с обычными функциями анимации по пикселям все более менее понятно, то как быть к примеру с выводом текста или битмапов? Выходит, эта функция XY должна быть внедрена в саму библиотеку, в место вывода фрейма? И по факту она выводит порядковый номер в зависимости от X/Y координат?
 

Сотнег

★★★★★★★
15 Янв 2020
4,123
1,439
@alwwwex,
эта функция в любой прошивке, рисующей по координатам, уже есть.
Её нужно просто подправить.
В самом верху добавить две строчки:
if (x>7) x -= 2;
else if (x>5) x += 6;

Ну и размер "матрицы" в настройках скетча задать на 2 пикселя шире.
задекларировать матрицу как бОльшую по ширине

Вы что-то с нуля изобретаете?
Почему не взяли готовую прошивку?
 
Изменено:

alwwwex

✩✩✩✩✩✩✩
22 Янв 2021
3
0
@Сотнег, Дело в том, что таких окон у меня 6, и хотелось бы писать свои анимации используя обычные функции вывода текста/битмапов, но так, что бы при движении картинка как бы "перекрывалась" рамой между окнами (ориентировочно равно двум столбикам диодов) а не перескакивала сразу с одного окна на следующее.. И вот я столкнулся с тем, что добавить "виртуальные" пустые зоны стандартной прошивкой вроде как нельзя..
 

Сотнег

★★★★★★★
15 Янв 2020
4,123
1,439
@alwwwex,
я вам написал, что изменить, чтобы "не перескакивала".

Это решает вашу проблему в любой "стандартной прошивке".