Arduino模拟USB键盘-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 41745|回复: 19

Arduino模拟USB键盘

[复制链接]
发表于 2018-9-3 23:32 | 显示全部楼层 |阅读模式
[md]
### 模拟键盘输入信息
本示例将演示使用Arduino Leonardo模拟USB键盘输出信息。
[/md]
[sf]
[md]
要直接模拟键盘输入信息很简单,只需使用Keyboard.print() 或者Keyboard.println() 即可。这里我们要做个文本发送器,每按一次按键,输入一条信息。
实验连接示意图如图9-1所示,在2号引脚上连接了一个10K上拉电阻,如果你使用的是按键模块,那你可能需要将对应引脚口设置开启内部上拉电阻。
keyboard1.png
模拟键盘输入实验连接示意图

示例程序如下,你可以在**文件>示例>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设备。
[/md][/sf]

[md]
### 模拟键盘组合按键

以下程序,可以将Arduino Leonardo模拟成键盘,通过触发2号引脚上连接的按键或者传感器,可以让你的计算机自动注销登录状态。
[/md]
[sf]
[md]
实现原理即是使用当前系统对应的快捷键功能,先通过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号引脚读到低电平时,即会触发计算机执行注销当前用户的操作。[/md][/sf]







发表于 2018-9-14 20:10 来自手机 | 显示全部楼层
没有购买按钮
发表于 2018-9-14 20:52 | 显示全部楼层

点“微信支付”
发表于 2018-9-16 13:22 来自手机 | 显示全部楼层
“微信支付”也没有!

点评

PC访问,使用chrome内核的浏览器  详情 回复 发表于 2018-9-16 14:26
发表于 2018-9-16 13:24 来自手机 | 显示全部楼层
he USBHost library is distributed under the General Public License version 2 (GPL2) as published by the Free Software Foundation. Any sketch that uses the library needs to be open-sourced under the GPL2 as well.
 楼主| 发表于 2018-9-16 14:26 | 显示全部楼层
flqqjl 发表于 2018-9-16 13:22
“微信支付”也没有!

PC访问,使用chrome内核的浏览器
发表于 2018-11-28 21:58 | 显示全部楼层
我来看看什么了~~~~
发表于 2018-12-4 10:40 | 显示全部楼层
我主板出了一点问题,开机需要按F1 这个可以实现吗?

点评

只要USB是好的就行  详情 回复 发表于 2018-12-4 10:44
 楼主| 发表于 2018-12-4 10:44 | 显示全部楼层
liuzhe1947 发表于 2018-12-4 10:40
我主板出了一点问题,开机需要按F1 这个可以实现吗?

只要USB是好的就行
发表于 2019-4-11 09:22 来自手机 | 显示全部楼层
不知道如何购买
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-1 06:53 , Processed in 0.096196 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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