Arduino模拟键盘输入信息
本示例将演示使用Arduino Leonardo模拟USB键盘输出信息。
要直接模拟键盘输入信息很简单,只需使用Keyboard.print() 或者Keyboard.println() 即可。这里我们要做个文本发送器,每按一次按键,输入一条信息。
实验连接示意图如图9-1所示,在2号引脚上连接了一个10K上拉电阻,如果你使用的是按键模块,那你可能需要将对应引脚口设置开启内部上拉电阻。
模拟键盘输入实验连接示意图
示例程序如下,你可以在文件>示例>09.USB>Keyboard>KeyboardMessage找到该程序。
#include "Keyboard.h"
const int buttonPin = 4; // 按键连接引脚
int previousButtonState = HIGH; // 之前按键状态
int counter = 0; // 按键计数器
void setup() {
// 初始化按键引脚,如果没有上拉电阻,需要使用INPUT_PULLUP
pinMode(buttonPin, INPUT);
// 初始化模拟键盘功能
Keyboard.begin();
}
void loop() {
// 读按键状态
int buttonState = digitalRead(buttonPin);
// 如果按键状态改变,且当前按键状态为高电平
if ((buttonState != previousButtonState) && (buttonState == HIGH)) {
// 按键计数器加1
counter++;
// 模拟键盘输出信息
Keyboard.print("You pressed the button ");
Keyboard.print(counter);
Keyboard.println(" times.");
}
// 保存当前按键状态,用于下一次比较
previousButtonState = buttonState;
}
下载程序后,选择一个可以输入文本的输入框,按下按键,你可以看到文本框中随即出现了“You pressed the button 1 times.”文本,再次按下按键,程序中计数器会将数字加1,因此你会看到“You pressed the button 2 times.”文本。
9.2.1 Arduino Leonardo在模拟USB设备后,无法正常下载程序。
当用Arduino Leonardo模拟鼠标键盘时,键盘鼠标可能会出现失灵乱跳的情况,这往往是因为程序中对应控制按键操作的I/O口悬空所致。当I/O悬空时,检测到的输入电平为不定值,可能会误触发鼠标键盘操作。你可以通过pinMode(pin,INPUT_PULLUP) 语句开启对应引脚上的内部上拉电阻,或者外接上下拉电阻,让悬空时引脚检测到的电平稳定。本示例中即是通过给按键外接上拉电阻,确保按键未按下时I/O能读到高电平。
在模拟USB设备后,USB口处于USB通信状态,此时可能无法正确下载程序,解决方法如下:
按住Arduino Leonardo上的复位按键不放,点击上传,等待IDE编译,待Arduino提示上传中时,放开复位按钮,等待完成下载。
更推荐的方法是,给USB设备模拟程序都添加一个按键开关,当点击这个按键开关后,Arduino才开始模拟USB设备。
模拟键盘组合按键
以下程序,可以将Arduino Leonardo模拟成键盘,通过触发2号引脚上连接的按键或者传感器,可以让你的计算机自动注销登录状态。
实现原理即是使用当前系统对应的快捷键功能,先通过Keyboard.press() 将需要使用的按键都选中,然后使用Keyboard.releaseAll() 释放按键,即可模拟键盘同时按下组合按键的效果。
在示例程序中,我们将通过以上方法模拟组合按键按下效果,以达到注销登录状态的目的。
你可以在文件>示例>09.USB>Keyboard>Keyboard Logout找到该程序。
#define OSX 0
#define WINDOWS 1
#define UBUNTU 2
// 设置你的操作系统
int platform = WINDOWS;
void setup() {
// 将2号引脚设置为输入状态
// 并开启内部上拉电阻
pinMode(2, INPUT_PULLUP);
Keyboard.begin();
}
void loop() {
while (digitalRead(2) == HIGH) {
// 等待2号引脚变成低电平
delay(500);
}
delay(1000);
switch (platform) {
case OSX:
Keyboard.press(KEY_LEFT_GUI);
// Shift+Q组合按键
Keyboard.press(KEY_LEFT_SHIFT);
Keyboard.press('Q');
delay(100);
Keyboard.releaseAll();
// 回车确认:
Keyboard.write(KEY_RETURN);
break;
case WINDOWS:
// CTRL+ALT+DEL组合按键
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_DELETE);
delay(100);
Keyboard.releaseAll();
// ALT+L组合按键:
delay(2000);
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press('l');
Keyboard.releaseAll();
break;
case UBUNTU:
// CTRL+ALT+DEL组合按键
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_DELETE);
delay(1000);
Keyboard.releaseAll();
// 回车键确认登出
Keyboard.write(KEY_RETURN);
break;
}
// 进入死循环,相当于结束程序
while(true);
}
每种系统的对应的快捷键均不一样,因此,下载该程序前,你需要先将程序设置为你对应的系统,这里使用了宏定义来实现直接将系统名称赋值给一个变量的效果。
#define OSX 0
#define WINDOWS 1
#define UBUNTU 2
// 设置你的操作系统
int platform = WINDOWS;
下载并运行程序,通过触发2号引脚上的按键或者传感器,当2号引脚读到低电平时,即会触发计算机执行注销当前用户的操作。