Всем доброго времени суток. Эта очередная моя итерация попробовать что то самому сделать. В прошлый раз все закончилось тем, что я все что накупил отдал соседу в благодарность за помощь. Но в тот раз не было идеи, а в этот раз решил я сделать электронное табло на адресной RGB ленте.
Зачем: у нас на районе все пользуются аналоговыми перекидными табло которые надо постоянно перекидывать, они рвутся (листки с цифрами), прилипают, да и вообще это прошлый век. Захотелось сделать что то такое, чего еще тут у нас не было. Покупать готовое решение можно, но оно стоит в разы дороже чем моя будущая поделка (да и если покупать все готовое, то я так ничего и не сделаю сам).
Что у меня есть:
- веб сервер и приложение на фреймворке Flask которое позволяет вести счет на любом устройстве (ПК, смартфон и т.п.). Я снимаю ролики игр в волейбол и захотел сделать счет на монтаже (как по телевизору). Данное приложение как раз в этом помогает т.к. если попросить человека вести счет на телефоне, то после окончания игры получится текстовый файл с протоколом игры где есть временные метки событий (набор очка и т.п.).
Как я хотел сделать:
Что у меня уже есть:
Что у меня сразу не получилось:
- Заставить работать ленту на 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 структуру данных согласно которой та должна зажечь ленту.
Зачем: у нас на районе все пользуются аналоговыми перекидными табло которые надо постоянно перекидывать, они рвутся (листки с цифрами), прилипают, да и вообще это прошлый век. Захотелось сделать что то такое, чего еще тут у нас не было. Покупать готовое решение можно, но оно стоит в разы дороже чем моя будущая поделка (да и если покупать все готовое, то я так ничего и не сделаю сам).
Что у меня есть:
- веб сервер и приложение на фреймворке 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 структуру данных согласно которой та должна зажечь ленту.
Вложения
-
4.1 KB Просмотры: 6
-
8.1 KB Просмотры: 5