描述
<p style="line-height: 1.8;"> </p>
<h3 style="line-height: 1.8;">* 1、项目功能介绍</h3>
<hr>
<p> </p>
<p>基于 ESP32-S3 开发的 USB 安全麦克风。让使用者完全避免开会中声音泄露的尴尬。</p>
<p style="line-height: 1.8;"> </p>
<h3 style="line-height: 1.8;">*2、项目属性</h3>
<hr>
<p style="line-height: 1.8;"> </p>
<p>原创项目首次公开</p>
<p style="line-height: 1.8;"> </p>
<h3 style="line-height: 1.8;">* 3、开源协议</h3>
<hr>
<p>GPL3.0</p>
<p style="line-height: 1.8;"> </p>
<h3 style="line-height: 1.8;">*4、硬件部分</h3>
<hr>
<p>1.主控是 ESP32-S3,内置USB Device 支持,将自身模拟为一个 USB麦克风</p>
<p>2.使用MSM261S4030H0麦克风,这是一个高灵敏度的单麦克,通过I2S接口直接输出音频信息。</p>
<p style="line-height: 1.8;"> </p>
<p style="line-height: 1.8;"> </p>
<h3 style="line-height: 1.8;">*5、软件部分</h3>
<hr>
<p>通过国产的 Cherry USB 架构实现了一个简单的 UAC.</p>
<p>关键代码如下:</p>
<p> </p>
<p>1.初始化麦克风的 I2S ,特别注意是单声道</p>
<div><code>// 标准模式配置</code></div>
<div><code>i2s_std_config_t std_cfg =</code></div>
<div><code>{</code></div>
<div><code>.clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(SAMPLE_RATE),</code></div>
<div><code>.slot_cfg = I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG(</code></div>
<div><code> I2S_DATA_BIT_WIDTH_32BIT,</code></div>
<div><code> I2S_SLOT_MODE_MONO</code></div>
<div><code>),</code></div>
<div><code>//.slot_cfg.slot_mask = I2S_STD_SLOT_LEFT,</code></div>
<div><code>.gpio_cfg = {</code></div>
<div><code>.bclk = I2S_BCK_GPIO,</code></div>
<div><code>.ws = I2S_WS_GPIO,</code></div>
<div><code>.din = I2S_DATA_GPIO,</code></div>
<div><code>.invert_flags = {</code></div>
<div><code>.bclk_inv = false, //时钟空闲时为 High</code></div>
<div><code>.ws_inv = false</code></div>
<div><code>}</code></div>
<div><code>}</code></div>
<div><code>};</code></div>
<div><code>std_cfg.slot_cfg.slot_mode=I2S_SLOT_MODE_MONO;</code></div>
<div><code>std_cfg.slot_cfg.slot_mask=I2S_STD_SLOT_LEFT;</code></div>
<p style="line-height: 1.8;"> </p>
<p style="line-height: 1.8;">2.Cherry USB架构下,下面的函数中完成 UAC 的初始化,同时创建一个队列用于接收音频数据</p>
<div><code>void audio_v1_init(uint8_t busid, uintptr_t reg_base)</code></div>
<div><code>{</code></div>
<div><code> // 创建同步信号</code></div>
<div><code> sign_tx = xSemaphoreCreateBinary();</code></div>
<div><code> // 数据队列</code></div>
<div><code>s_receive_queue = xQueueCreate(10, sizeof(i2c_mic_rx_data_t));</code></div>
<div><code>//创建接收任务</code></div>
<div><code>xTaskCreatePinnedToCore(task_func, "task", 4096, NULL, 10, NULL, tskNO_AFFINITY);</code></div>
<div> </div>
<div> </div>
<div><code> ESP_ERROR_CHECK(esp_task_wdt_add_user("usb", &twdt_usb));</code></div>
<div> </div>
<div><code> usbd_desc_register(busid, audio_v1_descriptor);</code></div>
<div><code> usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf0, 0x0100, audio_entity_table, 1));</code></div>
<div><code> usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf1, 0x0100, audio_entity_table, 1));</code></div>
<div><code> usbd_add_endpoint(busid, &audio_in_ep);</code></div>
<div> </div>
<div><code> usbd_initialize(busid, reg_base, usbd_event_handler);</code></div>
<div><code>}</code></div>
<p style="line-height: 1.8;"> </p>
<p style="line-height: 1.8;">3.收到的音频数据在如下回调函数中</p>
<p style="line-height: 1.8;"> </p>
<p><code>void usbd_audio_iso_callback(uint8_t busid, uint8_t ep, uint32_t nbytes)</code><br><code>{</code><br><code> //USB_LOG_RAW("actual in len:%d\r\n", nbytes);</code><br><code> ep_tx_busy_flag = false;</code></p>
<p><code> if (0 == tx_flag)</code><br><code> {</code><br><code> printf("usbd_audio_iso_callback tx_flag = 0\n");</code><br><code> }</code><br><code> </code></p>
<p><code> // 释放信号,让Main那边可以发送了</code><br><code> BaseType_t xHigherPriorityTaskWoken = pdFALSE;</code><br><code> xSemaphoreGiveFromISR(sign_tx, &xHigherPriorityTaskWoken);</code><br><code> portYIELD_FROM_ISR(xHigherPriorityTaskWoken);</code><br><code>}</code></p>
<p> </p>
<p>4. 最终,在将音频数据发送给PC时,做一个简单的判断,只有指定的 GPIO 拉低才会将数据发送出去,否则送出空数据包</p>
<div> </div>
<div><code>// 如果当前没有发送</code></div>
<div><code>if (ep_tx_busy_flag != true)</code></div>
<div><code>{</code></div>
<div><code>ep_tx_busy_flag = true;</code></div>
<div> </div>
<div><code> xSemaphoreTake(sign_tx, 0);</code></div>
<div> </div>
<div><code>if(gpio_get_level(GPIO_NUM_9) == 0) { // 低电平触发</code></div>
<div><code>// 发送数据到 USB </code></div>
<div><code>usbd_ep_start_write(0, AUDIO_IN_EP, rx_data.buffer, rx_data.size);</code></div>
<div><code>} else {</code></div>
<div><code>usbd_ep_start_write(0, AUDIO_IN_EP, NullBuffer, AUDIO_IN_PACKET);</code></div>
<div><code>}</code></div>
<div> </div>
<div> </div>
<div><code> </code></div>
<div><code> xSemaphoreTake(sign_tx, 10);</code></div>
<div><code> </code></div>
<div><code>while (ep_tx_busy_flag)</code></div>
<div><code>{</code></div>
<div><code>if (tx_flag == false)</code></div>
<div><code>{</code></div>
<div><code>break;</code></div>
<div><code>}</code></div>
<div><code>}</code></div>
<div><code>//发送完成,释放缓冲区</code></div>
<div><code>rx_data.size = 0;</code></div>
<div><code>free(rx_data.buffer);</code></div>
<div><code>}</code></div>
<p> </p>
<h3 style="line-height: 1.8;">*6、BOM清单</h3>
<hr>
<p style="line-height: 1.8;"><span style="color: #95a5a6; font-size: 14px;">元器件没有特别要求,ESP32S3 购自 DFRobot</span></p>
<p style="line-height: 1.8;"> </p>
<table width="1470">
<tr>
<td width="147" height="19">No.</td>
<td width="147">Quantity</td>
<td width="147">Comment</td>
<td width="147">Designator</td>
<td width="147">Footprint</td>
<td width="147">Value</td>
<td width="147">Manufacturer Part</td>
<td width="147">Manufacturer</td>
<td width="147">Supplier Part</td>
<td width="147">Supplier</td>
</tr>
<tr>
<td height="19">1</td>
<td align="right">2</td>
<td>1uf</td>
<td>C1,C2</td>
<td>C1206</td>
<td> </td>
<td>1206F104M500NT</td>
<td>Guangdong Fenghua Advanced Tech</td>
<td>C313097</td>
<td>LCSC</td>
</tr>
<tr>
<td height="19">2</td>
<td align="right">1</td>
<td>0.1uf</td>
<td>C3</td>
<td>C1206</td>
<td> </td>
<td>CC1206JRNPOBBN270</td>
<td>YAGEO</td>
<td>C326944</td>
<td>LCSC</td>
</tr>
<tr>
<td height="19">3</td>
<td align="right">1</td>
<td>22uf</td>
<td>C4</td>
<td>C1206</td>
<td> </td>
<td>CC1206JRNPOBBN270</td>
<td>YAGEO</td>
<td>C326944</td>
<td>LCSC</td>
</tr>
<tr>
<td height="19">4</td>
<td align="right">1</td>
<td>Header2.0*5</td>
<td>H1</td>
<td>HEADER2.0*5</td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td height="19">5</td>
<td align="right">2</td>
<td>PZ254V-11-03P</td>
<td>H2,H3</td>
<td>HDR-TH_3P-P2.54-V-M</td>
<td> </td>
<td>PZ254V-11-03P</td>
<td>XFCN(兴飞)</td>
<td>C2937625</td>
<td>LCSC</td>
</tr>
<tr>
<td height="19">6</td>
<td align="right">1</td>
<td>DMIC</td>
<td>P1</td>
<td>HEADER1X6-2.54MM</td>
<td> </td>
<td> </td>
<td> </td>
<td>C40877</td>
<td>LCSC</td>
</tr>
<tr>
<td height="19">7</td>
<td align="right">1</td>
<td>10K</td>
<td>R1</td>
<td>R1206</td>
<td> </td>
<td>AECR1206F120KK9</td>
<td>ResistorToday</td>
<td>C352156</td>
<td>LCSC</td>
</tr>
<tr>
<td height="19">8</td>
<td align="right">2</td>
<td>5.1K</td>
<td>R2,R3</td>
<td>R1206</td>
<td> </td>
<td>AECR1206F120KK9</td>
<td>ResistorToday</td>
<td>C352156</td>
<td>LCSC</td>
</tr>
<tr>
<td height="19">9</td>
<td align="right">1</td>
<td>12K</td>
<td>R5</td>
<td>R1206</td>
<td> </td>
<td>1206W4F3303T5E</td>
<td>UniOhm</td>
<td>C17929</td>
<td>LCSC</td>
</tr>
<tr>
<td height="19">10</td>
<td align="right">1</td>
<td>ESP32-S3-WROOM-1U-N4</td>
<td>U1</td>
<td>WIRELM-SMD_ESP32-S3-WROOM-1U</td>
<td> </td>
<td>ESP32-S3-WROOM-1U-N4</td>
<td>ESPRESSIF 乐鑫</td>
<td>C2980296</td>
<td>LCSC</td>
</tr>
<tr>
<td height="19">11</td>
<td align="right">1</td>
<td>PWR</td>
<td>U2</td>
<td>LED1206-FD</td>
<td> </td>
<td>YLED1206R</td>
<td>YONGYUTAI(永裕泰)</td>
<td>C28310439</td>
<td>LCSC</td>
</tr>
<tr>
<td height="19">12</td>
<td align="right">1</td>
<td>TLV1117LV33DCYR</td>
<td>U3</td>
<td>SOT-223_L6.7-W3.5-P2.30-BR</td>
<td> </td>
<td>TLV1117LV33DCYR</td>
<td>TI</td>
<td>C15578</td>
<td>LCSC</td>
</tr>
<tr>
<td height="19">13</td>
<td align="right">1</td>
<td>TYPE-C 16PIN 2MD(073)</td>
<td>USB1</td>
<td>USB-C-SMD_TYPE-C-6PIN-2MD-073</td>
<td> </td>
<td>TYPE-C 16PIN 2MD(073)</td>
<td>SHOU HAN(首韩)</td>
<td>C2765186</td>
<td>LCSC</td>
</tr>
</table>
<p style="line-height: 1.8;"> </p>
<h3 style="line-height: 1.8;">*7、大赛LOGO验证</h3>
<hr>
<p style="line-height: 1.8;"> </p>
<p style="line-height: 1.8;"><img src="//image.lceda.cn/pullimage/lUU2rY7Knclrk06Nz6Xjv8Q4cFl0gufXkJDCQWNJ.jpeg" alt="" width="3048" height="4064"></p>
<p style="line-height: 1.8;"> </p>
<p style="line-height: 1.8;">电路图</p>
<p style="line-height: 1.8;"><img src="//image.lceda.cn/pullimage/Dz7FNFL8QlCG3dmDMt5I2IUNHenPeM0RBpS3FM6e.png"></p>
<p style="line-height: 1.8;"> </p>
<p style="line-height: 1.8;">PCB 设计(带外壳):</p>
<p style="line-height: 1.8;"><img src="//image.lceda.cn/pullimage/qL2M8EQCFl60M22lQgiLIpXaV3nZ0MZAdncy5Fhc.png"></p>
<h3 style="line-height: 1.8;">* 8、演示您的项目并录制成视频上传</h3>
<hr>
<p style="line-height: 1.8;"> </p>
<p style="line-height: 1.8;"><span style="color: #95a5a6; font-size: 14px;">视频要求:请横屏拍摄,分辨率不低于1280×720,格式Mp4/Mov,单个视频大小限100M内;</span></p>
<p style="line-height: 1.8;"><span style="color: #95a5a6; font-size: 14px;">视频标题:立创电赛:{项目名称}-{视频模块名称};如立创电赛:《自动驾驶》-团队介绍。</span></p>
<p style="line-height: 1.8;"> </p>
<p style="line-height: 1.8;"><span style="font-size: 14px;"><a href="/posts/42551e8f2f2548cabc1c36626a42da94" target="_blank">前往查看更多详情 ></a></span></p>
<p style="line-height: 1.8;"> </p>
评论(0)