All streams
Search
Write a publication
Pull to refresh

Comments 37

Мда , без DMA нынче никак. Как удалось уместить столь навороченный код в stm32f4 ? Может стоило raspbery pi 4 ?

Код, на мой взгляд, не такой и навороченный, главное разобраться в алгоритме работы самой ленты и аккуратно его выполнять

А насчёт малинки идея хорошая, к сожалению на данный не располагаю ею, может в будущем реализую и на ней

Ну вообще DMA - наилучшее решение для такой задачи. А вы что предлагаете, CPU дергать два раза на каждый бит? Зачем, если можно этого не делать.

Решается. Но ИМХО было очень интересно узнать, как подобная задача решается с помощью аппаратных таймеров STM32. В своё время я делал подобное на STM32 Discovery, но интервалы в 400 нс выдерживал с помощью тучи asm("nop"). Без циклов.

__disable_irq(); //Лочим прерывания
{
GPIOC->ODR = VALUE_C0; asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); 
GPIOC->ODR = VALUE_C1; asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
GPIOC->ODR = VALUE_C2; asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
GPIOC->ODR = VALUE_C3; asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
...
100500 строк
}
__enable_irq(); //Разрешаем прерывания

В комментариях умные люди мне объяснили про эти таймеры, а в данной статье ещё и наглядный пример, как с ними управляться в задаче, подобной той, что я решал. И хотя это не совсем мой случай, всё равно, информация очень полезная.

Аппаратные таймеры STM32 очень навороченные, с кучей разных флагов и режимов, и примеры работы с ними — это хорошо. А уж с Bluetooth — вдвойне.

Может стоило raspbery pi 4 ?

Имхо это из пушки по воробьям. У меня была схожая задача, только лента была не одна а 17. Я пытался, в том числе, решать её и малинкой, т.к. опыта не было, а классические подходы не срабатывали.

И даже с учётом этого всего малинка — это перебор. А уж для одной ленты тем более. В итоге я остановился как раз на STM32.

Подозреваю, что в исходном сообщении сильно не хватает тега sarcasm

Малина даже не перебор, она просто для таких задач не предназначена. Для вывода таких критичных ко времени битовых последовательностей там используют либо PWM, либо SPI, и то и то немного костыльно и на 17 лент никак не масштабируется. Всё-таки для каждой задачи нужен свой инструмент, и данном случае это микроконтроллер.

Для rpi нужен модуль ядра. Возможно, он там уже есть.

Да, не подумал про модуль ядра. Но мне все равно не нравится идея занимать процессор bit-banging-ом, даже из ядра.

1 бит - 1 мкс. 1 светодиод - 3 мкс. 300 светодиодов - 1 мс. Пока их < 1000, можно не париться.

Имхо главная проблема не в загрузке CPU, а в том, что выдерживание таких точных интервалов на CPU задача не очень приятная, и по возможности её лучше скидывать на более специализированные железяки

Что-то не сходится. 1бит = 1.25мкс, 1 светодиод=24бита=30мкс, 300светодиодов=9мс. Блокировать прерывания в ОС на 9мс уже кажется плохой идеей, а если мы анимацию выводим, скажем, с частотой 25к/с, то это 9мс каждые 40мс, чуть не 25% всего времени.

на малинах есть масса готовых решений для светодиодов, стоит ознакомиться, разные варианты решения. dma тоже можно запить, но это будет история прямым доступам к регистрам

Дак я не спорю, сам таким пользуюсь в одном проекте (через SPI). Но это не отменяет того, что я считаю Linux неподходящим для этого инструментом.

Вот да. Насчёт есть — не уверен, по крайней мере, в стоковом Дебиане я такового не нашёл, пришлось писать самостоятельно. И всё ради возможности лочить прерывания.

Хотя лучше, конечно, просто накатить ОС реального времени.

А почему в вашем случае понадобилось 17 лент вместо одной? Судя по току питания (120А) предположу, что там были десятки тысяч светодиодов и необходимость динамических эффектов, поэтому пришлось разбивать на сегменты, чтобы уложиться по таймингам?

пришлось разбивать на сегменты, чтобы уложиться по таймингам?

Так точно. Светодиодов там правда не десятки тысяч, а всего чуть больше 2к. Это подсветка вокруг видеостены.

Надо было получить в играх низкий лаг и быстрое обновление. При стандартном подходе это давало 1–2 фпс.

Ток в пике 90А, просто ленты низковольтовые, а БП подобраны с запасом.

При стандартном подходе это давало 1–2 фпс

На 1 светодиод около 3 мкс. 2000 светодиодов - 6 мс.

Эм. Если брать протокол WS2812b, то мы на 1 диод тратим

24 бита × 1,25 мкс + 30 мкс пауза между цветами = 60 мкс

2315 диодов × 60 мкс + 100 мкс пауза между кадрами = 139 мс

Плюс ещё время на приём с компа и обработку.

Упсь, точно. 1 мкс не на диод а на бит конечно. Тогда да, распараллеливать, и никакого битбанга.

У меня как раз параллельный битбанг получился, просто руками за раз не одна, а сразу 16 ног переключается. Три переключения = передали по 1 разному биту сразу на 16 лент.

ну в этом проекте уже даже неважно КАК, сама статья - просто шедевр.

В наличии у меня имеется микроконтроллер семейства AVR

Если вы про STM32, то это ARM.

Опечатался, благодарю что заметили

И чем же эта статья отличается от тонны остальных в интернете включая зарубежные? В коде каждая строка разделена пробелами, зачем? Как такое читать потом?

Предлагаю в следующей части вместе HC-06 использовать stm32wb55 где уже есть все необходимое для Bluetooth... Чтобы антенну не разводить, можно взять SOM, такой как STM32WB55MMG

Идея хорошая, я думал над этим

Но никак не мог подобрать модель stm

Это хорошее предложение для продукта, но плохое для DIY-проекта из статьи. Их SOM с антенной в BGA корпусе, так что установить его на плату еще не всякий самодельщик сможет. Для самоделок с блютусом гораздо лучше подходит ESP32, которые покупаются на али еще дешевле, чем STM32+HC06. Ну или если обязательно хочется ST, купить платку с STM32WB на али, вроде тоже доступно.

ой да тут на этой микрухе каждый второй спаял себе flipper zero (сарказм, основаный на одной беседе про это).

НО с этой микрухой есть готовая платка - модуль для diy

Статья забавная, но применённый подход устарел лет на 5 минимум. Сам в своё время развлекался с blue pill и ws2812. Сейчас куда проще всё это реализовать на esp32.

А чтобы не заниматься изобретением велосипеда есть FastLED, в котором всё описанное есть и есть намного намного больше.

Кстати, по поводу дма...

Я однажды запускал гирлянду (было желание/необходимость и проект Гивера), но Ардуино я не люблю.

В поисках информации о управлении через stm32 нашел (уже готовый) пример работы через bit-banding. Это позволило сократить используемую память практически в восемь раз, на сколько я помню.

https://www.martinhubacek.cz/blog/stm32-ws2812b-dma-library/

Моя реализация у меня в гитхабе, ссылку давать не буду, если интересно, и так найдёте 😉

А за счет чего аж в 8 раз? Индексированный цвет?

Sign up to leave a comment.

Articles