[ESP8266/ESP32]FireBeetle 的 USB Shield 精华

5007浏览
查看: 5007|回复: 3

[ESP8266/ESP32] FireBeetle 的 USB Shield

[复制链接]
目前市面上最成熟的 USB Host 库当属OlegMazurovUSB 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 的 USB Shield图1

上述芯片和 FireBeetle接口如下图,二者是通过 SPI 来进行通讯的。下图中IO18/23/19/13就是 SPI 接口。特别注意,我在板子上预留了 JP3/JP2 这是为以后堆叠使用可能发生的引脚冲突预留的,正常使用的时候 JP1JP3(称作短接电阻) 是需要焊接起来的;JP2的功能是预留给某些情况下 USB 设备需要功耗较高,FireBeetle无法提供时就需要考虑使用外部5V进行供电,此时如果你还使用FIreBeetle上的 USB端口调试,既有可能出现外部5VUSB 上面的5V 电压不同的情况。因此,这种情况下需要断开 JP2
FireBeetle 的 USB Shield图2
接下来继续进行硬件设计,绘制PCB。特别注意,下面电路图时有缺陷的,再晶振下面走线,有可能对信号有影响。建议需要的朋友重新设计 PCB
FireBeetle 的 USB Shield图3

3D 预览结果:

FireBeetle 的 USB Shield图4

之后,打板,焊接成品如下,黑色PCB 很有 DFRobot 出品的感觉。
FireBeetle 的 USB Shield图5

接下来就用这个板子配合 FireBeetle来实现一个 USB 键盘转蓝牙的作品。
1.     为了驱动这个 USB Host Shield 需要对 USB Host Library 做一点修改。
1.1  UsbCore.h 中修改为我们使用的SS和INTPin
#elif defined(ESP32)
//LABZ typedef MAX3421e<P5, P17> MAX3421E; // ESP32 boards
typedef MAX3421e<P13, P26> MAX3421E; // ESP32 boards  // LABZ
#else
1.2  usbhost.h 中修改为我们使用的 SPI
#elif defined(ESP32)
//LABZ typedef SPi< P18, P23, P19, P5 > spi;
typedef SPi< P18, P23, P19, P13 > spi; // LABZ
#else
2.     蓝牙键盘功能的实现。这里我们需要用到 ESP32 BLE Keyboard library,在 https://github.com/T-vK/ESP32-BLE-Keyboard可以找到这个项目。
3.     最终的代码如下:
  1. #include <hidboot.h>
  2. #include <SPI.h>
  3. #include <BleKeyboard.h>
  4. BleKeyboard bleKeyboard;
  5. class KbdRptParser : public KeyboardReportParser
  6. {
  7.     void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
  8. };
  9. void KbdRptParser::Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
  10. {
  11.   if (bleKeyboard.isConnected()) {
  12.     KeyReport _keyReport;
  13.     _keyReport.modifiers=buf[0];
  14.     for (int i = 2; i < 8; i++) {
  15.       _keyReport.keys[i-2] = buf[i];
  16.     }
  17.     bleKeyboard.sendReport(&_keyReport);
  18.   }
  19.   Serial.print("Received ");  Serial.println(len);
  20.   for (int i = 0; i < len; i++) {
  21.     Serial.print(buf[i]);
  22.     Serial.print("  ");
  23.   }
  24.   Serial.println("  ");
  25. }
  26. USB     Usb;
  27. HIDBoot<USB_HID_PROTOCOL_KEYBOARD>    HidKeyboard(&Usb);
  28. KbdRptParser Prs;
  29. void setup()
  30. {
  31.   Serial.begin( 115200 );
  32.   Serial.println("Start");
  33.   if (Usb.Init() == -1)
  34.     Serial.println("OSC did not start.");
  35.   bleKeyboard.begin();
  36.   delay( 200 );
  37.   HidKeyboard.SetReportParser(0, &Prs);
  38. }
  39. void loop()
  40. {
  41.   Usb.Task();
  42. }
复制代码

简单的说上电之后,在PC上搜索蓝牙设备,配对之后就可以通过 USB Host Shield 解析键盘数据,然后将这个数据直接填写到蓝牙键盘的结构体中,FIreBeetle随即将这个信息传递给 PCPC上就能收到你的按键信息了。
FireBeetle 的 USB Shield图6

zoologist  高级技匠
 楼主|

发表于 2021-5-22 21:15:21

工作的视频可以在B站看到:


回复

使用道具 举报

zoologist  高级技匠
 楼主|

发表于 2021-5-22 21:17:38

电路图和 PCB 可以在这里下载,使用 立创 EDA 设计,这是一款国产的在线电路图设计软件,非常方便,推荐有需要的朋友试试。

下载附件FireBeetleUSBHostShield.zip
回复

使用道具 举报

zoologist  高级技匠
 楼主|

发表于 2022-3-12 20:38:33

补充一下修改后的库下载附件USB_Host_Shield_Library_2.0FORESP32S2.ZIP
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail