FireBeetle 的 USB Shield
目前市面上最成熟的 USB Host 库当属OlegMazurov的USB Host Shield Library 2.0(项目地址 https://github.com/felis/USB_Host_Shield_2.0),几乎可以兼容市面上的所有 Arduino板,从 Atmel 328P/32U4到 ATMage2560 再到 EP32都能够使用这个库来驱动 USB 设备。这次我专门为 FireBeetle设计了一个Shield使得FireBeetle能够驱动一些USB 设备。首先,依然是硬件设计部分。USB Host Shield Library是基于 MAX3421e实现的,下面可以看作是这个芯片的一个最小系统,需要外接一颗12Mhz 的晶振。此外可以看到这个芯片本身带有GPIO引脚,可以用来做 GPI或者 GPO ,在一些情况下可以弥补主控 GPIO 不足的缺点,但是本次设计并未使用这些引脚。
上述芯片和 FireBeetle接口如下图,二者是通过 SPI 来进行通讯的。下图中IO18/23/19/13就是 SPI 接口。特别注意,我在板子上预留了 JP3/JP2 这是为以后堆叠使用可能发生的引脚冲突预留的,正常使用的时候 JP1和JP3(称作短接电阻) 是需要焊接起来的;JP2的功能是预留给某些情况下 USB 设备需要功耗较高,FireBeetle无法提供时就需要考虑使用外部5V进行供电,此时如果你还使用FIreBeetle上的 USB端口调试,既有可能出现外部5V和USB 上面的5V 电压不同的情况。因此,这种情况下需要断开 JP2。接下来继续进行硬件设计,绘制PCB。特别注意,下面电路图时有缺陷的,再晶振下面走线,有可能对信号有影响。建议需要的朋友重新设计 PCB。
3D 预览结果:
之后,打板,焊接成品如下,黑色PCB 很有 DFRobot 出品的感觉。
接下来就用这个板子配合 FireBeetle来实现一个 USB 键盘转蓝牙的作品。1. 为了驱动这个 USB Host Shield 需要对 USB Host Library 做一点修改。1.1UsbCore.h 中修改为我们使用的SS和INTPin #elif defined(ESP32)//LABZ typedef MAX3421e<P5, P17> MAX3421E; // ESP32 boardstypedef MAX3421e<P13, P26> MAX3421E; // ESP32 boards// LABZ#else1.2usbhost.h 中修改为我们使用的 SPI#elif defined(ESP32)//LABZ typedef SPi< P18, P23, P19, P5 > spi;typedef SPi< P18, P23, P19, P13 > spi; // LABZ#else2. 蓝牙键盘功能的实现。这里我们需要用到 ESP32 BLE Keyboard library,在 https://github.com/T-vK/ESP32-BLE-Keyboard可以找到这个项目。3. 最终的代码如下:#include <hidboot.h>
#include <SPI.h>
#include <BleKeyboard.h>
BleKeyboard bleKeyboard;
class KbdRptParser : public KeyboardReportParser
{
void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
};
void KbdRptParser::Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
{
if (bleKeyboard.isConnected()) {
KeyReport _keyReport;
_keyReport.modifiers=buf;
for (int i = 2; i < 8; i++) {
_keyReport.keys = buf;
}
bleKeyboard.sendReport(&_keyReport);
}
Serial.print("Received ");Serial.println(len);
for (int i = 0; i < len; i++) {
Serial.print(buf);
Serial.print("");
}
Serial.println("");
}
USB Usb;
HIDBoot<USB_HID_PROTOCOL_KEYBOARD> HidKeyboard(&Usb);
KbdRptParser Prs;
void setup()
{
Serial.begin( 115200 );
Serial.println("Start");
if (Usb.Init() == -1)
Serial.println("OSC did not start.");
bleKeyboard.begin();
delay( 200 );
HidKeyboard.SetReportParser(0, &Prs);
}
void loop()
{
Usb.Task();
}
简单的说上电之后,在PC上搜索蓝牙设备,配对之后就可以通过 USB Host Shield 解析键盘数据,然后将这个数据直接填写到蓝牙键盘的结构体中,FIreBeetle随即将这个信息传递给 PC,PC上就能收到你的按键信息了。
工作的视频可以在B站看到:
https://www.bilibili.com/video/bv1zy4y1W7oh
电路图和 PCB 可以在这里下载,使用 立创 EDA 设计,这是一款国产的在线电路图设计软件,非常方便,推荐有需要的朋友试试。
补充一下修改后的库
页:
[1]