http://arduino.cc/en/Tutorial/KeyboardSerial

134806ksctklqql9qtl0il 232957f6fvvr9xg8z3wr3e

 

 

http://geek-workshop.com/thread-2303-1-1.html

 

话说是前几日看了论坛上的帖子
起因
Arduino学习笔记A12 – 自制Makey模拟触摸键盘(还差实物贴图和视频没贴上,稍后补全)
开始
此时正好手头没事,而且所需的硬件都有,所以果断摆上东西,按照帖子的说明一步步链接好电路,下好程序,插上USB线。
“无法识别的USB设备”
怀疑
首先,觉得是自己的接线方法有问题,所以把所有器件都拆下来从新连接上,结构依旧无法识别。看了下跟帖,也有些人说无法识别,但也没有提出解决方案。
其次,是不是帖子贴出来的代码有问题呢?遍在网上搜了好多发布的arduino的USB库和代码,有的编译不通,有的编译成功,但是下载下去之后依旧无法识别。
捕获.PNG
再次,怀疑是稳压管的型号不对,因为用的稳压管是在桌子上小垃圾堆里照出来的,不知道具体型号。用万用表量了一下USB信号线的电压,4+V,果然超了……原贴上建议的是3+V,这下完蛋了,看来这个鼠标我是做不成了。
休息干点别的吧,反正手头也没有适合的稳压二极管。突然灵光一现:这个稳压管是坐什么用的呢?可能一:作为USB信号线,对静电比较敏感,所以用稳压管来释放经静电,放置静电打坏器件。如果是这样,那就会有如下两个疑问:1、如果作保护器件的话,去掉这个器件也不会影响系统工作,2、如果是保护器件为什么一定要用3+V的稳压管呢,我的是4+V的应该也没有问题啊。显然不是起保护作用。 可能二:作为USB信号线的阻抗匹配即滤波。因为二极管的PN结宽度会随两端点啊的变化而变化,所以二极管是带有电容性的,如果这样也会有疑问,1、如上可能性疑问二,既然3+V二极管可以那么4+V的二极管也可以。2,滤波USB低速通信时影响不大。所以也不是其这个作用。最后的可能,因为使用5V的arduino,所以稳压管的作用就是限制USB数据线的电压,这个倒是说得通,3+V二极管可以,4+V的二极管也不可以。俗话说要动脑也要动手,所以我火速查了一下USB标准的文档
电压范围
数据识别
,证明,稳压管的作用就是把USB信号线的电压限制在2.8-3.6。这样既然知道了稳压管的作用就好办了,虽然手头没有没有稳压管,但是把信号线的电压先知道这个范围内,方法也很简单。我让arduino运行在3.3V这个问题就解决了。因为我用的是arduino pro mini,
捕获.PNG
他是电源可外接的,恰好手头的FTDI也有3。3V输出,
FTDI
拿来借用一下,OK这个问题解决。USB在此插在电脑上试了一下,发现还是不行,哭了!
最后,发现所给的电路图中USB信号定义顺序有问题,记忆总USB数据线顺序是VUSB,D-,D+,GND。而原贴中的顺序VUSB,D+,D-,GND。神奇了!还是再看看USB标准吧
上拉电阻
也就是说原帖子上拉电阻拉到D-是没错的,但是因为D-D+的顺序颠倒了,所以大多数人都会把上拉电阻拉到D+。当然我也接错了,之后调了一下上拉的位置,模拟的鼠标就被识别了。
总之,原帖USB接口线序有问题会误导大家接线,所以大家的会出现无法识别的问题。贴出来的程序没问题
另外,传统不带USB的AVR能够实现USB功能,虽然是很常见的事,但是在Arduino在国内还是比较少见的。对于比较专业的Arduino也比较建议使用pro mini这样的精简硬件版本,好处有三,第一引出端口超多,方便自己使用。第二体积小,便于潜入各种作品当中,第三价价格低。

 

http://geek-workshop.com/thread-2310-1-1.html

第二季主要分析用普通arduino普通IO口模拟USB所需电路的硬件分析
先贴张图:

