Спортивное табло: волейбол

nickdsl

✩✩✩✩✩✩✩
22 Дек 2022
5
0
Всем доброго времени суток. Эта очередная моя итерация попробовать что то самому сделать. В прошлый раз все закончилось тем, что я все что накупил отдал соседу в благодарность за помощь. Но в тот раз не было идеи, а в этот раз решил я сделать электронное табло на адресной RGB ленте.

Зачем: у нас на районе все пользуются аналоговыми перекидными табло которые надо постоянно перекидывать, они рвутся (листки с цифрами), прилипают, да и вообще это прошлый век. Захотелось сделать что то такое, чего еще тут у нас не было. Покупать готовое решение можно, но оно стоит в разы дороже чем моя будущая поделка (да и если покупать все готовое, то я так ничего и не сделаю сам).

Что у меня есть:
- веб сервер и приложение на фреймворке Flask которое позволяет вести счет на любом устройстве (ПК, смартфон и т.п.). Я снимаю ролики игр в волейбол и захотел сделать счет на монтаже (как по телевизору). Данное приложение как раз в этом помогает т.к. если попросить человека вести счет на телефоне, то после окончания игры получится текстовый файл с протоколом игры где есть временные метки событий (набор очка и т.п.).

Как я хотел сделать:
  • взять компьютер одноплатник (типа Rasberry Pi)
  • на нем поднять мой веб сервер на Flask
  • подключить туда табло (ленту)
  • компьютер поднимает свою Wi-Fi сетку к которой судья/секретарь подключатся телефоном и открывает в браузере веб-приложение
  • после окончания игры есть файл на основании которого можно: распечатать/создать PDF с протоколом матча, использовать данные для видеомонтажа со счетом, как доп. функции можно еще на игре контролировать правильность расстановки игроков и вообще все что угодно. Правда это к табло конкретно не относится, это функции приложения.

Что у меня уже есть:
  • куплен OrangePi 3 LTS
  • куплен Arduino Uno R3
  • куплено 5 метров ws2812b 60ppm
  • куплен блок питания 5v 8A

Что у меня сразу не получилось:
- Заставить работать ленту на OrangePi.
Подробности: Я думал, что сейчас качну библиотеку и начну экспериментировать. Столкнулся с тем, что большинство из того что я нашел это проекты/библиотеки под RasberryPi и Arduino (его я еще на тот момент не купил). Кое как наткнулся на short видео на YouTube где какой то умелец показывал что у него RGB лента работает на OrangePi Zero кажется. Я начал ему писать в комментариях и он подсказал, что можно через SPI управлять. У меня даже отчасти это получилось, но почему то всегда первый пиксель горел строго зеленым + отправка нулей не тушила ни один пиксель. Затем я взял паузу с этим занятием в несколько дней. Ко мне уже приехала Arduino Uno R3 и я проверил на ней работоспособность ленты. Подключил FastLed, посмотрел на радугу, попробовал еще раз подключить ленту к OrangePi и почему то на этот раз оно вообще отказалось работать. В итоге решил использовать связку Arduino (контроль ленты) + OrangePi (все остальное). Подключил их друг к другу usb кабелем и начал пытаться что то делать с модулем Serial. И тут вторая сложность.

- Плохое быстродействие при передаче данных.
Данные я решил передавать в виде JSON объекта (строка в юникоде которая предварительно перед отправкой методом encode() конвертируется в бинарный формат).

Мой скетч на ардуино умер из-за нехватки памяти при попытки сериализации полученных данных в структуру из которой можно извлекать поля.
Не придумав ничего лучше, я решил дробить исходный JSON объект на более мелкие.
Его структура примерно такова: { "id": int, "timestamp": int, "length": int, "start": int, "stop": int, "data": [ [int, int, int], ... ] }
Т.е. я передаю ардуино длину массива каждый элемент которого это вложенный массив из трех чисел (R,G,B).
Поля start и stop я ввел дополнительно когда решил дробить массив data на более мелкий, чтобы arduino смог переварить мои хотелки.
В итоге опытным путем вычислил, что можно слать данные за раз примерно о 18 ячейках.
И тут как раз и кроется проблема в быстродействии. Если я не делаю паузу где то в секунды 2 между отправками порций, то arduino не обрабатывает данные т.к. сразу начинает читать вторую пачку.

Сейчас это работает, но медленно. А представить себе, что пользователь нажимает на телефоне кнопку условного "+" и счет обновляется где то, например, секунд через 5. Это мягко говоря такое себе.

Собственно с этой личной болью новичка я пришел сюда за помощью.
Параллельно наткнулся на проект бегущей строки от Гайвера https://community.alexgyver.ru/threads/beguschaja-stroka-obsuzhdenie-proekta.1665/
Там все построено на bluetooth, возможно стоит более детально изучить этот проект и отталкиваться от него.

Если у Вас есть какие то советы касаемо реализации или ускорения работы, то буду очень благодарен.


Ленты у меня всего 5 метров (300 пикселей). Посчитал, что у Гайвера в проекта было немного больше. Покупать ленту ради этого пока не охота. Хочу просто порезать ленту на сектора по знакоместам и спаять все проводами.
Посчитал, что на это должно уйти примерно 266 из 300 пикселей.

