查看: 21674|回复: 17

Arduino模拟USB键盘

[复制链接]

该用户从未签到

发表于 2018-9-3 23:32 | 显示全部楼层 |阅读模式

模拟键盘输入信息

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


[sf]

要直接模拟键盘输入信息很简单,只需使用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设备。

[/sf]

模拟键盘组合按键

以下程序,可以将Arduino Leonardo模拟成键盘,通过触发2号引脚上连接的按键或者传感器,可以让你的计算机自动注销登录状态。


[sf]

实现原理即是使用当前系统对应的快捷键功能,先通过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号引脚读到低电平时,即会触发计算机执行注销当前用户的操作。

[/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 来自手机 | 显示全部楼层
不知道如何购买
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

【花雕动手做】快餐盒盖,极低成本搭建机器人实验平台
【花雕动手做】快餐盒盖,
吃完快餐粥,除了粥的味道不错之外,我对个快餐盒的圆盖子产生了兴趣,能否做个极低成
【教程】M5StickV深度学习之微信跳一跳
【教程】M5StickV深度学习
M5StickV深度学习之微信跳一跳 【故事】 M5StickV以及后续的Unit-V都是M5Stack.co
AT固件编译出错怎么回事?
AT固件编译出错怎么回事?
在IDE里添加了Blinker的库,然后烧录AT固件的时候说编译出错 啥都没改动,就出错了,
DIY宠物喂食器,竟如此简单,更有硬件开发工具免费领!
DIY宠物喂食器,竟如此简
去年疫情突发,封城、封小区以及人员隔离,让原本享受千般宠爱的主子们变成了靠吃猫砂
ps2遥控小车——uno实现
ps2遥控小车——uno实现
前几天在阁楼发现了好久以前3d打印,激光切割的底盘,于是决定做这个东西 正好手上又
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表