上图是5V系统的IO口仿真USB所需的硬件电路。
其实这个电路对大家来说并不陌生,大家手头的USBasp一般都是采用这个电路,应为这种下载器也是采用没哟USB接口的AVR来设计的。
先说下2.2k电阻的作用。第一季已经提到过了,USB标准中,低速设备的D-信号线要有1.5k电阻上拉到电源,这里就不在上图了。因为这个是5V系统,所以使用电阻要比标准电阻大一些。
只有是稳压二极管。也就是传说中的齐纳二极管,学过模电的同学肯定知道(二极管的方向击穿有两种,一种是雪崩击穿,一种是齐纳击穿。书里大概是这么说的。)稳压二极管的工作原理就是当反向电压达到一定值时,他便会被反向击穿,通过这种方式来稳定电压。这种击穿当电压降低之后二极管可以恢复到正常状态,几乎不会对二极管有损坏。不说废话了,这个二极管的作用就是将数据线电压有5V等级,稳定到3V左右等级。
最后呢,说下串联在信号线68欧姆的电阻。这个电阻的作用大家可以探讨一下,我这里只是说下自己理解的主要作用。首先呢,还是来看标准,
捕获.GIF
标准上的意思就是USB信号的单端等效阻抗是28-44欧,所以这个68的电阻其这个作用。第二,这作用个人觉得重要与第一个。当信号被arduino拉到高时,稳压二极管便会被击穿。假设没有这个电阻,因为arduino的IO引脚与稳压管之间没有压降(因为没有电阻)所以稳压二极管就要漏下很多电流,知道吧IO口电压拉低至稳压电压。在这种情况下可以认为是IO重负载,所以输出电流接近AVR的IO的最大驱动电流40mA,这样会极大损害IO结构,无辜功耗增加,再个就是需要选一个功率稍大的稳压二极管,这种情况下也会增加不稳定性,有了这两个电阻便会避免以上问题。这样看这个电阻可以看做是限流电阻了

在3.3V系统中
2.2K的电阻,当然可以按照标准改为1.5k
再个限流电阻可以去掉了
另外68欧姆的电阻,也有可以去掉的可能……没试过,稍后去掉看下上来汇报

 

http://www.geek-workshop.com/thread-1137-1-1.html

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).jpg1 (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-1.jpg1 (4).jpg

插数据线写程序进Arduino:
1 (5).jpg

 

Arduino支持库文件:
http://soft1.wmzhe.com/download/ … ino/UsbKeyboard.zip

注意:
 
1、UsbKeyboard库中,usbconfig.h里面可以更改USB接线的引脚定义,下面给出一个大概解释(下面的PORTD是指AVR单片机的PORTD,要查询Arduino原理图才能得到是Arduino的哪个引脚):
 
#define USB_CFG_IOPORTNAME D
USB输入输出引脚使用AVR单片机的PORTD,如果改成B就是使用PORTB
#define USB_CFG_DMINUS_BIT 4
USB的D-接PORTD的第四位PD4,对应Arduino D4
#define USB_CFG_DPLUS_BIT  2
USB的D+接PORTD的第二位PD2,对应Arduino D2
#define USB_CFG_PULLUP_IOPORTNAME D
USB上拉引脚使用AVR单片机的PORTD,如果改成B就是使用PORTB
#define USB_CFG_PULLUP_BIT  5
USB的上拉电阻接PORTD的第五位PD5,对应Arduino  D5
 
 
2、在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);
等。由于整理比较麻烦,大家可以自己下载个KeyboardTest软件测试不同数字下面的键值。

 

 