firstprototype_many_leds_copy.ino - скетч целью которого было просто для начала добиться коммуникации OrangePI и Arduino. Если бы все было быстро, то уже бы приступал к визуализации цифр на знакоместах, но пока с текущими проблемами не до этого (не вижу смысла).

orange_pi_data_generator.py.txt - код на стороне OrangePi который отправляет Arduino структуру данных согласно которой та должна зажечь ленту.
 

Вложения

poty

★★★★★★✩
19 Фев 2020
2,956
886
1. Напишите "общение" с лентой сами. Что Вы упёрлись в библиотеки? Для настолько простого вывода как табло не нужно 99% функций FastLED. Кроме того, исключаем Ардуино.
2. Если настаиваете на связке PI - Mega, то, во-первых, передавайте не графику, а "знаки", тогда можно будет сэкономить на трафике между устройствами. 266 пикселей при передаче даже в RAW-формате - это около 800 байт, в знаках это будет на порядок меньше точно
3. Не используйте тэгированную передачу и скриптовые языки на процессорах с мизерной памятью. Только компилированный код с жестким протоколом!
 

nickdsl

✩✩✩✩✩✩✩
22 Дек 2022
5
0
1. Напишите "общение" с лентой сами. Что Вы упёрлись в библиотеки? Для настолько простого вывода как табло не нужно 99% функций FastLED. Кроме того, исключаем Ардуино.
Да потому что я новичок. Я даже не знаю с чего начать, чтобы написать это "общение". У меня есть поверхностные знания о принципе работы адресных лент. Что там тайминги есть высоких и низких сигналов, которые интерпретируются как 1 и 0. Про направление передачи данных и все такое. А вот так сесть и написать, я не знаю с чего начать. Библиотека, да, согласен, не нужна.
Ардуино я изначально не рассматривал вообще. Хотел взять максимально дешевые компоненты и из-за этого взял OrangePi вместо RasberryPi.
Но у меня лента не работает. Есть гипотеза, что возможно это из-за того, что, скорее всего на *Pi используется напряжение 3.3v,а для ленты оно должно быть в диапазоне 3.5 - 5.3v. Для проверки этой гипотезы я заказал себе двусторонний преобразователь логического уровня 3.3 <-> 5v. Попробую через него подключить управляющий провод, может заработает.


2. Если настаиваете на связке PI - Mega, то, во-первых, передавайте не графику, а "знаки", тогда можно будет сэкономить на трафике между устройствами. 266 пикселей при передаче даже в RAW-формате - это около 800 байт, в знаках это будет на порядок меньше точно
Нет, не настаиваю. Как по мне чем меньше компонент, тем лучше потому что получается проще, дешевле. Про передачу в знаках я уже тоже сам подумал.

3. Не используйте тэгированную передачу и скриптовые языки на процессорах с мизерной памятью. Только компилированный код с жестким протоколом!
А можно пример как это?
 

rkit

★★★✩✩✩✩
5 Фев 2021
471
114
Это делается на esp32, а ты набрал просто худшего оборудования, которое только можно найти.
И да, напряжение нужно преобразовывать, иначе работает через раз.
Самостоятельно писать протокол не надо. Это пустая трата времени, хоть и не так и сложно.
 

nickdsl

✩✩✩✩✩✩✩
22 Дек 2022
5
0
... а ты набрал просто худшего оборудования, которое только можно найти.
Ну что поделаешь. Это опыт.

И да, напряжение нужно преобразовывать, иначе работает через раз.
Значит arduino получится выкинуть из схемы.

Самостоятельно писать протокол не надо. Это пустая трата времени, хоть и не так и сложно.
А как надо?
 

poty

★★★★★★✩
19 Фев 2020
2,956
886
@nickdsl, чтобы использовать библиотеки их для PI нужно ещё найти. Если они есть, и в память влезают, то можно использовать и их.
Но для простого вывода достаточно небольшой процедурки, только и всего. Да, возможно над ней попотеть придётся, если новичок, зато это будет действительно Ваше.
 

nickdsl

✩✩✩✩✩✩✩
22 Дек 2022
5
0
Для расбери пи есть библиотека от неопикселов для питона. Сам использовал.
Да, я когда Orange Pi получил сразу полез туда. Попробовал запустить. Мой скрипт упал при инициализации не опознана плата.
Начал копать глубже. Докопал до того что в библиотеке в качестве проверки платформы идет cat /proc/cpuinfo | grep "Hardware: [имя конкретного проца]"
В моем cpuinfo такого поля Hardware нет тупо) вот оно и не проходит проверку.
Игнорировать эту проверку не стал. Хотя кто его знает, может и заработает.
 

bort707

★★★★★★✩
21 Сен 2020
2,859
850
@nickdsl, вам же написали, что не надо это делать на Pi! Вы ответы не читаете что ли?
Возьмите плату ЕСП32, она стоит 250 -300р - ее под вашу задачу хватит с лихвой. И сигналы по сети принимать, и лентой управлять.
И код под нее написать будет на порядок проще, потому что подобных проектов в сети десятки
 
  • Лойс +1
Реакции: Boroda22 и Divin

edvord

✩✩✩✩✩✩✩
4 Фев 2021
7
1
Всем привет.Скеч примерно есть готовый под ESP и адресной ленты под проект табло ? И каким приложением управлять?
хотя бы примеры отчего отталкиваться