极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 153165|回复: 70

Arduino学习笔记A12 - 自制Makey模拟触摸键盘(此贴已经过时)

  [复制链接]
发表于 2012-6-16 23:32:26 | 显示全部楼层 |阅读模式
本帖最后由 Ansifa 于 2015-2-23 19:15 编辑

自制Makey模拟触摸键盘


注意:此贴方法不够现成的稳定,已经过时,Arduino Micro/Leonardo已经可以便宜稳定的实现替代功能了,而且不用折腾。建议使用Arduino Micro/Leonardo+自带的keyboard功能做,方便简单。


相信很多人看过最近一个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,并且部分电阻实际用的时候是贴片封装的。

按照下面的电路图连接电路(PDF版本点击这里:)。


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

用数据线(注意是Arduino的数据线,不是上面焊的键盘线)将下面的程序写入Arduino中。
  1. #include "UsbKeyboard.h"
  2. int InData1 = 0, InData2 = 0, InData3 = 0, InData4 = 0, InData5 = 0, InData0 = 0;  //触摸输入值暂存
  3. int TouchSensitivity = 30; //触摸灵敏度。0~1023,越大越不灵敏
  4. void setup()
  5. {
  6.   for(int i = A0; i <= A5; i++)
  7.   {
  8.     pinMode(i, INPUT);                        //A0~A5端设置为输入
  9.     //digitalWrite(i, HIGH);                //并且上拉
  10.   }
  11.   TIMSK0 &= !(1 << TOIE0);
  12. }

  13. void loop()
  14. {
  15.   UsbKeyboard.update();
  16.   //读取所有引脚电压值,并且由于上拉电阻原因,
  17.   //默认所有引脚为最高电平1023,通过触摸拉低引脚电平。
  18.   //所以数值由1024-analogRead(A0);
  19.   InData0 = 1024 - analogRead(A0);               
  20.   InData1 = 1024 - analogRead(A1);
  21.   InData2 = 1024 - analogRead(A2);
  22.   InData3 = 1024 - analogRead(A3);
  23.   InData4 = 1024 - analogRead(A4);
  24.   InData5 = 1024 - analogRead(A5);
  25.   //按照各种可能触发键盘事件
  26.   if(InData0 >= TouchSensitivity)
  27.   {
  28.     UsbKeyboard.sendKeyStroke(79); //right
  29.   }
  30.   if(InData1 >= TouchSensitivity)
  31.   {
  32.     UsbKeyboard.sendKeyStroke(80);  //left
  33.   }
  34.   if(InData2 >= TouchSensitivity)
  35.   {
  36.     UsbKeyboard.sendKeyStroke(81);  //down
  37.   }
  38.   if(InData3 >= TouchSensitivity)
  39.   {
  40.     UsbKeyboard.sendKeyStroke(82);  //up
  41.   }
  42.   if(InData4 >= TouchSensitivity)
  43.   {
  44.     UsbKeyboard.sendKeyStroke(KEY_SPACE);
  45.   }
  46.   if(InData5 >= TouchSensitivity)
  47.   {
  48.     UsbKeyboard.sendKeyStroke(KEY_ENTER);
  49.   }
  50.   delay(100);
  51. }
复制代码
拔掉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 ... 1137&page=1#pid7692
文章详细解释了Arduino模拟键盘的原理和电路,此处就不再详细解释了。

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1 +6 +1 收起 理由
幻生幻灭 + 6 + 1 这是神马情况!仔币一枚~

查看全部评分

回复

使用道具 举报

发表于 2012-7-10 15:51:10 | 显示全部楼层
这么强悍的好帖 居然没人顶呀!
当时我看到makey的视频的时候,觉得好神奇!原来如此简单!
有空的时候,我一定做一下!
回复 支持 反对

使用道具 举报

发表于 2012-7-10 15:54:07 | 显示全部楼层
这么好的帖子。。我居然没看到。。。
回复 支持 反对

使用道具 举报

发表于 2012-7-10 15:58:06 | 显示全部楼层
竟然没注意到
回复 支持 反对

使用道具 举报

发表于 2012-7-11 10:13:36 | 显示全部楼层
强力支持!周末测试{:soso_e100:}
回复 支持 反对

使用道具 举报

发表于 2012-7-11 11:19:22 | 显示全部楼层
哇塞,好厉害,当时我看到Makey makey的时候就琢磨了老半天他的原理,一直没想通
回复 支持 反对

使用道具 举报

发表于 2012-7-11 13:07:48 | 显示全部楼层

竟然没注意到
回复 支持 反对

使用道具 举报

发表于 2012-7-11 16:09:30 | 显示全部楼层
看来要修改一下提示机制
回复 支持 反对

使用道具 举报

发表于 2012-7-11 16:11:59 | 显示全部楼层
等待效果出来
回复 支持 反对

使用道具 举报

发表于 2012-7-14 17:59:47 | 显示全部楼层
超版V5!
回复 支持 反对

使用道具 举报

发表于 2012-7-14 22:37:27 | 显示全部楼层
很给力啊。
回复 支持 反对

使用道具 举报

发表于 2012-7-16 09:09:19 | 显示全部楼层
很期待~嘎嘎
回复 支持 反对

使用道具 举报

发表于 2012-7-21 23:41:42 | 显示全部楼层
{:soso_e143:} 我也才发现
很不错~~~
回复 支持 反对

使用道具 举报

发表于 2012-7-23 17:26:34 | 显示全部楼层
测试了一下,结果出现电脑无法正确识别的USB设备。。。求教,这一般是啥问题啊?
回复 支持 反对

使用道具 举报

发表于 2012-7-24 16:42:41 | 显示全部楼层
太谢谢了!好像我把稳压管装反向了,现在调过来了,然后A0~A5口要用屏蔽线接吗?
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 18:26 , Processed in 0.048389 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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