/*
Arduino模拟键盘 by Ansifa
2012.6.8
 
功能描述:插上此模拟键盘,打开记事本,然后按下按钮,即可在记事本打印出HELLO WORLD字样
 
接线方法:
<img src="http://www.geek-workshop.com/forum.php?mod=image&aid=5359&size=300x300&key=e9fa5559e6d5724d51f770bc6c55b941&nocache=yes&type=fixnone" border="0" aid="attachimg_5359" alt="">
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);
    }
  }
}

 

 

 

http://www.geek-workshop.com/thread-1192-1-1.html

制Makey模拟触摸键盘

相信很多人看过最近一个Makey makey模拟触控键盘视频(http://www.56.com/u45/v_NjgzMzc0MDI.html)。视频里电路板可以接上任何导电体,通过触摸导电体去给电脑键盘事件。来玩各种不同的游戏或者效果。
其中的原理就是通过单片机模拟一个键盘,引出几个键,并且使用触摸形式代替开关。现在我们使用一块arduino加上几个普通元件,也能将这个电路实现出来了。
本文先填鸭式介绍如何制作模拟触控键盘,如果你只是想做一个成品玩的话,可以只看前面部分而不用看原理分析。如果你想知道它的工作原理的话,可以一直看下去。

材料清单:

  Arduino(UNO、Duemilanove、NANO均可)   1个
  68Ω电阻(没有68Ω的话,用50~100Ω电阻也行)   2个
  1.5kΩ电阻(没有2.2kΩ的话,用1.5k~2.2k电阻也行)   1个
  2.2MΩ电阻(1M~4.7M也行)   6个
  USB连接线(一端是USB口另一端是电线,也可以用废旧键盘鼠标拆下来的线)   1条
  3.6v 稳压管(3.3v~3.6v稳压管。建议选用功耗0.25~0.5w的)   2个
  单芯屏蔽电线(6条,每条1~2米)   6米
  鳄鱼夹   6只
  万用板(洞洞板)   1块

先不管原理,看看制作步骤:
准备好材料,这里为了减少体积,用了Arduino NANO,并且部分电阻实际用的时候是贴片封装的。
1 (1).jpg1 (2).jpg
按照下面的电路图连接电路(PDF版本点击这里: Arduino模拟触控键盘.pdf (78.65 KB, 下载次数: 588) )。
image.png

注意输入线要用屏蔽线,鳄鱼夹端将屏蔽线的芯线接上,屏蔽线悬空;电路板端将芯线接到A0~A5引脚。所有屏蔽线集成一束接到+5v。

用数据线(注意是Arduino的数据线,不是上面焊的键盘线)将下面的程序写入Arduino中。
1 (5).jpg

 

#include "UsbKeyboard.h"
int InData1 = 0, InData2 = 0, InData3 = 0, InData4 = 0, InData5 = 0, InData0 = 0;  //触摸输入值暂存
int TouchSensitivity = 30; //触摸灵敏度。0~1023,越大越不灵敏
void setup()
{
  for(int i = A0; i <= A5; i++)
  {
    pinMode(i, INPUT);                        //A0~A5端设置为输入
    //digitalWrite(i, HIGH);                //并且上拉
  }
  TIMSK0 &= !(1 << TOIE0);
}
 
void loop()
{
  UsbKeyboard.update();
  //读取所有引脚电压值,并且由于上拉电阻原因,
  //默认所有引脚为最高电平1023,通过触摸拉低引脚电平。
  //所以数值由1024-analogRead(A0);
  InData0 = 1024 - analogRead(A0);                
  InData1 = 1024 - analogRead(A1);
  InData2 = 1024 - analogRead(A2);
  InData3 = 1024 - analogRead(A3);
  InData4 = 1024 - analogRead(A4);
  InData5 = 1024 - analogRead(A5);
  //按照各种可能触发键盘事件
  if(InData0 >= TouchSensitivity)
  {
    UsbKeyboard.sendKeyStroke(79); //right
  }
  if(InData1 >= TouchSensitivity)
  {
    UsbKeyboard.sendKeyStroke(80);  //left
  }
  if(InData2 >= TouchSensitivity)
  {
    UsbKeyboard.sendKeyStroke(81);  //down
  }
  if(InData3 >= TouchSensitivity)
  {
    UsbKeyboard.sendKeyStroke(82);  //up
  }
  if(InData4 >= TouchSensitivity)
  {
    UsbKeyboard.sendKeyStroke(KEY_SPACE);
  }
  if(InData5 >= TouchSensitivity)
  {
    UsbKeyboard.sendKeyStroke(KEY_ENTER);
  }
  delay(100);
}

 

 

拔掉Arduino数据线,将键盘线插到电脑USB口,即出现新硬件“USB输入设备”,一般XP和win7都免驱动自动识别。

找一些含水分的物体(比如makey里面的香蕉,橡皮泥等),鳄鱼夹夹住一头,触碰物体即可打字。

原理分析:
1、触摸部分
* 此虚拟键盘使用触摸作为输入方法,所以可靠的触摸响应非常必要。常见的触摸开关有两种:
–  一种是双触点的触摸开关,将触摸端和地端引出,连接到两块触摸电极上,人触摸两个极的时候,由于人体电阻的关系,两触摸电极之间有一定电流流过,通过检测这个电流大小即可检测出触摸事件。Makey的虚拟键盘就是这种方法;
–   另一种是单触点的触摸开关,人手只需要触摸一个极板,用人体和大地来做回路,这种方法用户体验最好。但是如果直接将触摸电路的地端接家里的地线,人触摸感应输入端的话,那触摸就不能响应了。因为人体和大地并不是真实的导体,而是通过水分,以及导体间的电容等导电的,对于直流电来说,由于电压只有5v,相应回路电阻很大。经过回路之后,电压不足以实现触摸功能,所以在这里我们借助高压电做媒介,让人体和大地有足够电流形成可以响应的回路。原理图如下图,将Arduino的GND端通过一个高阻值电阻RH接到市电的火线,人触摸A0端的时候,220v市电将通过高值电阻RH以及单片机传到人手上,然后通过大地形成回路。由于220v电压较高并且是交流电,通过高值的电阻以及人体、大地等导体之后仍然可以有足够的电压去给单片机响应。
*  由于触摸部分对周围的电磁干扰比较敏感,触摸板与Arduino连接线必须使用屏蔽线。六根屏蔽线的芯线接A0~A5,屏蔽层接电源正极(+5v)
*  此处是使用了外置的2.2MΩ上拉电阻,常态时输入端是高电压,所以默认AD转换数值是1023,通过触摸GND和A0~A5,令输入电压降低,从而改变输入的AD数值。当AD数值降低到一定程度(变量TouchSensitivity决定)的时候,就认为该触摸板有事件响应。如果触摸灵敏度不适合的话,可以调整变量TouchSensitivity的值来改变灵敏度。值越大灵敏度越低。

2、Arduino模拟键盘部分:
由于Arduino主芯片是一片AVR单片机,通过AVRUSB,我们可以将Arduino虚拟成一个键盘。详细原理可以参考这篇文章:
http://www.geek-workshop.com/for … &page=1#pid7692
文章详细解释了Arduino模拟键盘的原理和电路,此处就不再详细解释了。

 

http://www.geek-workshop.com/thread-469-1-1.html

前几天10块钱弄来了100来个微型开关,闲来没事就想弄个矩阵键盘玩玩,由于图便宜,就直接搞了个电阻键盘,没想到精度确相当高,即使延迟1毫秒也毫无抖动,说明电阻键盘也是很好用的,通过软件可以实现微延迟“3点触控”,还是相当划算的~

成本一共也就2块钱左右,却完全可以媲美或者超过淘宝上30多的矩阵键盘,自己动手才是王道~

电路图: QQ截图20120117134700.jpg

arduino主控器:QQ截图20120117134743.jpg

键盘: QQ截图20120117134736.jpg

背面自制EPP封胶:QQ截图20120117134747.jpg

 

http://www.geek-workshop.com/thread-10291-1-1.html

参考这个:http://www.lab-z.com/20140101/ 怎么发出WinKey+L 来锁定?

Leonardo 的没搞过,你先试验发一个按键,再试验发组合键,最后试试 win+L

win 这个键根本就没有

mod_gui_left 是 win key 你试试?

 

http://arduino.cc/en/Tutorial/KeyboardSerial

更新日期: 2014-12-06 14:32:51
文章标签:
文章链接: Arduino键盘相关内容集合
站方声明: 除特别标注, 本站所有文章均为原创, 互联分享, 尊重版权, 转载请注明.