前段时间(貌似是很长一段时间了),我说做了个山寨Makey Makey的东西,还发了张夹子夹着香蕉的照片,并打算拍一个视频。这么长时间过去了,突然想起了这件事,觉得应该做一个解释。
事实是这样的,我确实做了一个这样的东西,实验室的几位同学也看到了,我可以用香蕉弹“两只老虎”,但是关于拍一个视频,非常无耻地解释一下,还没拍。
有一段时间确实忙得不行,后面闲了一点,却也有其他杂七杂八的困扰,搞得一直很困扰……这是敷衍,实际上,自从那天晚上发了那个照片后我再没搞那个东西。那个东西是在偶然的情况下搞的,说要拍一个视频也是朋友在玩笑的气氛下发的……
事到如今,我只能说说这个东西是怎么实现的了,希望别用砖拍我。
实际上,这真是一个简单到有点坑爹的东西。
那段时间,我在做一个项目,发现一个很微妙的事情,将独立按键的IO口配置为高阻态,并将这个IO口的状态直接映射为一个LED的亮灭,会发现手还没接触按键,仅仅是靠近,LED就点亮了,相当于隔空操作,这是怎么实现的呢?
当时我想到的是,手靠近后IO口的电平状态应该是改变了,变成什么样呢?直接用单片机自带的ADC读吧。于是继续将IO口配置为高阻态(一般情况下使用AD时应该配置为上拉模式),将读出来的值通过串口发出,发现值的变化是很奇怪的,有周期,截取一段当时记录的数据:
91 9C 9C 99 91 8C 86 82 82 80 78 74 74 75 77 7A 7D 81 88 8E 9B 9C 9A 93 8D 87 82 82 81 7B 75 74 75 76 79 7C 80 87 8E 99 9C 9A 94 8E 88 83 82 81 7C 75 74 75 76 79 7C 7F 86 8C 96 9C 9B 97 8F 8A 84 83 81 7E 76 74 74 76 78 7B 7F 84 8B 93 9D 9B 97 90 8B 85 82 81 7F 78 74 75 75 78 7C 7E 83 8A 91 9D 9C 99 92 8C 87 82 82 80 79 74 74 74 77 7A 7D 80 88 8E 9B 9C 9A 93 8D 88 83 82 81 7A 75 74 75 77 7A 7D 80 87 8D 99 9C 9A 94
虽然不是很明显,计算了一下,根据每个数据经串口发送时的延迟,这个周期大概是20ms,也就是50HZ,呃,也就是一般说的工频。
然后将手靠近,发现“峰-峰值”变大了:
29 28 2E 42 55 68 7E 90 A9 BE D9 E6 F1 E4 D0 AD 71 45 2E 32 28 2F 3B 4C 64 7C 92 9F BD D2 E9 F2 F1 D4 B9 8E 4B 37 29 27 2D 3E 4C 63 76 8E 9F BC CF E5 F3 F0 DB BB 9A 5A 38 30 2D 2D 38 46 5B 6F 86 9D B8 CC E0 E9 F3 E8 C3 A1 61 3B 29 28 2D 38 3A 59 6A 80 98 AB C9 D7 E9 F0 EE C9 AB 6A 40 2E 27 27 38 3C 52 68 7E 96 A9 C6 CD E9 F0 F1 D2 B7 83 45 34 2A 2D 31 3D 4B 66 76 89 A0 C1 D4 E2 F2 EB D3 B5 91 51 2F 2F 29
这个大得还很明显的,也就是说能够通过计算这个最大值与最小值的差知道手是不是靠近,嗯,当时确实让我很高兴。
为了验证是不是工频干扰的问题,我将单片机远离电脑2-3米,并用蓝牙串口模块发送数据,照样是配置为高阻态模式,数据就变成这样了:
83 83 83 83 83 83 84 84 84 84 84 84 84 84 84 84 83 83 83 83 83 83 83 83 83 84 84 84 84 84 84 84 84 84 84 84 84 83 83 83 83 83 83 83 83 84 84 84 84 84 84 84 84 84 84 83 83 83 83 83 83 83 83 83 84 84 84 84 84 84 84 84 84 83 84 83 83 83 83 83 83 83 83 84 84 84 84 84 84 84 84 84 84 83 83 83 83 83 83 83 83 83 84 84 84 84 84 84 84 84 84 84 84 83 83 83 83 83 83 83 83 83 84 84 84 84 84 84 84 84 84 84 83 83 83 83 83 83 83 83
是的,“波动”的幅度很小了,我也就不好意思再去计算它的周期了。:)
也就是说我这个“非接触式”检测只能在电脑旁边1m的样子了,后来试着将单片机IO口用导线引出,大概2-3cm的样子的时候在电脑旁“波动”幅度会加强,再长点就无法分辨手是否靠近了,因为靠不靠近幅度都很强!也就是说,稍微长一点,可以将检测的设备稍微离电脑远一点,呃,还是有点妥协的意思,最好还是做一个工频信号在旁边,再远也没关系,这些都是后话了……
貌似偏移主题很远了,做这些东西的时候,突然想到之前看过一个MakeyMakey的视频,觉得可以这样实现一个。
不过前面讲的这些与山寨MakeyMakey关系真不大。山寨MakeyMakey不需要工频干扰信号,只需将单片机IO口配置为高阻态,然后连接一个夹子,夹一个香蕉,人的左手接地,右手碰香蕉,用AD就能读出IO口变化了。
事实上,这个工频干扰是客观存在的,直接印出来2-3cm都已经很强了,更何况拉很长再接一个香蕉。所以,应该去除这个干扰。
我用的方法也是极其简单,接一个很大的上拉电阻,比如100兆,是的,毕竟人体还有香蕉之类的东西电阻都比较大,如果上拉电阻小了,根本不能被拉低了。
所以,大致的示意图是这样的:
其实这里的香蕉可以是任何阻值不至于太大的物体,甚至石头洒些水都是可以的。所以,可以做一些很好玩的东西。
至于上位机端,我做这个是很简单,直接用串口发的,然后PC端软件再发出相应的按键消息从而可以用来“弹琴”。
而MakeyMakey那个是用了Arduino平台,做了USB协议,然后做了HID,所以可以直接使用,电脑直接识别为一个键盘了。
最后放一个MakeyMakey的视频吧,人家这个才是真正的有生活情趣!