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
本次设计使用到的 Library
代码:
电路图和PCB(使用立创EDA 设计,但是特别注意请勿参考自身BOM):
厉害厉害
页:
[1]