自制Makey模拟触摸键盘

2014-12-171.5万
AI 快速预览详细 收起
本文介绍了如何使用Arduino和一些普通元件制作一个模拟触控键盘。通过触摸导电体,可以触发电脑键盘事件,适用于各种游戏或效果。文章提供了详细的材料清单、电路图和代码示例。通过调整变量TouchSensitivity,可以改变触摸灵敏度。
自制Makey模拟触摸键盘


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

材料清单:
  ArduinoUNODuemilanoveNANO均可)
  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,并且部分电阻实际用的时候是贴片封装的。

按照下面的电路图连接电路




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

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

ARDUINO 代码
  • #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);
  • }

[color=rgb(51, 102, 153) !important]复制代码

拔掉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模拟键盘的原理和电路,此处就不再详细解释了。

我做好实物(A0~A5引线还没引出):

触摸, 键盘

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(3)
mcholen
mcholen
Makey Makey看来真是经久不衰
qq815076543322
qq815076543322
作者
回复mcholen
真的经久不衰
Grey
Grey
最喜欢这种可以动手制作的帖子了
qq815076543322
qq815076543322
作者
回复Grey
可以试试哦
Youyou
Youyou回复Grey
亲,你也多出出动手的帖子,让我们见识下程师傅的厉害呀。
phoebe.wang40
phoebe.wang40
哇哦,抽空我也做一个
qq815076543322
qq815076543322
作者
回复社区活动向导
送送送 送啥啊 送板子让我做尝试吗
社区活动向导
社区活动向导回复qq815076543322
送送送送。。。。。。。。
共3条回复,已加载2条,点击查看更多共3条回复,已加载全部
- 没有更多了 -