极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 77535|回复: 61

Arduino学习笔记A11 - Arduino模拟电脑键盘(基于AVR-USB的USB-HID设备)

  [复制链接]
发表于 2012-6-8 17:19:19 | 显示全部楼层 |阅读模式
本帖最后由 弘毅 于 2012-12-18 08:50 编辑

Arduino模拟电脑键盘(基于AVR-USB的USB-HID设备)


关于此帖子的其他讨论,还可以看看
http://geek-workshop.com/thread-2303-1-1.html
http://geek-workshop.com/thread-2310-1-1.html



键盘作为经典的输入设备,使用在很多互动中都有特别的优势,比如我们可以通过键盘直接给flash传递按键事件。而无需通过串口之类的特殊接口,虽然我们可以拆一个传统的键盘,然后将里面的按键引出来,但是这样有一个缺点,就是键值不能动态改变并且不能一次多键。使用模拟键盘的话,我们就可以随意在程序设置按键的时间和键值。比如本文的例子就是按下一个按键,模拟键盘就在电脑输入“HELLO WORLD”。

硬件部分:
材料清单:
Arduino x1
68Ω电阻 x2 (没有68Ω的话,用50~100Ω电阻也行)
2.2kΩ电阻 x1 (没有2.2kΩ的话,用1.5k~2.2k电阻也行)
USB连接线(一端是USB口,另一端是电线) x1
3.6v 稳压管(建议选用功耗0.25~0.5w的)x2
1 (1).jpg 1 (6).jpg

电路原理图:
Arduino模拟键盘.gif
电路图解说:
1、两个68Ω的电阻起到限流和保护作用,防止在意外情况下损坏计算机的USB端口或单片机的端口。
2、2.2kΩ电阻是上拉电阻,用于分辨总线状态。如果上拉电阻接于D+和+5v端则是高速USB设备,接于D-与+5v端,则是低速设备。此处键盘传输速率不高,接到D-作为低速设备即可。
3、D+和D-上的3.6V稳压二极管D1和D2起到限制数据线上的电平的作用。因为在USB规范中规定数据线D+和D-上的电平范围是3.0V至3.6V,而AVR单片机的输出电平是Vcc。如果单片机的Vcc是5V,在没有D1和D2的情况下将造成电平不匹配,会造成在很多计算机中无法正确识别出USB设备。如果用户系统的Vcc在3.0V至3.6V之间,就可以省略这两个稳压二极管。从这里也可以看出用户系统的Vcc必须高于3V。
4、由于低速AVRUSB所需要的是1.5MHz时钟,而单片机每8条指令就能精确完成一个数据位的采集。所以AVRUSB最小单片机时钟频率是12MHz。并且可以使用的时钟频率有12MHz、12.8MHz、15MHz、16MHz、16.5MHz、20MHz,其他的不支持。所以如果使用最小系统制作此模拟键盘的话8MHz的话,ATMega8L不能用。
————————
软件部分:

Arduino支持库文件:
http://soft1.wmzhe.com/download/ ... ino/UsbKeyboard.zip
UsbKeyboard.zip (112.45 KB, 下载次数: 2556)
回复

使用道具 举报

发表于 2012-7-11 16:18:22 | 显示全部楼层
这么好的贴,要顶哟
回复 支持 反对

使用道具 举报

发表于 2012-7-11 17:32:24 | 显示全部楼层
按键精灵?

点评

还是硬件版本的,haha  发表于 2012-7-11 17:54
回复 支持 反对

使用道具 举报

发表于 2012-7-31 22:16:35 | 显示全部楼层
你好。我看了你的模拟键盘的教程,我照着做了一遍,但是我接usb线到pc时,提示不能识别的设备。我确定稳压二极管方向是对的,电阻也是对的。我也将程序刷到arduino了。(我用的UNO)
我量了一下D2跟GND之间的电压时2.8v,D1的电压是 -0.3v。这正常么?
非常感谢。
回复 支持 反对

使用道具 举报

发表于 2012-8-1 00:13:36 | 显示全部楼层
我用usb转TTL来代替USB线可以么……我也是UNO
回复 支持 反对

使用道具 举报

发表于 2012-8-1 00:15:01 | 显示全部楼层
漫步年华。。。 发表于 2012-8-1 00:13
我用usb转TTL来代替USB线可以么……我也是UNO

还有这句有什么用?
  TIMSK0 &= !(1 << TOIE0);        //
看头文件吃力@-@
回复 支持 反对

使用道具 举报

发表于 2012-9-20 09:44:24 | 显示全部楼层
看不懂,能详细解析下吗?谢谢
回复 支持 反对

使用道具 举报

发表于 2013-1-3 15:05:53 | 显示全部楼层
典型的AVRUSB程序,建议先看看“AVRUSB技术探讨”一文
回复 支持 反对

使用道具 举报

发表于 2013-1-4 09:42:34 | 显示全部楼层
好贴啊~~~~~
回复 支持 反对

使用道具 举报

发表于 2013-2-7 18:00:53 | 显示全部楼层
大火炉 发表于 2012-7-31 22:16
你好。我看了你的模拟键盘的教程,我照着做了一遍,但是我接usb线到pc时,提示不能识别的设备。我确定稳压二 ...

我开始也是这样,后来发现有一只二极管两端同时碰到USB B母口的金属壳子,短路了
-0.3V那只肯定短路了。
回复 支持 反对

使用道具 举报

发表于 2013-2-7 22:34:27 | 显示全部楼层
本帖最后由 tyroeg 于 2013-3-1 16:05 编辑
漫步年华。。。 发表于 2012-8-1 00:15
还有这句有什么用?
  TIMSK0 &= !(1


好像是AVR单片机系统里的东西
“Enable timer 0 interrupt”

Thanks to xSmurf the apparent cause of the instability has been identified. It appears the timer0 interrupt routine causes the USB side of things to barf. Interim work-around is to disable the timer in setup with:
        // disable timer 0 overflow interrupt (used for millis)
        TIMSK0&=!(1<<TOIE0);
Note that this "fix" will cause delay and millis to no longer function.
With this workaround in place I can reliably repeat typing.
In the interim I am using this for delays:
void delayMs(unsigned int ms) {
   /*
  */
  for (int i = 0; i < ms; i++) {
    delayMicroseconds(1000);
  }
}
xSmurf suggested modifying the pre-scaler value for the timer as a possible solution.
回复 支持 反对

使用道具 举报

发表于 2013-4-20 20:11:27 | 显示全部楼层
好贴,要顶
回复 支持 反对

使用道具 举报

发表于 2013-4-21 21:19:03 | 显示全部楼层
{:soso_e113:}硬件版按键精灵,游戏外挂,哈哈.
回复 支持 反对

使用道具 举报

发表于 2013-5-10 11:47:32 | 显示全部楼层
号哈哈哈哈哈哈哈哈哈哈哈
回复 支持 反对

使用道具 举报

发表于 2013-5-10 11:48:27 | 显示全部楼层
谁会做啊,我做的没反应,谁教我一下。加我QQ1105731580
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2019-11-18 02:46 , Processed in 0.083508 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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