[md]### 模拟鼠标控制
下面将使用摇杆模块和Arduino Leonardo模拟USB鼠标。
[/md]
[sf]
[md]
**遥杆模块**
摇杆模块 由X/Y轴两个10K电位器和一个轻触按键组成。当摇杆在不同位置时,X/Y轴对应的电位器读出的阻值也不同。
通常摇杆底部有一个可以按下的轻触按键,本示例将使用这个自带的按键来开启模拟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]
|