Использование SoftwareSerial вместе с библиотекой FastLED для управления светодиодами WS2812

Я управляю светодиодами WS2812 с помощью Arduino nano, используя библиотеку FastLED. Я хочу, чтобы шаблоны светодиодов менялись при получении команды от другого Arduino Nano через Software Serial, у меня нет возможности использовать аппаратный последовательный порт.

Я читал, что для записи данных на светодиоды библиотека отключает все прерывания. Однако SoftwareSerial библиотека также использует прерывания для правильной передачи данных. Есть ли способ достичь этого? В настоящее время, когда я пытаюсь это сделать, я получаю данные о мусоре.

, 👍1


3 ответа


1

Как быстро вам нужно обновить светодиоды? Преимущество WS2812 заключается в том, что если вы не обновляете их, они сохраняют текущие настройки, что означает, что вам нужно управлять ими только после того, как вы получили последовательное сообщение.

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

Это базовая структура программного управления потоком (или XON/XOFF, как ее еще называют), которую поддерживает большинство последовательных портов в качестве опции. Вы можете либо использовать стандартную реализацию, либо использовать что-то более простое, поскольку вам нужны данные и управление потоком только в одном направлении.

Другой вариант – создать систему на основе правил, которые гарантируют, что вы не пропустите данные. Система, отправляющая вам обновления светодиодов, знает, что после получения обновления вам нужно будет применить его к светодиодам, и что в это время вы не можете получать последовательные данные. Поэтому после обновления он ждет и не отправляет больше данных, пока у вас не будет времени сделать это.

,

1

Библиотеки FastLED и NeoPixel отключают прерывания для определенного времени WS2812. Adafruit NeoPixel имеет несколько дополнительных опций, позволяющих обрабатывать некоторые прерывания. У FastLED есть вики, в которой описывается проблема с прерываниями: Вики FastLED прерывания

Для SoftwareSerial требуются прерывания. Когда SoftwareSerial занят, Arduino занят.

Мне кажется невозможным заставить обе библиотеки работать одновременно. Я думаю, вам нужно что-то изменить. Например, используйте Arduino Micro или Pro Micro и используйте свободный аппаратный последовательный порт. Или используйте светодиодную ленту со светодиодами, которые имеют тактовый сигнал и не требуют определенной синхронизации.

Если это невозможно, возможно, вам придется использовать контакты 0 (RX) и 1 (TX), которые также используются монитором последовательного порта и для загрузки скетча.
Можно разделить RX и TX. Единственное, что у RX и TX общего, это скорость передачи данных, но вы можете использовать их для разных задач. Например, используйте TX для отправки (отладки) сообщений на последовательный монитор и используйте RX для получения команд от другой платы Arduino. Отключите другую плату Arduino, чтобы загрузить скетч.

[ДОБАВЛЕНО] Прочитав ответ @Andrew и вики FastLED о прерываниях, я думаю, что мой ответ и ответ @Andrew одинаково хороши. Возможно, лучший способ — сделать все сразу: более быструю плату Arduino, аппаратный последовательный порт для команд, делать одно действие за раз, реализовать какой-нибудь XON/XOFF в программном обеспечении и, если возможно, использовать другие светодиоды.

,

Конечно, лучшее решение — вообще не использовать arduino. Если вы используете процессор, который позволяет вам запускать шину SPI с 12-битными данными на частоте 2,4 МГц, тогда аппаратное обеспечение может справиться с требованиями синхронизации, и нет необходимости отключать прерывания для начала. К сожалению, это не всегда вариант., @Andrew


0

Другой подход заключается в том, чтобы сделать команды для изменения шаблона очень короткими. Например, одна буква/байт.

Это предполагает, что шаблоны хранятся на вашем Arduino, и вы просто выбираете, какой из них показывать.

Чтобы это работало, Arduino должен подтверждать полученные команды и возвращать ошибку, если он получает что-то, что не понимает (например, только половину команды). Это позволяет хосту проверить, получил ли Arduino команду или анимировался ли он в это время, и в этом случае повторно отправить команду.

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

,