查看: 20964|回复: 19

Arduino模拟USB鼠标

[复制链接]

该用户从未签到

发表于 2018-9-3 23:33 | 显示全部楼层 |阅读模式

模拟鼠标控制

下面将使用摇杆模块和Arduino Leonardo模拟USB鼠标。


[sf]

遥杆模块
摇杆模块  由X/Y轴两个10K电位器和一个轻触按键组成。当摇杆在不同位置时,X/Y轴对应的电位器读出的阻值也不同。
joystick.jpg       

通常摇杆底部有一个可以按下的轻触按键,本示例将使用这个自带的按键来开启模拟USB鼠标功能。

摇杆内部有两个带弹簧的可调电位器,当摇动时,会带动其中两个电位器游标触点,从而改变阻值。可以通过analogRead()读取两个电位器的模拟值,计算出电位器游标位置,从而判断当前摇杆在X/Y坐标系中的位置。

摇杆模块引脚情况如下表:

序号 标号 说明
1 B 轻触按键的一端,另一端接到GND(也可能有厂家接到VCC)
2 Y Y轴电位器游标触电对应的引脚
3 X X轴电位器游标触电对应的引脚
4 + VCC
5 - GND

示例程序代码如下:

// 摇杆硬件定义
int enableButton = 7; // 摇杆按键,用作鼠标功能使能按键
int upButton = 6;     // 上方按键,模拟滚轮向上
int downButton = 3;   // 下方按键,模拟滚轮向下
int leftButton = 5;   // 左按键,模拟鼠标左键
int rightButton = 4;  // 右按键,模拟鼠标右键
int xAxis = A1;       // 遥感X轴
int yAxis = A0;       // 遥感Y轴

int mouseSensitivity = 12; // 鼠标灵敏度
int wheelSensitivity = 1;  // 滚轮灵敏度

boolean enable = false;               // 模拟鼠标功能是否可用
boolean lastEnableButtonState = HIGH; // 上一次使能按键读值

void setup() {
  // 初始化各个按键
  pinMode(enableButton, INPUT);
  pinMode(upButton, INPUT);
  pinMode(downButton, INPUT);
  pinMode(leftButton, INPUT);
  pinMode(rightButton, INPUT);
  // 开始控制鼠标
  Mouse.begin();
}

void loop() {
  // 使能按键按一次使能,再按一次不使能
  boolean EnableButtonState = digitalRead(enableButton);
  if ((EnableButtonState == LOW) && (EnableButtonState != lastEnableButtonState)) {
    enable = !enable;
  }
  lastEnableButtonState = EnableButtonState;

  if (enable) {
    // 读取鼠标偏移值
    int x = readAxis(xAxis);
    int y = readAxis(yAxis);
    // 读取鼠标滚轮值
    int wheel = 0;
    if (digitalRead(upButton) == LOW) {
      wheel = wheelSensitivity;
    }
    else if (digitalRead(downButton) == LOW) {
      wheel = -wheelSensitivity;
    }
    // 移动鼠标位置或滚轮
    Mouse.move(x, y, wheel);
    // 点击鼠标左右键
    isClickButton(leftButton, MOUSE_LEFT);
    isClickButton(rightButton, MOUSE_RIGHT);
    // 延时一段时间,可以通过该值调整鼠标移动速度
    delay(10);
  }
}
// 读取摇杆数据
// 即摇杆电位器的偏移量
int readAxis(int thisAxis) {
  int reading = analogRead(thisAxis);
  // 将读出的模拟值,缩小到一定范围
  reading = map(reading, 0, 1023, 0, mouseSensitivity);
  // 计算出一个鼠标偏移量
  int distance = reading - (mouseSensitivity / 2);
  int threshold = mouseSensitivity / 4;
  // 如果电位器偏移量较小则不移动鼠标
  if (abs(distance) < threshold) {
    distance = 0;
  }
  // 返回鼠标偏移量
  return distance;
}
// 判断按键是否被按下
void isClickButton(int Buttonpin, uint8_t Button) {
  if (digitalRead(Buttonpin) == LOW) {
    if (!Mouse.isPressed(Button)) {
      Mouse.press(Button);
    }
  }
  else if (Mouse.isPressed(Button)) {
    Mouse.release(Button);
  }
}

下载以上程序后,Leonardo会自动切换到USB模拟鼠标模式,现在你可以试着用摇杆和按键来完成计算机鼠标操作了。

[/sf]

该用户从未签到

发表于 2018-10-22 21:26 | 显示全部楼层
micro 的鼠标能精准移动么? 我写的代码里 不能进行精准移动 move 1,0,0 for 100次 实际上只移动了52个像素

该用户从未签到

发表于 2018-11-1 21:21 | 显示全部楼层
Mose 这个类在程序里没有定义呀,是应该还有个头文件吗?

该用户从未签到

发表于 2018-12-19 10:49 来自手机 | 显示全部楼层
怎么买啊?没有购买按钮

该用户从未签到

发表于 2019-5-9 10:39 | 显示全部楼层
123的发射点发大水阿斯蒂芬阿斯顿

该用户从未签到

发表于 2019-8-10 21:35 | 显示全部楼层
第一次接触这东西,来学习学习,

该用户从未签到

发表于 2019-8-21 11:38 | 显示全部楼层
看看能不能用,现在正在做这个玩

该用户从未签到

发表于 2019-10-9 00:08 | 显示全部楼层
li23829390 发表于 2019-8-21 11:38
看看能不能用,现在正在做这个玩

现在还在弄吗  我有问题需要请教您一下  方便加个微信吗   我微信wuzi7778889

该用户从未签到

发表于 2019-10-9 00:09 | 显示全部楼层
li23829390 发表于 2019-8-21 11:38
看看能不能用,现在正在做这个玩

我有个问题需要请教您一下  方便加个微信吗   我微信wuzi7778889
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

IRremoteESP8266都是英文的 用法看不懂
IRremoteESP8266都是英文
最近在用IRremoteESP8266库,但是里面用法解释都是全英文的,也没有例子,实在看起来
blinker物联网教程——6、wifi插座
blinker物联网教程——6、
简介[hr] 在日常生活中,我们可能有接触到wifi插座,所谓wifi插座就是给原本的插座加
想自制TB6612电机驱动模块
想自制TB6612电机驱动模块
想知道板子上三个电容的参数
ESP32用不了arduino库里的tone()函数!!!
ESP32用不了arduino库里的
选择用其他开发板就能用,唯独ESP32用不了,好像一直检索不到路径,折腾两天了
【搬运】初学者的PID教程 by Brett Beauregard
【搬运】初学者的PID教程
在网上看到一个写的很详细的PID教程,一步一步地讲解Arduino PID库的原理,非常棒。帖
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表