Arduino模拟USB鼠标-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 24399|回复: 19

Arduino模拟USB鼠标

[复制链接]
发表于 2018-9-3 23:33 | 显示全部楼层 |阅读模式
[md]### 模拟鼠标控制

下面将使用摇杆模块和Arduino Leonardo模拟USB鼠标。
[/md]
[sf]
[md]
**遥杆模块**
摇杆模块  由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模拟鼠标模式,现在你可以试着用摇杆和按键来完成计算机鼠标操作了。[/md][/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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 06:54 , Processed in 0.086941 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表