用 FireBeetle P4 做一个 USB 麦克风

2025-10-081616
AI 快速预览详细 收起
本文介绍了如何使用FireBeetle P4板子上的PDM麦克风制作一个USB麦克风。通过ESP32 IDF编程和TinyUSB架构,将PDM麦克风模拟为USB UAC设备。特别注意PDM的初始化和I2S配置的差异。最终实现了环境声音的采集,并提供了完整的代码和测试视频。这个项目非常适合STEM教育,帮助孩子在实践中学习编程和硬件知识。
FireBeetle P4 板子上,有一个PDM 的麦克风。

用 FireBeetle P4 做一个 USB 麦克风图1

基本实现原理是:通过ESP32 IDF编程使用 TinyUSB 架构将P4 模拟为 USBUAC 设备,然后通过这个麦克风获得环境声音,这样就得到了一个USB 麦克风。

需要特别注意的是 PDM 的初始化和 I2S 的会有一些差异:
  1. void init_pdm_rx(void) {
  2.     i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_0, I2S_ROLE_MASTER);
  3.     i2s_new_channel(&chan_cfg, NULL, &rx);
  4.     i2s_pdm_rx_config_t pdm_cfg = {
  5.         .clk_cfg = I2S_PDM_RX_CLK_DEFAULT_CONFIG(CONFIG_UAC_SAMPLE_RATE),
  6.         //.slot_cfg = I2S_PDM_RX_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_MONO),
  7.         .slot_cfg = I2S_PDM_RX_SLOT_PCM_FMT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_MONO),
  8.                 .gpio_cfg = {
  9.             .clk = MIC_I2S_CLK,      // PDM clock
  10.             // QUESTION - what about the LR clock pin? No longer relevant? Do we ties it high or low?
  11.             .din = MIC_I2S_DATA,     // PDM data
  12.             .invert_flags = { .clk_inv = false },
  13.         },
  14.     };
  15.     pdm_cfg.slot_cfg.slot_mode = I2S_SLOT_MODE_MONO; // single mic
  16.     i2s_channel_init_pdm_rx_mode(rx, &pdm_cfg);
  17.     i2s_channel_enable(rx);
  18. }
复制代码
上述设置之后,就可以在回调函数中填充需要对主机反馈的数据了:

  1. static esp_err_t usb_uac_device_input_cb(uint8_t *buf, size_t len, size_t *bytes_read, void *arg)
  2. {
  3.     if (!rx) {
  4.         return ESP_FAIL;
  5.     }
  6.         //memcpy(buf,Buff,len);
  7.         //*bytes_read=len;
  8.         //return ESP_OK;
  9.     return i2s_channel_read(rx, buf, len, bytes_read, portMAX_DELAY);
  10. }
复制代码


完整的代码:

工作的测试视频

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(0)
- 没有更多了 -