Arduino UNO R3 软件实现HID键盘功能
极客工坊有帖子是搭硬件实现HID设备功能,但经搜索和了解,不用搭电路照样让我们的Arduino uno r3作HID 键盘或鼠标,这全归功于板子上的atemga16u芯片,平常是作为usb转串口的其实这是内部程序实现的,也就是说通过给它换所谓的bootloader即可实现其keyboard或鼠标功能,我只尝试了键盘的实现,所以这里只讲做键盘这方面的。这里先讲述一下,基本的工作原理如下图:根据上图,你可能会有疑问,HID识别码是个什么东东,其实这是我自己这么叫的,可以认为就是按键ID,用来告诉atmega16u2哪些按键按下了,这里有个规则,如图:
说明:特殊按键,就是一些修饰键,如ctrl,shift,alt等,这里这么简单说,可能会不太理解,结合下面具体做法就会明白了。
下面就具体说一下怎么实现,其实大体就分两方面工作:
1.Atmega328p的程序编写和下载;
2.Atmega16u2的bootloader下载;
展开来说:
1.Atmega328p的程序编写和下载:(1)下载对应的支持库,其实就是简单的串口通信封装的一些方法和对应按键的按键ID的宏定义:下载地址USBKeyboard,库下载后解压安装。
说明一下,之前库是下载的网上的,不过有个小毛病,没考虑到同时按下多个键的情况,而且每发送一个按键按下的消息后都会发送按键松开的消息,我稍微修改了一下,将按键松开的消息独立出来,同时添加了一些同时按下按键的方法。代码里未做注释,不过能看懂,在这里稍稍说一下:
以字符串的形式发送消息的方法: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键
其他的自己看吧,很简单的
(2)可打开刚安装的库的Example,其中有个helloworld,或者自己创建新的sketchbook如下:#include <USBKeyboard.h>
void setup()
{
Keyboard.init();
}
void loop()
{
delay(5000);
Keyboard.print("hello world");
}
编译上传到uno板子,当然你也可以编写属于自己的代码,如此就完成第一步工作了。
2.Atmega16u2的bootloader下载:
下载bootloader的方法,论坛里有相关帖子,网上也有很多,自己多搜搜看看吧,搜到的台湾的一个论坛方法是让atmega16u2进入DFU模式,但悲催的是,我的板子是国内山寨货不能进入DFU模式,无语,便宜果然没好货,感兴趣的可以看最后我贴的帖子地址,之后又搜了好多资料,终于找到适合我自己用的方法,因为我只有ft232r usb转串口线,所以我参考了YFduino论坛里YFRobot的帖子:利用ft232r的Bitbang模式给arduino控制器重新烧写bootloader,因为以我的条件我只能用这种方法,在此感谢!
说一操作过程吧:
(1)下载avrdude压缩包,,地址:avrdude
压缩包里有avrdude和其对应的avrdude-GUI以及用到的两个bootloader,一个是支持keyboard的Arduino-keyboard-0.3.hex和原来的做usb转串口的Arduino-usbserial-uno.hex
(2)将FT232R串口线与uno r3板子上的Atmega16u2连接,如图:
打开avrdude-GUI,按照如图操作:
这就完成了两大工作,之后将Ft232r串口线与板子断开,将Arduino UNO r3板子通过他的USb口连接电脑,在电脑上找个能输文本的地方,单击光标闪动,你会看到每隔5s就会有一个helloWorld字符串出现,怎么样不错吧,利用这个探索其它的玩法吧!
如果想让板子回到原来的状态,为Atmega16u2下载Arduino-usbserial-uno.hex即可
参考资料:
1.Cooper Maa论坛(台湾的)帖子:(可能需要翻墙)
讓Arduino Uno變成USB鍵盤
USBKeyboard Library
2.YFduino
利用ft232r的Bitbang模式给arduino控制器重新烧写bootloader
3.极客工坊
arduino uno mega2560等各种不同板子bootloader烧写方法
等等
写的真棒,能不能提供一下鼠标的操作?还有那个avrdude压缩包,在win7下提示缺少FTD2xx.DLL 在下列位置可下载,将档案放置在avrdude.exe相同目录下。
http://cn.dll-files.com/ftd2xx.dll.html 我手边的UNO R3板似乎也无法进入DFU模式,我仅有Silicon CP2102这款USB转串口线,请问该如何连接至16U2进行烧写韧体。 bboxer,为什么我的Uno r3在上传程序(就是从你这下的库)时出现‘Keyboard’only supported in the arduino leonardo? Bluefire 发表于 2014-6-24 11:56
bboxer,为什么我的Uno r3在上传程序(就是从你这下的库)时出现‘Keyboard’only supported in the arduino ...
我提供的是这个http://pan.baidu.com/s/1pJFIiLl,你下载试一下,其实就只是利用串口给16u2发送指令 greenliu 发表于 2014-6-21 01:46
我手边的UNO R3板似乎也无法进入DFU模式,我仅有Silicon CP2102这款USB转串口线,请问该如何连接至16U2进行 ...
呀,没用过Silicon CP2102这款USB转串口线,不过我搜了一下,好像不支持ISP接口,所以可能没法用它没法烧写bootloader 你好,虽然帖子过去很长时间了,但是,看了很感兴趣,。不过下载地址已经没有了,不知道您方便给我发一个吗?主要就是支持库的。谢谢!!474581530@qq.com zhaoxintc 发表于 2016-3-10 07:56
你好,虽然帖子过去很长时间了,但是,看了很感兴趣,。不过下载地址已经没有了,不知道您方便给我发一个吗 ...
呃,不好意思哈,整理网盘的时候放到其他文件夹了,这个地址有效USBKeyboard,看来也得修改一下文中的下载地址,:D bboxer 发表于 2016-3-10 11:41
呃,不好意思哈,整理网盘的时候放到其他文件夹了,这个地址有效USBKeyboard,看来也得修改一下文中的下 ...
谢谢!!非常感谢