注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

This is Ansifa

近期都不会更新绿色软件

 
 
 
 
 

日志

 
 

Arduino学习笔记A11 - Arduino模拟键盘  

2012-06-09 22:29:49|  分类: 电子技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Arduino模拟键盘


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

硬件部分:
材料清单:
Arduino x1
68Ω电阻 x2 (没有68Ω的话,用50~100Ω电阻也行)
2.2kΩ电阻 x1 (没有2.2kΩ的话,用1.5k~2.2k电阻也行)
USB连接线(一端是USB口,另一端是电线) x1
3.6v 稳压管(型号不限,3.3v~3.6v均可,比如1N4729,建议选用功耗0.25~0.5w的)x2
Arduino学习笔记A11 - Arduino模拟键盘 - ansifa - This is Ansifa
Arduino学习笔记A11 - Arduino模拟键盘 - ansifa - This is Ansifa
电路原理图:
Arduino学习笔记A11 - Arduino模拟键盘 - ansifa - This is Ansifa
 

 
 
电路图解说:
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/Ansifa2012/Arduino/UsbKeyboard.zip
文件下载后解压到arduino编译器的libraries文件夹下面。

程序示例:
下面的例子演示了用Arduino虚拟键盘的应用例子。打开记事本,然后将Arduino的D12引脚和GND连起来,就会打印HELLO WORLD字样。

/*
Arduino模拟键盘 by Ansifa
2012.6.8

功能描述:插上此模拟键盘,打开记事本,然后按下按钮,即可在记事本打印出HELLO WORLD字样

接线方法:
Arduino D2接68Ω电阻后,接USB线D+
Arduino D4接68Ω电阻后,接USB线D-
Arduino D5接2.2kΩ电阻后,接USB线D-
Arduino D2接3.6v稳压管到GND
Arduino D4接3.6v稳压管到GND
+5v接USB线VCC
GND接USB线GND
Arduino D1接一个开关到GND

附:USB线序颜色(由于各生产厂不同,不一定准确,仅供参考)
*USB键鼠:      |        *USB接口
白<->VCC        |        红<->VCC
橙<->D-         |        白<->D-
绿<->D+         |        绿<->D+
蓝<->GND        |        黑<->GND

*/

#include "UsbKeyboard.h"
int KEYPIN = 1;                //按键接在D1引脚,也可以改成任何引脚
void setup()
{
  TIMSK0 &= !(1 << TOIE0);        //
  pinMode(KEYPIN, INPUT);
  digitalWrite(KEYPIN, HIGH);
}
void loop()
{
  UsbKeyboard.update();
  if(digitalRead(KEYPIN) == HIGH)
  {
    delay(100);
    if(digitalRead(KEYPIN) == LOW)
    {
      UsbKeyboard.sendKeyStroke(KEY_H);
      UsbKeyboard.sendKeyStroke(KEY_E);
      UsbKeyboard.sendKeyStroke(KEY_L);
      UsbKeyboard.sendKeyStroke(KEY_L);
      UsbKeyboard.sendKeyStroke(KEY_O);
      UsbKeyboard.sendKeyStroke(KEY_SPACE);
      UsbKeyboard.sendKeyStroke(KEY_W);
      UsbKeyboard.sendKeyStroke(KEY_O);
      UsbKeyboard.sendKeyStroke(KEY_R);
      UsbKeyboard.sendKeyStroke(KEY_L);
      UsbKeyboard.sendKeyStroke(KEY_D);
      UsbKeyboard.sendKeyStroke(KEY_ENTER);
    }
  }
}


注意,先插上Arduino数据线,将程序写入Arduino。然后拔掉数据线,将模拟键盘USB线接到电脑,即可使用。

下面随便点实物图:

刚焊好的正反面
Arduino学习笔记A11 - Arduino模拟键盘 - ansifa - This is Ansifa
 
Arduino学习笔记A11 - Arduino模拟键盘 - ansifa - This is Ansifa
插数据线写程序进Arduino:
Arduino学习笔记A11 - Arduino模拟键盘 - ansifa - This is Ansifa

附:在UsbKeyboard库的UsbKeyboard.h里面,有关于模拟键值的表
#define KEY_A       4
#define KEY_B       5
#define KEY_C       6
#define KEY_D       7
#define KEY_E       8
等。但不齐全。经过测试,其实这个键盘基本可以模拟几乎所有键值(Power,Sleep,Pause似乎不能)。
比如方向键右左下上分别对应79,80,81,82数字。即写成
UsbKeyboard.sendKeyStroke(79);
UsbKeyboard.sendKeyStroke(81);
等。

  评论这张
 
阅读(5691)| 评论(9)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016