Arduino模拟键盘输入信息

autohost
发布于 2020-11-20 16:15
浏览
0收藏

本示例将演示使用Arduino Leonardo模拟USB键盘输出信息。

要直接模拟键盘输入信息很简单,只需使用Keyboard.print() 或者Keyboard.println() 即可。这里我们要做个文本发送器,每按一次按键,输入一条信息。
实验连接示意图如图9-1所示,在2号引脚上连接了一个10K上拉电阻,如果你使用的是按键模块,那你可能需要将对应引脚口设置开启内部上拉电阻。

Arduino模拟键盘输入信息-鸿蒙开发者社区

模拟键盘输入实验连接示意图 

示例程序如下,你可以在文件>示例>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号引脚读到低电平时,即会触发计算机执行注销当前用户的操作。

 

分类
已于2020-11-20 16:15:26修改
收藏
回复
举报
回复
    相关推荐