Arduino UNO R3 软件实现HID键盘功能

本文将介绍如何用Arduino UNO R3 软件实现HID键盘功能。

本文搬自我之前在Arduino中文社区的帖子-UNO R3 软件实现HID键盘功能,所以本文的时间节点与帖子一致。在Arduino中文社区里我叫bboxer,我真的会bbox幺,B h S h~,哈哈!

原理

极客工坊有帖子是搭硬件实现HID设备功能,但经搜索和了解,不用搭电路照样让我们的Arduino uno r3作HID 键盘或鼠标,这全归功于板子上的atemga16u芯片,平常是作为usb转串口的其实这是内部程序实现的,也就是说通过给它换所谓的bootloader即可实现其keyboard或鼠标功能,我只尝试了键盘的实现,所以这里只讲做键盘这方面的。这里先讲述一下,基本的工作原理如下图:

1

根据上图,你可能会有疑问,HID识别码是个什么东西,其实这是我自己这么叫的,可以认为就是按键ID,用来告诉atmega16u2哪些按键按下了,这里有个规则,如图:

2

说明:特殊按键,就是一些修饰键,如ctrl,shift,alt等,这里这么简单说,可能会不太理解,结合下面具体做法就会明白了。

实现

ATmega328p的程序编写和下载

下载对应支持库

其实就是简单的串口通信封装的一些方法和对应按键的按键ID的宏定义,点我下载库,库下载后解压安装。

说明一下之前库是下载的网上的,不过有个小毛病,没考虑到同时按下多个键的情况,而且每发送一个按键按下的消息后都会发送按键松开的消息,我稍微修改了一下,将按键松开的消息独立出来,同时添加了一些同时按下按键的方法。代码里未做注释,不过能看懂,在这里稍稍说一下:

方法 代码
以字符串的形式发送消息的方法: Keyboard.print(),例如Keyboard.print(“helloWorld”);//区分大小写
只发送单个按键按下不松消息的方法: Keyboard.sendKeyStrokeUnReleased(KEY_A);//按下按键A且不松开或Keyboard.sendKeyStroke(KEY_A, 0);//第二个参数是修饰键ID(shift等),用的话要使用对应宏定义见hid_keys.h
只发送按键松开的消息,其实就是HID码全是0: Keyboard.sendKeyReleased();//没有按下按键
同时按下两个按键的方法: 如,Keyboard.sendKeyStrokeUnReleased(KEY_A, KEY_B, 0);//同时按下A、B键
编写代码及下载

可打开刚安装的库的Example,其中有个helloworld,或者自己创建新的sketchbook如下:

#include <USBKeyboard.h>
 
void setup() 
{
  Keyboard.init();
}
 
void loop() 
{
  delay(5000);
  Keyboard.print("hello world");
}

编译上传到uno板子,当然你也可以编写属于自己的代码,如此就完成第一步工作了。

ATmega16u2的程序编写和下载

下载bootloader的方法,论坛里有相关帖子,网上也有很多,自己多搜搜看看吧,搜到的台湾的一个论坛方法是让atmega16u2进入DFU模式,但悲催的是,我的板子是国内山寨货不能进入DFU模式,无语,便宜果然没好货,感兴趣的可以看最后我贴的帖子地址,之后又搜了好多资料,终于找到适合我自己用的方法,因为我只有ft232r usb转串口线,所以我参考了YFduino论坛里YFRobot的帖子:利用ft232r的Bitbang模式给arduino控制器重新烧写bootloader,因为以我的条件我只能用这种方法,在此感谢!

avrdude压缩包

点我下载avrdude压缩包, 压缩包里有avrdude和其对应的avrdude-GUI以及用到的两个bootloader,一个是支持keyboard的Arduino-keyboard-0.3.hex和原来的做usb转串口的Arduino-usbserial-uno.hex

Atmega16u2烧写专用程序

将FT232R串口线与uno r3板子上的Atmega16u2连接,如图:

3

按照图示步骤操作:

4

5

6

7

这就完成了两大工作,之后将Ft232r串口线与板子断开,将Arduino UNO r3板子通过他的USb口连接电脑,在电脑上找个能输文本的地方,单击光标闪动,你会看到每隔5s就会有一个helloWorld字符串出现,怎么样不错吧,利用这个探索其它的玩法吧!

如果想让板子回到原来的状态,为Atmega16u2下载Arduino-usbserial-uno.hex即可

参考

  1. Cooper Maa论坛(台湾的)帖子:(可能需要翻墙)
  2. YFduino
  3. 极客工坊

arduino

1919 字

2014-03-27 17:11 +0800