红外遥控接收器 (RMT)
ESP 芯片上的 RMT 外设有哪些实际的应用场景?
请参考 RMT 应用示例,可以实现红外遥控,LED 灯带点亮,D-shot 电机控制等。
如果要使用 RMT 功能, 最推荐使用哪一款 ESP 芯片?
推荐 ESP32-S3,因为目前只有 ESP32-S3 这一款芯片的 RMT 带有 DMA。这样 RMT 可以避免 Wi-Fi 或蓝牙等中断的干扰。
RMT 中如何将时钟修改为 REF_TICK?
- CHIP: ESP32 | ESP32-S2 | ESP32-C3
可以调用 rmt_set_source_clk 接口设置。
使用 ESP32 RMT 控制 WS2812 灯带,当与 Wi-Fi 或者蓝牙同时使用时,会出现部分数据帧异常的问题,该如何解决?
这个问题在非 ESP32-S3 的芯片上很难解决,因为 RMT 刷 LED(尤其是很多个 LED 的时候)严重依赖中断,且不支持 DMA,需要软件在中断切换 ping-pong buffer,如果中断没有及时响应,就会出现问题。默认情况下 (即只设置了一个存储块),是两个灯的数据量就要进一次中断来切换 ping-pong buffer。
缓解思路有:
对于 esp-idf release/v4.4 及之前版本,可以增大 mem_block_num,在 release/v5.0 中有进行修改,参考 Breaking Changes in Usage。
将 RMT 的中断安装在特定的 CPU 核上,可以在一个 pin to core 的 task 中调用 driver install 函数,避开 Wi-Fi 或蓝牙使用的核。
您也可以使用 SPI DMA 来代替 RMT 解决此问题,具体请参考 SPI DMA LED 灯带示例。
如果您还处于前期技术选型阶段,推荐使用 ESP32-S3 的 RMT。
ESP-IDF 里只有一个 IR NEC 示例,如何快速实现其他红外协议的适配?
可以在参考 IR NEC 示例的基础上利用 RMT Encoder 来加速适配其他红外协议。
如果需要红外学习功能,可以使用 ir_learn 组件。
ESP32-S3 RMT 支持配置 4 个 RMT RX/TX channel,但为什么在实际使用 rmt_new_tx_channel 连续创建超过 2 个 RMT TX channel 时就会失败?
这是因为 tx_chan_config 结构体中配置的 mem_block_symbols 参数过大,ESP32-S3 上 RMT 每个专用内存块的大小为 48 字节。如果此时配置的 mem_block_symbols 参数超过 48,创建 TX 通道时实际上会把相邻的下一个通道对应的内存块也占用掉。因此如果您要同时创建并使用 4 个 RMT RX/TX channel,mem_block_symbols 参数的值不能超过 48。
此外,ESP32 上 RMT 每个专用内存块的大小为 64 字节。
ESP32-S3 RMT 是否能实现多个 TX Channel 的同步输出?
可以,请参考以下参考代码:
rmt_channel_handle_t tx_channels[TEST_RMT_CHANS]; rmt_sync_manager_handle_t synchro = NULL; rmt_sync_manager_config_t synchro_config = { .tx_channel_array = tx_channels, .array_size = TEST_RMT_CHANS, }; rmt_new_sync_manager(&synchro_config, &synchro); for (int i = 0; i < TEST_RMT_CHANS; i++) { rmt_transmit(tx_channels[i], led_strip_encoders[i], leds_grb, TEST_LED_NUM * 3, &transmit_config); }
ESP32-S3 如何实现用 RMT TX 通道循环发送数据,比如进行无限循环?
将 rmt_transmit_config_t::loop_count 配置为 -1 即可无限循环传输,更多细节请参考 Initiate TX Transaction。
ESP32-S3 是否支持硬件 One-Wire?
ESP32-S3 可以通过 RMT 外设支持 One-Wire 总线协议。具体应用可参考 “esp-idf/examples/peripherals/rmt/onewire” 例程。