描述
<div class="document">
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">注:* 为必填项</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"><strong><span style="color: #0093e6;">请在报名阶段填写 ↓</span></strong></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"> </p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">* 1、项目功能介绍</h3>
<hr class="horizontal-splitline normal-bold-2">
<p>这是一个能够将你的 USB 键盘鼠标转换为蓝牙键盘鼠标的设备。这个设计我已经使用过两种方法实现。第一种方法是 Atmel 的 328P 配合 Max3421e和 蓝牙HID模块 实现的,这种方法的问题是成本比较高体积比较大;第二种方法是使用 ESP32 S2/3 来实现的。这种方法用到了ESP32 的 USB Host 功能,主要的问题是同时只能支持一个设备,因为目前 ESP32 的 USB Host 还不支持HUB,因此只能连接一个键盘或者鼠标。</p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"> </p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">*2、项目属性</h3>
<hr class="horizontal-splitline normal-bold-2">
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"><span style="color: #000000;"><span style="color: #95a5a6;"><span style="font-size: 14px;">原创首次公开</span></span></span></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"> </p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">* 3、开源协议</h3>
<hr class="horizontal-splitline normal-bold-2">
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"><span style="color: #95a5a6; font-size: 14px;">请输入内容…</span></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"><strong class="ql-size-13">Public Domain</strong> </p>
<p style="line-height: 1.8;"> </p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"><strong><span style="color: #0093e6;">请在竞赛阶段填写 ↓</span></strong></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"> </p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">*4、硬件部分</h3>
<hr class="horizontal-splitline normal-bold-2">
<p>这次带来的方案是 ESP32 C3 配合 CH9350实现的。其中 ESP32 C3负责蓝牙,CH9350负责USB数据的解析。CH9350是 WCH (就是出品 Ch340 的那个公司)推出的USB键盘鼠标转串口通讯控制芯片。就是说USB 键盘鼠标连接到这个芯片之后,数据会转化为串口输出。关于这个芯片的功能介绍如下:</p>
<ul>
<li>支持12Mbps全速USB传输和1.5Mbps低速USB传输,兼容USB V2.0。</li>
<li>上位机端USB端口符合标准HID类协议,不需要额外安装驱动程序,支持内置HID类设备驱动的Windows、Linux、macOS等操作系统。</li>
<li>同一芯片可配置为上位机模式和下位机模式,分别连接USB-Host主机和USB键盘、鼠标。</li>
<li>支持USB键盘鼠标在BIOS界面使用,支持多媒体功能键,支持不同分辨率USB鼠标。</li>
<li>支持各种品牌的USB键盘鼠标、USB无线键盘鼠标、USB转PS2线等。</li>
<li>上位机端和下位机端支持热插拔。</li>
<li>提供发送状态引脚,支持485通讯。</li>
<li>串口支持115200/57600/38400串口通信波特率。</li>
<li>内置晶振和上电复位电路,外围电路简单。</li>
<li>支持5V、3.3V电源电压。</li>
<li>提供LQFP-48无铅封装,兼容RoHS。</li>
</ul>
<p>这次的方案优点是:成本比较低,体积比较小,容易DIY焊接(ESP32 C3 是我用过的最容易焊接的ESP32芯片)。能够同时支持2个USB设备,就是说你可以同时使用USB键盘和鼠标,同时转化为蓝牙给主机使用。更特别的是:支持USB键盘的LED。</p>
<p>首先进行电路的设计。</p>
<p>1. 主控 ESP32 C3 部分。这款主控内置了 USB 下载电路,我们设计一个 USB接口即可工作。此外,复位与下载按钮是必须的,当出现问题无法下载时,这两个按钮随时可以帮助恢复。</p>
<p><img src="//image.lceda.cn/pullimage/TX403zMUCwTvCOYPPdRU6tsBHWPPx0giekpT1x7X.png" alt=""></p>
<p> </p>
<p>2. 接下来时CH9350部分,它外部电路非常简单,只需要一个 3.3uf和一个 0.1uf电容即可工作。外部的 LED1和 LED2用来指示USB工作状态,没有有效数据时会亮,有数据传输时会熄灭。其中的USB3 是一个双层USB座子,这样我们可以同时使用USB键盘鼠标。</p>
<p><img src="//image.lceda.cn/pullimage/KujZFIFBLOmPl4DWMJoRQHylzzS1jqBnyY6jVM0S.png" alt="" width="779" height="386"></p>
<p>3.我们使用 TLV1117将5V 转为3.3V,同时还预留一个假负载,用来避免在使用充电宝供电,输出小于50ma 一段时间后自动关机的问题。</p>
<p><img src="//image.lceda.cn/pullimage/JiIuVqp82PkVAZQQVLb7xYVxFVlw1sKA1jNBxmUj.png" alt="" width="252" height="225"><img src="//image.lceda.cn/pullimage/qnS2n1Ftj0WTWJJztkQ3wQZy62BlMVBGy8NLDFxZ.png" alt="" width="281" height="300"></p>
<p> </p>
<p>电路比较简单PCB设计也相对简单:</p>
<p><img src="//image.lceda.cn/pullimage/ovR7TFCGHARFHyZ0mLkSiOBNA5rLJhwmNcs7UqYT.png" alt="" width="1430" height="949"></p>
<p>预览如下:</p>
<p><img src="//image.lceda.cn/pullimage/SK2e6HXKlQcHnAID8xQypdN5Ede42El5rT0X7t11.png" alt="" width="779" height="489"></p>
<p> </p>
<p> </p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">*5、软件部分</h3>
<hr class="horizontal-splitline normal-bold-2">
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"> </p>
<p>上面就是硬件设计,接下来着手软件的设计。</p>
<p>这次的软件框架,可以看作是一个蓝牙HID多功能集合体的框架。蓝牙HID和USB HID 一样,都是通过 Report Descriptor告诉主机当前的数据格式。</p>
<p>通常情况下,键盘设备会使用同样的数据格式;但是对于鼠标来说,不同型号区别比较大。这里我使用工具,取得使用的USB鼠标(微软 IO 1.01)的 Report Descriptor。然后将这个 Descriptor 作为蓝牙的 Report Descriptor。这样的好处是简化编程,从USB Gamepad收到什么数据,转发出去即可,避免数据解析的繁琐。</p>
<p>有如下代码:</p>
<p> hid = new BLEHIDDevice(pServer);</p>
<p> input = hid->inputReport(1); // <-- input REPORTID 1 from report map</p>
<p> input2 = hid->inputReport(2); // <-- input REPORTID 2 from report map</p>
<p> output2 = hid->outputReport(2); // <-- output REPORTID 2 from report map</p>
<p> output2->setCallbacks(new KBLedCallbacks());</p>
<p>其中,注册了2个 input 设备(对于USB和蓝牙来说,外设发数据到CPU 的方向是“输入”,CPU发送到外设的方向是“输出”)。通过这两个input 我们可以将鼠标和键盘的数据通过蓝牙“输入”到计算机中。上面还有一个 output2,这是计算机对键盘的输出。输出的内容是当前的Caps Lock,Num Lock的状态。从Log中能够看到,当蓝牙键盘连接到主机时,主机会发送命令告知蓝牙键盘当前的上述Led状态,同样的,当系统中发生了Led的切换时,也会告知蓝牙键盘。我们注册了KBLedCallbacks() 这个回调函数,当主机发送Led同步消息后会进入这个函数。CH9350支持控制LED,经过摸索,具体方法是对CH9350发送下面的命令,其中的 LED 设置在 Byte[7]。</p>
<p>byte LEDbuffer[11] =</p>
<p>{ 0x57, 0xAB, 0x12, 0x00,</p>
<p> 0x00, 0x00, 0x00, 0x00,</p>
<p> 0x00, 0xAC, 0x20</p>
<p>};</p>
<p>最终的代码可以在附件中看到。</p>
<p> </p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">*6、BOM清单</h3>
<hr class="horizontal-splitline normal-bold-2">
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"><span style="color: #95a5a6;"><span style="font-size: 14px;">立创 EDA 设计,可以直接参考电路图中 BOM</span></span></p>
<table style="border-collapse: collapse; width: 480pt;" width="640">
<tr style="height: 14.4pt;">
<td style="height: 14.4pt; width: 48pt;" width="64" height="19">ID</td>
<td style="width: 48pt;" width="64">Name</td>
<td style="width: 48pt;" width="64">Designator</td>
<td style="width: 48pt;" width="64">Footprint</td>
<td style="width: 48pt;" width="64">Quantity</td>
<td style="width: 48pt;" width="64">Manufacturer Part</td>
<td style="width: 48pt;" width="64">Manufacturer</td>
<td style="width: 48pt;" width="64">Supplier</td>
<td style="width: 48pt;" width="64">Supplier Part</td>
<td style="width: 48pt;" width="64">Price</td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">1</td>
<td>BAU1</td>
<td>BAU1</td>
<td>HDR-TH_2P-P2.54-V</td>
<td align="right">1</td>
<td>826629-2</td>
<td>TE Connectivity</td>
<td>LCSC</td>
<td>C86471</td>
<td align="right">2.55</td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">2</td>
<td>BAU0</td>
<td>BAU2</td>
<td>HDR-TH_2P-P2.54-V</td>
<td align="right">1</td>
<td>826629-2</td>
<td>TE Connectivity</td>
<td>LCSC</td>
<td>C86471</td>
<td align="right">2.55</td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">3</td>
<td>0.1uf</td>
<td>C1,C8</td>
<td>C1206</td>
<td align="right">2</td>
<td>C1206X104K1RAC7800</td>
<td>KEMET(基美)</td>
<td>LCSC</td>
<td>C600091</td>
<td align="right">0.4961</td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">4</td>
<td>3.3uf</td>
<td>C2</td>
<td>C1206</td>
<td align="right">1</td>
<td>TCC1206X7R561K501DT</td>
<td>CCTC</td>
<td>LCSC</td>
<td>C377112</td>
<td align="right">0.0764</td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">5</td>
<td>0.1uf</td>
<td>C3</td>
<td>C1206</td>
<td align="right">1</td>
<td>TCC1206X7R561K501DT</td>
<td>CCTC</td>
<td>LCSC</td>
<td>C377112</td>
<td align="right">0.0764</td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">6</td>
<td>1uf</td>
<td>C6,C7,C9,C10</td>
<td>C1206</td>
<td align="right">4</td>
<td>C1206X104K1RAC7800</td>
<td>KEMET(基美)</td>
<td>LCSC</td>
<td>C600091</td>
<td align="right">0.4961</td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">7</td>
<td>EN</td>
<td>EN1</td>
<td>SW-SMD_L4.0-W2.9-LS5.0</td>
<td align="right">1</td>
<td>TS342A2P-WZ</td>
<td>SHOU HAN</td>
<td>LCSC</td>
<td>C557591</td>
<td align="right">0.2033</td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">8</td>
<td>Header2.0*5</td>
<td>H1</td>
<td>HEADER2.0*5</td>
<td align="right">1</td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">9</td>
<td>IO9</td>
<td>IO9</td>
<td>SW-SMD_L4.0-W2.9-LS5.0</td>
<td align="right">1</td>
<td>TS342A2P-WZ</td>
<td>SHOU HAN</td>
<td>LCSC</td>
<td>C557591</td>
<td align="right">0.2033</td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">10</td>
<td>204-10SURD/S530-A3-L</td>
<td>LED1,LED2</td>
<td>LED-TH_BD3.0-P2.54-FD</td>
<td align="right">2</td>
<td>204-10SURD/S530-A3-L</td>
<td>EVERLIGHT(亿光)</td>
<td>LCSC</td>
<td>C99771</td>
<td align="right">0.1609</td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">11</td>
<td>SS8050_C2150</td>
<td>Q1</td>
<td>SOT-23-3_L2.9-W1.3-P1.90-LS2.4-BR</td>
<td align="right">1</td>
<td>SS8050</td>
<td>CJ</td>
<td>LCSC</td>
<td>C2150</td>
<td align="right">0.0929</td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">12</td>
<td>10K</td>
<td>R2</td>
<td>R1206</td>
<td align="right">1</td>
<td>CR1206J405R1G</td>
<td>LIZ(丽智电子)</td>
<td>LCSC</td>
<td>C102372</td>
<td align="right">0.02</td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">13</td>
<td>1K</td>
<td>R3,R4</td>
<td>R1206</td>
<td align="right">2</td>
<td>R1206RXX102XJ04LTC</td>
<td>Shenzhen Eyang Tech Development</td>
<td>LCSC</td>
<td>C267247</td>
<td align="right">0.0243</td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">14</td>
<td align="right">20</td>
<td>R5</td>
<td>R1206</td>
<td align="right">1</td>
<td>PTFR1206B10K0P9</td>
<td>ResistorToday</td>
<td>LCSC</td>
<td>C351536</td>
<td align="right">1.2904</td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">15</td>
<td>1K</td>
<td>R6</td>
<td>R1206</td>
<td align="right">1</td>
<td>CR1206J405R1G</td>
<td>LIZ(丽智电子)</td>
<td>LCSC</td>
<td>C102372</td>
<td align="right">0.02</td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">16</td>
<td align="right">100</td>
<td>R9</td>
<td>R1206</td>
<td align="right">1</td>
<td>PTFR1206B10K0P9</td>
<td>ResistorToday</td>
<td>LCSC</td>
<td>C351536</td>
<td align="right">1.2904</td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">17</td>
<td>CH9350L</td>
<td>U1</td>
<td>LQFP-48_L7.0-W7.0-P0.50-LS9.0-BL</td>
<td align="right">1</td>
<td>CH9350L</td>
<td>WCH</td>
<td>LCSC</td>
<td>C109472</td>
<td align="right">24.5</td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">18</td>
<td>ESP32-C3-WROOM-02 模组</td>
<td>U2</td>
<td>ESP32-C3-WROOM-02 模组</td>
<td align="right">1</td>
<td>ESP32-C3-WROOM-02-H4</td>
<td>espressif</td>
<td>LCSC</td>
<td>C2944070</td>
<td align="right">18.01</td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">19</td>
<td>TLV1117LV33DCYR</td>
<td>U3</td>
<td>SOT-223_L6.7-W3.5-P2.30-BR</td>
<td align="right">1</td>
<td>TLV1117LV33DCYR</td>
<td>TI</td>
<td>LCSC</td>
<td>C15578</td>
<td align="right">0.9603</td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">20</td>
<td>Double layer DIP 90° white</td>
<td>USB3</td>
<td>USB-A-TH_USB-M-51</td>
<td align="right">1</td>
<td>Double layer DIP 90° white</td>
<td>ValuePro</td>
<td>LCSC</td>
<td>C2341</td>
<td align="right">0.8867</td>
</tr>
<tr style="height: 14.4pt;">
<td style="height: 14.4pt;" align="right" height="19">21</td>
<td>USB-211-BCW</td>
<td>USB4</td>
<td>USB-A-TH_USB-211-BCW</td>
<td align="right">1</td>
<td>USB-211-BCW</td>
<td>XUNPU</td>
<td>LCSC</td>
<td>C720520</td>
<td align="right">0.4656</td>
</tr>
</table>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"> </p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">*7、大赛LOGO验证</h3>
<hr class="horizontal-splitline normal-bold-2">
<p style="line-height: 1.8;"> </p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"><img src="//image.lceda.cn/pullimage/CCPyuiWeFdqmIoMRRcGXdnIyv1NsM8gaGl1iKSsO.jpeg" alt="" width="4055" height="2047"></p>
<h3 class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;">* 8、演示您的项目并录制成视频上传</h3>
<hr class="horizontal-splitline normal-bold-2">
<p style="line-height: 1.8;"> </p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"><span style="color: #95a5a6; font-size: 14px;">视频要求:请横屏拍摄,分辨率不低于1280×720,格式Mp4/Mov,单个视频大小限100M内;</span></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"><span style="color: #95a5a6; font-size: 14px;">视频标题:立创电赛:{项目名称}-{视频模块名称};如立创电赛:《自动驾驶》-团队介绍。</span></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"> </p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"><span style="font-size: 14px;">更多详情:<a href="/posts/15a52db9fd7d40c492eb505280278e45" target="_blank">https://diy.szlcsc.com/posts/15a52db9fd7d40c492eb505280278e45</a></span></p>
<p class="paragraph text-align-type-left pap-line-1.3 pap-line-rule-auto pap-spacing-before-3pt pap-spacing-after-3pt" style="line-height: 1.8;"> </p>
</div>
评论(4)