Перейти к содержанию

Сколько лент WS2812 можно подключить к ESP32 одновременно?

Обновлено Редакция GAW

Сигнал для адресных светодиодов на ESP32 удобнее всего формировать периферией RMT: канал сам выдаёт биты нужной длительности, и процессор только готовит данные. Один канал передачи — одна лента или одна цепочка лент.

Каналы по чипам

ЧипКаналы передачиПамять RMTБлок канала
ESP32до 8, каждый на передачу или приём512 слов64 символа
ESP32-S2до 4, каждый на передачу или приём256 слов64 символа
ESP32-S34 (и 4 приёмных отдельно)384 слова48 символов
ESP32-C3, C6, H22 (и 2 приёмных отдельно)192 слова48 символов

Данные — технические руководства Espressif и заголовки ESP-IDF v6.1. Память общая на все каналы: у ESP32 она поделена на восемь блоков по 64 слова, и если дать одному каналу больше одного блока, он займёт блоки следующих каналов. Наш вывод: увеличивая mem_block_symbols против мигания при Wi-Fi (см. «Почему WS2812 мигают на ESP32»), вы уменьшаете число лент, которые можно подключить.

Частота кадров

Каждый светодиод получает 24 бита. Наш расчёт при бите 1,2 мкс, как в примере ESP-IDF:

tкадра=N⋅24⋅1,2 мкс+280 мксt_\text{кадра} = N \cdot 24 \cdot 1{,}2\ \text{мкс} + 280\ \text{мкс}
Светодиодов в лентеВремя кадраНаибольшая частота
602,0 мсоколо 500 кадров/с
3008,9 мсоколо 112 кадров/с
100029,1 мсоколо 34 кадров/с

Каналы работают параллельно, поэтому четыре ленты по 300 светодиодов на ESP32-S3 обновляются с той же частотой, что одна. Если всё же не хватает каналов, на ESP32 доступны и другие способы выдать сигнал — например, через SPI, как описывает калькулятор WS2812, но это уже отдельная периферия со своими ограничениями.

Разрешение канала и длительности битов для своего чипа посчитает калькулятор RMT ESP32, ток ленты и блок питания — калькулятор WS2812.

Похожие вопросы

Можно ли повесить на один вывод ESP32 несколько лент?

Можно соединить их цепочкой: выход DO последнего светодиода одной ленты — на вход DIN следующей. Для ESP32 это одна длинная лента на одном канале RMT, и кадр становится длиннее. Параллельно на один вывод две ленты включают, только если они должны показывать одно и то же (наш вывод).

Будут ли ленты на разных каналах обновляться одновременно?

Каналы RMT работают независимо, и каждый начинает передачу по своему вызову rmt_transmit(), поэтому между ними возможен небольшой сдвиг. Если нужен старт без сдвига во времени, ESP-IDF предлагает менеджер синхронизации (Sync Manager): каналы объединяют в группу, и передача начинается одновременно. У классического ESP32 его нет: в драйвере v6.1 rmt_new_sync_manager() для чипов без аппаратной синхронизации возвращает ESP_ERR_NOT_SUPPORTED, она есть у S2, S3, C3, C6 и H2.

Сколько светодиодов выдержит одна лента?

По даташиту WS2812B-V5/W при 30 кадрах в секунду в цепочке может быть не меньше 1024 светодиодов. Наш расчёт: при бите 1,2 мкс это около 29,5 мс на кадр плюс сброс — укладывается в 33 мс. Длиннее ленту делят на несколько каналов.

Источники

  1. Espressif. ESP32 Technical Reference Manual v5.8, гл. 30; TRM ESP32-S2 v1.3, S3 v1.8, C3 v1.4, C6 v1.2, H2 v1.2 — главы RMT — ESP32: 8 каналов, ОЗУ RMT из восьми блоков по 64 слова, по умолчанию у каждого канала свой блок, RMT_MEM_SIZE_CHn > 1 забирает память следующих каналов; S2 — 4 канала, 256 слов; S3 — 4 TX и 4 RX, 384 слова блоками по 48; C3, C6, H2 — 2 TX и 2 RX, 192 слова
  2. Espressif. ESP-IDF Programming Guide v6.1: Remote Control Transceiver (RMT) — каждый канал настраивается на передачу или приём независимо; mem_block_symbols без DMA — размер собственного блока канала, не меньше 64 (48 у S3, C3, C6, H2); Sync Manager — одновременный старт нескольких каналов; rmt_tx.c — без RMT_LL_SUPPORT(TX_SYNCHRO) возвращает ESP_ERR_NOT_SUPPORTED, макрос есть в rmt_ll.h у S2, S3, C3, C6, H2 и нет у ESP32; пример led_strip — бит 0,3 + 0,9 мкс; soc_caps.h: SOC_RMT_MEM_WORDS_PER_CHANNEL 64 и 48
  3. Worldsemi. WS2812B-V5/W datasheet V6.1 — 24 бита на светодиод, сброс дольше 280 мкс; при 30 кадрах в секунду — не меньше 1024 светодиодов в цепочке

Нашли ошибку?