USB 键盘鼠标是最常见的输入设备了,之前如果想在 Arduino 上使用这两种设备,一个可行的方法是使用 USB Host Shield。这种方法的缺点是:成本比较高(MAX3421E芯片贵),操作复杂(SPI接口),资料少。因为这样缺点的存在,USB Host Shield 在使用上存在诸多不便。偶然间看到USB键鼠转串口通讯控制芯片CH9350(南京沁恒,WCH,阅读过我文章的朋友都知道CH340 也是他们家的产品)。这款能够将 USB 键盘鼠标的有效信息转为串口数据。芯片特点如下:
- 支持12Mbps全速USB传输和1.5Mbps低速USB传输,兼容USB V2.0。
- 上位机端USB端口符合标准HID类协议,不需要额外安装驱动程序,支持内置HID类设备驱动的Windows、Linux、MAC等操作系统。
- 同一芯片可配置为上位机模式和下位机模式,分别连接USB-Host主机和USB键盘、鼠标。
- 支持USB键盘鼠标在BIOS界面使用,支持多媒体功能键,支持不同分辨率USB鼠标。
- 支持各种品牌的USB键盘鼠标、USB无线键盘鼠标、USB转PS2线等。
- 上位机端和下位机端支持热插拔。
- 提供发送状态引脚,支持485通讯。
- 串口支持115200/57600/38400串口通信波特率。
- 内置晶振和上电复位电路,外围电路简单。
- 支持5V、3.3V电源电压。
- 提供LQFP-48无铅封装,兼容RoHS。
于是尝试给 ESP32 FireBeetle 绘制一个 USB Keyboard/Mouse Shield,让 ESP32 能够轻松的获得 USB 键盘鼠标数据。
第一步,设计电路。核心是 CH9350芯片,它能够一次性支持2个 USB Host接口,下图中的 USB1 和 USB2。LED1 和 LED2 是通讯指示灯,对应的 USB1 和 USB2 如果有正常的通讯,对应的 LED会熄灭。此外,还有一个USB_Power 是USB公头,用于从外部取电,避免 FireBeetle 供电不足的情况。
PCB 设计如下:
3D 预览如下:
做出来就是这样(美中不足的因为2个USB 母头的存在,这个板子稍微大一些。另外,这个芯片引脚比较密集,焊接费了一些功夫,如果你对自己焊接技术不放心,推荐直接 SMT 避免手工焊接):
因为芯片使用串口输出,所以很容易就能够获得数据。数据格式在 Data Sheet 上有描述:
解析数据会出现在 FireBeetle Serial2上。
电路图是立创 EDA设计的,如下:
对应的 CH9350L Datasheet