zoologist 发表于 2023-1-15 11:26:40

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信号
上述引脚的选择原因是能够最大限度兼容USBHost Shield Library,无需修改这个 Library 即可正常工作。最终PCB设计如下:
3D 预览如下:
焊接后实物图如下:
从左到右分别是 FireBeetle USB Host Shield, FireBeetle【DFR0478,参考2】 和 12864 OLED【DFR0507,参考3】。将三者叠放连接起来,通过FireBeetleUSB接口供电即可工作:
接下来进行代码设计,代码参考了USBHost Shield Library中的 UBSHIDBootMouse 的例子,以及OLEDLibrary 中的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;
   
    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();
   

}   
参考: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_03.   https://wiki.dfrobot.com.cn/_SKU_DFR0507_FireBeetle_Covers-OLED12864_Display

zoologist 发表于 2023-1-15 11:32:15

本次设计使用到的 Library



代码:


电路图和PCB(使用立创EDA 设计,但是特别注意请勿参考自身BOM):

三春牛-创客 发表于 2023-1-15 17:03:16

厉害厉害
页: [1]
查看完整版本: FireBeetle 显示鼠标移动