FireBeetle 显示鼠标移动

三年前设计过一个 FireBeetle USB Host Shied【参考1】,后来有其他项目需要再次使用,因为主控芯片 Max3421e 的特定封装很难买到,所以进行了重新设计选择了市面上更常见的封装。

电路设计如下:

其中的H3条线是预留的USB设备供电,短路时USB 母头(U2)将会从 VCC 引脚取电给USB设备使用。

硬件方面,使用到如下引脚有:

FireBeetle引脚功能
VCC为USB 设备供电
3.3V为 Max3421e 芯片供电
GND
D8(IO5)SS信号
IO18SCLK信号
IO23MOSI信号
IO19MISO信号
IO17INT信号

上述引脚的选择原因是能够最大限度兼容USB Host Shield Library,无需修改这个 Library 即可正常工作。

最终PCB设计如下:

3D 预览如下:

焊接后实物图如下:

从左到右分别是 FireBeetle USB Host Shield, FireBeetle【DFR0478,参考2】 和 12864 OLED【DFR0507,参考3】。

将三者叠放连接起来,通过FireBeetle USB接口供电即可工作:

接下来进行代码设计,代码参考了USB Host Shield Library中的 UBSHIDBootMouse 的例子,以及OLED Library 中的DFRobot_OLED12864ChineseDemo 例子。

#include "DFRobot_OLED12864.h"
#include <hidboot.h>
#include <usbhub.h>
#include <SPI.h>

const uint8_t I2C_addr = 0x3c;
const uint8_t pin_SPI_cs = D2;

DFRobot_OLED12864 OLED(I2C_addr, pin_SPI_cs);

USB     Usb;
USBHub     Hub(&Usb);
HIDBoot<USB_HID_PROTOCOL_MOUSE>    HidMouse(&Usb);


class MouseRptParser : public MouseReportParser
{
protected:
  void OnMouseMove  (MOUSEINFO *mi);
  void OnLeftButtonUp (MOUSEINFO *mi);
  void OnLeftButtonDown (MOUSEINFO *mi);
  void OnRightButtonUp  (MOUSEINFO *mi);
  void OnRightButtonDown  (MOUSEINFO *mi);
  void OnMiddleButtonUp (MOUSEINFO *mi);
  void OnMiddleButtonDown (MOUSEINFO *mi);
};
void MouseRptParser::OnMouseMove(MOUSEINFO *mi)
{
    char str[14];
    
    sprintf(str, "x=%d y=%d    ", mi->dX,mi->dY);
    OLED.disStr(0, 16, (char *)str);
    OLED.display();

    Serial.print("dx=");
    Serial.print(mi->dX, DEC);
    Serial.print(" dy=");
    Serial.println(mi->dY, DEC);
    Serial.println(str);
};
void MouseRptParser::OnLeftButtonUp (MOUSEINFO *mi)
{
    Serial.println("L Butt Up");

    OLED.disStr(0, 32, "L Butt Up   ");
    OLED.display();
};
void MouseRptParser::OnLeftButtonDown (MOUSEINFO *mi)
{
    Serial.println("L Butt Dn");
    OLED.disStr(0, 32, "L Butt Dn  ");
    OLED.display();    
};
void MouseRptParser::OnRightButtonUp  (MOUSEINFO *mi)
{
    Serial.println("R Butt Up");
    OLED.disStr(0, 32, "R Butt Up   ");
    OLED.display();    
};
void MouseRptParser::OnRightButtonDown  (MOUSEINFO *mi)
{
    Serial.println("R Butt Dn");
    OLED.disStr(0, 32, "R Butt Un   ");
    OLED.display();    
};
void MouseRptParser::OnMiddleButtonUp (MOUSEINFO *mi)
{
    Serial.println("M Butt Up");
    OLED.disStr(0, 32, "M Butt Up   ");
    OLED.display();    
};
void MouseRptParser::OnMiddleButtonDown (MOUSEINFO *mi)
{
    Serial.println("M Butt Dn");
    OLED.disStr(0, 32, "M Butt Up   ");
    OLED.display();    
};

MouseRptParser                               Prs;


void setup(void)
{
  Serial.begin(115200);
  OLED.init();
  OLED.flipScreenVertically();

    if (Usb.Init() == -1)
        Serial.println("OSC did not start.");

    delay( 200 );

    HidMouse.SetReportParser(0, &Prs);

    OLED.disStr(0, 0, "Mouse测试");
    OLED.display();
}


void loop(void)
{

    Usb.Task();
    

}    

本文提到的电路图和PCB下载(立创EDA设计,但是特别注意,不要使用电路图中的BOM):

本文提到的库下载:

参考:

  1. https://www.lab-z.com/fbusb/
  2. https://wiki.dfrobot.com.cn/_SKU_DFR0478_FireBeetle_Board_ESP32%E4%B8%BB%E6%9D%BF%E6%8E%A7%E5%88%B6%E5%99%A8V4_0
  3. https://wiki.dfrobot.com.cn/_SKU_DFR0507_FireBeetle_Covers-OLED12864_Display

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注