利用arduino uno模拟手机hid鼠标

22年的时候尝试过用arduino模拟usb键盘实现自动向手机输入一些字符串。见博文《利用arduino uno模拟手机hid键盘》,这几天刷视频的时候想实现一个自动上滑的效果,就想看下手头的arduino uno能否模拟usb鼠标。官方的mouse库仅适用于arduino leonardo以及nano等,所以想实现这个效果,还是需要另辟蹊径,好在也有大神用类似模拟键盘的方式,给出了mouse的hex文件,以下是下载链接,需要注意的是,这个案例仅适合安卓手机,ios对于接入设备有严格的认证机制,插入模拟鼠标后完全没有响应:

百度网盘

unoMouse项目文件

示例程序

/* Arduino USB Mouse HID demo */
 
/* Author: Darran Hunt
 * Release into the public domain.
 */
 
struct {
    uint8_t buttons;
    int8_t x;
    int8_t y;
    int8_t wheel;   /* Not yet implemented */
} mouseReport;
 
uint8_t nullReport[4] = { 0, 0, 0, 0 };
 
void setup();
void loop();
 
void setup()
{
    Serial.begin(9600);
    delay(200);
}
 
/* Move the mouse in a clockwise square every 5 seconds */
void loop()
{
    int ind;
    delay(1000);
 
    mouseReport.buttons = 0;
    mouseReport.x = 0;
    mouseReport.y = 0;
    mouseReport.wheel = 0;
 
    mouseReport.x = -2;
    for (ind=0; ind<20; ind++) {
    Serial.write((uint8_t *)&mouseReport, 4);
    Serial.write((uint8_t *)&nullReport, 4);
    }
 
    mouseReport.x = 0;
    mouseReport.y = -2;
    for (ind=0; ind<20; ind++) {
    Serial.write((uint8_t *)&mouseReport, 4);
    Serial.write((uint8_t *)&nullReport, 4);
    }
 
    mouseReport.x = 2;
    mouseReport.y = 0;
    for (ind=0; ind<20; ind++) {
    Serial.write((uint8_t *)&mouseReport, 4);
    Serial.write((uint8_t *)&nullReport, 4);
    }
 
    mouseReport.x = 0;
    mouseReport.y = 2;
    for (ind=0; ind<20; ind++) {
    Serial.write((uint8_t *)&mouseReport, 4);
    Serial.write((uint8_t *)&nullReport, 4);
    }
}

美中不足

遗憾的是,这个hex暂未实现鼠标滚轮的模拟。想实现一个向上滚动的动作,可以考虑以向下空滑->按下鼠标左键->保持按键->向上滑动的方式来代替,这里提供一个样例程序:

struct {
    uint8_t buttons;
    int8_t x;
    int8_t y;
    int8_t wheel;
} mouseReport;

uint8_t nullReport0[4] = { 0, 0, 0, 0 };
uint8_t nullReport1[4] = { 1, 0, 0, 0 };

void setup() {
    Serial.begin(9600);
    delay(200);
    randomSeed(analogRead(0));
}

void loop() {
   
    mouseReport.x = 0;
    mouseReport.y = 100;  
    Serial.write((uint8_t *)&mouseReport, 4);
    Serial.write((uint8_t *)&nullReport0, 4);
    mouseReport.buttons = 1;  
    mouseReport.x = 0;
    mouseReport.y = -100;
    Serial.write((uint8_t *)&mouseReport, 4);
    Serial.write((uint8_t *)&nullReport1, 4);
    mouseReport.x = 0;
    mouseReport.y = -0;
    mouseReport.buttons = 0;
    Serial.write((uint8_t *)&mouseReport, 4);
    Serial.write((uint8_t *)&nullReport0, 4);
    int randomDelay = random(5000, 8001);
    delay(randomDelay);
}

循环版本

实际测试中发现不添加停顿容易产生偏移与上滑失败的现象,重新修改了一下程序,在安卓上测试通过,但ios无法识别到这个设备:

struct {
    uint8_t buttons;
    int8_t x;
    int8_t y;
    int8_t wheel;
} mouseReport;

uint8_t nullReport0[4] = { 0, 0, 0, 0 };
uint8_t nullReport1[4] = { 1, 0, 0, 0 };

void setup() {
    Serial.begin(9600);
    delay(200);
    randomSeed(analogRead(0));
}

void loop() {
    
    mouseReport.x = 0;
    mouseReport.y = 100;
    for(int i=1;i<=6;i++){
      Serial.write((uint8_t *)&mouseReport, 4);
      Serial.write((uint8_t *)&nullReport0, 4);
      delay(20);    
    }  
    
    mouseReport.buttons = 1;  
    mouseReport.x = 0;
    mouseReport.y = -100;
    for(int i=1;i<=6;i++){
      Serial.write((uint8_t *)&mouseReport, 4);
      Serial.write((uint8_t *)&nullReport1, 4);    
      delay(20);
    }

    mouseReport.x = 0;
    mouseReport.y = -50;
    mouseReport.buttons = 0;
    Serial.write((uint8_t *)&mouseReport, 4);
    Serial.write((uint8_t *)&nullReport0, 4);
    int randomDelay = random(2000, 3001);
    delay(randomDelay);
    
}

标签: Arduino

移动端可扫我直达哦~

推荐阅读

thumbnail 2023-03-28

用arduino+0.91寸OLED实现一个简单菜单

整理桌子的时候翻到这份打印出来的文件,依稀记得是孩子学校的一个小任务,实现一个计时器,按下后开始计时,到时间了驱动电机举牌。当时正学习arduino,就尝试用arduino配合0.91寸OLED实现了一个粗糙的模型,增加了一个简单菜单...

少儿编程 Arduino

thumbnail 2022-12-29

arduino驱动4针0.91寸OLED显示屏

买过arduino的入门套装,包含一块显示屏幕,但是该屏幕的占用针脚太多,接线麻烦只是其中一方面,你把针脚都给占了我拿什么输入输出呀。于是就从网上另购了一块4针的0.91寸的oled显示屏,赶上活动价实付5元还给包邮,就象脱口秀里说的...

少儿编程 Arduino

thumbnail 2022-12-25

利用arduino uno模拟手机hid键盘

hid设备Human Interface Device的缩写,由其名称可以了解HID设备是直接与人交互的设备,例如键盘、鼠标与游戏杆等。dfu模式DFU的全称是Development FirmwareUpgrade,实际意思就是设备固...

少儿编程 Arduino

thumbnail 2022-10-12

关于Arduino的简单介绍

什么是单片机一台能够工作的计算机要有这样几个部份构成:中央处理单元CPU、随机存储器RAM、存储器ROM、输入/输出设备。在个人计算机上这些部份被分成若干块芯片,安装在一个被称之为主板的印刷线路板上。而在单片机中,这些部份全部被做到一...

少儿编程 Arduino