隔空抓物:用Arduino实现无线手套

嘿,小伙伴们,我想跟你们分享一款我自己制做的,专门为像Google GlassMetaMoverio BT这一类AR眼镜,或者Oculus RiftSamsung Gear VRvrAseDurovis Dive这类的VR 设备打造的一款输入设备。这些产品都令人惊叹,他们需要一种新的输入方式。这里,我会和大家分享如何做一个属于你自己的重力感应+触摸控制的蓝牙手套,当然,我也会给你一些关于做Durovis Dive设备的提示,以便你能享受完整的移动虚拟现实世界。因为这个手套最适用于VR游戏,我为安卓写了一个Unity3D插件来控制手套和APP之间的通信。这意味着你可以用手套来打游戏。我写的用来控制手套和安卓设备的通信的安卓的代码和Java的类会开源,这样,你可以根据自己的需要修改。

这里说的手套原型支持下列的数据无线通信:
1、用户手腕在空间中的定位数据,这归功于FreeIMU模块
2、用户每个手指的压力

手套通过蓝牙与安卓智能手机或者电脑(这里我不打算提电脑)通信。看看视频吧,对它的功能和用途有个大概的了解。 如果你想做一个Arduino系统通过蓝牙跟安卓手机/平板通信,或者你想触控输入你的Arduino,再或者你想以无线方式使用FreeIMU设备。这个东西还是很有用的。

第一步:手套:准备工作

你需要准备以下电子器件:
Arduino板
FreeIMU板(10个维度:3x陀螺仪,3x加速度,3x磁场,1个压感),
蓝牙模块
5个压感电阻
9V电池电池接口
3米左右的截面0.2平方厘米的排线(直径为0.5毫米),我用了4种颜色的线。
5个10K的金属膜电阻(像这样的
焊板(像这样的

做手套需要的工具(这里的链接只为了说明,你可以选购自己的工具):
2mm的PCV板做手链用
50x46mm的厚度为1mm的硬纸板,用于固定电子器件
一面是胶,一面是魔术贴的胶带纸
2mm的双面胶
10mm的松紧带
钉书针

手套由5个(可以减少数量以方便你的操作)触控设备和一个手链组成,手链上面固定一个硬纸板框架,用于固定电子器件。硬纸板框架有两层,(由下而上)第一层由FreeIMU模块和5个金属膜电阻组成,第二次由蓝牙模块和Arduino模块组成。电池用胶带粘在手链上。

第二步: 基础构架:手链


手链是我们放置所有电子器件的基础框架
在PVC板上用铅笔画出图中所示的形状(毫米尺寸),用剪刀把它剪下来。
当你准备好手链之后,剪一个57x50mm的矩形硬纸板,用来固定电子器件。
现在我们要在手链上调整硬纸板,剪两片50mm长的厚双面胶贴在纸板上(看图),然后把纸板贴在手链上。
剪45mm的魔术贴,粘在图示的手链上

第三步:电路图概述

在焊接之前,让我们先看看电路图。如你所见,这个图很简单。

电源

Arduino板由9V电源从Vin脚供电。我们用Arduino内部提供的5V电压为FreeIMU和蓝牙供电,把他们的5V电源输入接到Arduino的5V输出。了解跟多的Arduino能承受的最大电压和工作最小电压,参考Arduino文档

Arduino-蓝牙 通信

从Sparkfun买的蓝牙模块通过串口(Tx/Rx)和Arduino通信。Arduino的Tx脚和蓝牙模块的Rx脚连接,Arduino的Rx脚和蓝牙模块的Tx连接。如果你想了解跟多蓝牙模块如何工作的,参考Sparkfun 网站的说明

Arduino - FreeIMU 通信

0.4版的FreeIMU通过I2C协议和Arduino通信。用了SDA(数据)脚和SCL(时钟)脚。Arduino的SDA脚(2脚)和FreeIMU的SDA脚连接,Arduino的SCL脚(3脚)和FreeIMU的SCL连接。注意:IMU的SDA和SCL工作在3.3V,而Arduino正常情况下工作在5v。但是在Arduino芯片内部有上拉电阻,使得他们能够在不添加外设的情况下通信。

触摸检测

触摸感应系统就像分压器一样,我用了阻值随压力增大而减小的压敏电阻,电阻变化会引起Rv上电压的变化,我们用Arduino的adc功能测量(A0脚~A5脚)。电阻的变化范围从1M欧(没有压力)到2.5K欧(最大压力)。流过五个分压器的电流由Arduino的5V脚提供,我不希望通过每个分压器的电流超过500uA,也就是阻值(R+Rv)在最小的时候,必须等于10K欧。因为Rv最小值是2.5K,可知R为7.5K。这就是我选择R为10K的原因(R不能小于8.2K,这个最小值是我在实验室测的)。当没有压力时,Arduino加在Rv上的电压为5V,最大压力的时候为1V。

第四步:第一层板制作:FreeIMU和电阻





正如刚才所说,电路分为两层。现在我们来做底部的第一层,我们把FreeIMU板和5个10K电阻放在这一层

10K电阻

如上面的图所示。白色的线连接手指触控设备,黑色的是GND,红色的是电源5V。5根灰色的排线将连接到Arduino的A0~A4脚(ADC)。注意:我们不需要第一幅图中左下角的上面一根红线
将焊盘裁剪成一块剩7*9的孔的板(如图)
如图所示,焊接5个电阻
剪10跟导线,导线需要足够长,能从你的手腕到指尖(图中的白线),我建议把导线做长一些(35cm)这样我们在做触控设备的时候可以把它剪到合适的长度,再把这些线按照图片焊起来
剪两条红线,两条黑线,如图焊接
再单独剪5条12cm的导线,或是用5线排线,如图焊接
把你焊好的电路板的正反面和图片对照,确认所有的东西都没有问题

FreeIMU 板

把电阻板出来的红线和黑线如图所示焊到FreeIMU板上
剪两条不同颜色的,长12cm的导线,如图焊到FreeIMU板上,这两条线要和Arduino的I2C接口链接(SDA和SCL)

把电路板固定在手链上

用厚的双面胶把刚才的两块电路板粘在硬纸板上,再剪一块同样尺寸的硬纸板(50*57mm)作为第二层的固定板。用厚双面胶作为两层板的支架,10跟导线便可以从第一层引出,如图3、4、5所示。当支架厚度达到1.5cm时,粘第二层的纸板。

第五步:第二层板制作:Arduino Micro模块和蓝牙模块



比较蛋疼的是,Arduino micro模块智能配合面包板使用,为了固定Arduino并且够适当的高度,我把Arduino的管脚如图所示的折弯了。用尖嘴钳一个一个的把管脚折成90度,注意不要弄坏他们,当所有脚都折弯后,便可以把线焊上去,需要焊的线有:

9V电源线:

红色(9V)到Arduino的Vin脚
黑线(地)到Arduino的地脚

第一层的5V电源线:

从第一层出来的红线接到Arduino的5V脚
从第一层出来的黑线接到Arduino的地脚(我们有3跟GND线,Arduino有两个GND脚,我们要有两个GND线公用一个脚)

排线:

A0:食指
A1:中指
A2:无名指
A3:小指
A4:拇指

I2C(PWI):

第一层出来的绿线连接Arduino的SCL(第3脚)
第一层出来的白线连接Arduino的SDA(第2脚)

蓝牙模块:

5V电源:从第一层出来的红线连接蓝牙模块的5v孔
地(GND):从Arduino的GND脚出来的黑线连接到蓝牙的GND孔
数据接受(RX):从Arduino的Rx脚出来的白线连接到蓝牙的Tx孔
数据发送(Tx):从Arduino的Tx脚出来的绿线连接到蓝牙的Rx孔

对比图片看你做的和图片是否一致,如果没有问题的话,把Arduino和蓝牙模块用厚双面胶粘在第二层

第六步:制作指尖触控设备




触控设备的本质是一个压敏电阻,原理是在你对设备施加压力的时候,改变电阻两端的电压。电阻的压感区域是黑点部分,这样可以很好的配合手指按压。这个部分的目的是安装电阻并且能够使压感部分始终在你的指尖位置。做一个指尖触控设备,我们需要:
1个压敏电阻
薄的双面胶
PVC板,可以用做手链一样的板,如果你嫌厚,可以用稍薄的板(图片中我用的是1MM厚的PVC板)
两个钉书针

把PVC切成9*90的矩形,按图一所示,用薄双面胶把电阻粘好,轻轻弯曲电阻的两个脚,以便你能从手链的背面焊接导线,如图2。在实际焊接导线前,我们必须把它们剪成适合的长度。将手链带到手腕上,估计每对导线到指头的长度(每个指头两条)。注意,弯曲手腕向下,线要足够长能让你握拳(参考本文第一张图片)。这里再提醒一下每个指头对应的导线。A0:食指,A1:中指,A2:无名指,A3小指,A4拇指。
剪好线后,按图二所示,把它们焊到相应的电阻管脚。
剪60mm的橡皮筋,用钉书针把它固定在PVC板上,如图2所示,橡皮筋放在折叠PCV板里,也就是说,钉书针会穿过3层(PVC-橡皮筋——PVC)
把橡皮筋弯折成一个环,同时再拿一枚钉书针固定PVC的另一端(有电阻脚的一端),由里向外的顺序是:橡皮筋—PVC—电阻—橡皮筋。注意不要不要把钉书针戳到电阻,否则很有可能会短路,最后,做的东西应该和图3,图4一样

到现在,硬件部分已经准备完了。我们开始撸代码,见证奇迹

第七步:测试,校准FreeIMU

FreelMU是一个定位和动作感应的开放式硬件,可以通过Arduino的FreeIMU库来和它通信。在官网下载最新的库和详细的安装设置说明

下面是启动运行步骤:
1.下载Arduino的FreeIMU库
2.把Arduino的环境按Arduino文档里的添加库文件部分设置
3.用FreeIMU小组提供的校准工具校准你的FreeIMU,校准的结果是一个 “calibration.h”文件,校准时需要FreeIMU的稳定的数据.

当你下载完库文件后,按照Arduino添加库的指导设置你的Arduino环境,选择手动安装可以让你对Arduino 的环境结构有更深的理解

测试FreeIMU:

把Arduino链接到电脑
打开Arduino的编程软件,打开:文件->例子->FreeIMU->FreeIMU_serial 路径下的FreeIMU串口例程
在:工具->板 路径下选择板子种类为Leonardo
选择Arduino使用的串口(路径:工具->端口)并记下串口的名字(Windows是COM2格式的,Mac是/dev/tty.usbmodem1421格式)
把例程上传到Arduino中
下面对Arduino是否响应做一个简单的检查:
打开串口调试窗口(工具->串口调试窗口),

检查串口的参数为“换行符”和“115200波特率”。
在输入栏输入v按回车,如果一切正常,Arduino会返回:

FreeIMU library by Fabio Varesano – varesano.net, FREQ:16 MHz, LIB_VERSION: DEV, IMU: FreeIMU v0.4

你同样可以输入其他的命令看Arduino的响应(注意先看看有哪些可用的指令)

FreeIMU库自带一个用于测试FreeIMU是否工作正常的应用程序“FreeIMU_cube.pde”。这是一个Prossing的文件,你需要下载并运行Prossing。他的界面分Arduino的很像。用Prossing打开“FreeIMU_cube.pde”路径是: “FreeIMU-20121122_1126/processing/FreeIMU_cube/FreeIMU_cube.pde”.我们需要告诉软件Arduino用的是哪个串口:在Processing‘s的代码里找到这么一段:

final String serialPort = “/dev/ttyUSB9”;

用你刚才记下的串口名字替换/dev/ttyUSB9(其实就是Arduino连接使用的串口名) 运行程序,如果之前的步骤没错的话,会出现一个窗口,上面有一个3D立方体。这个立方体代表你的FreeIMU,当你移动FreeIMU的时候,立方体会跟着动。如果立方体不动,不要急,我们需要校准FreeIMU. 如果有错或者程序不能启动(空白窗口),试着重启Arduino,再重新运行程序。如果这样没有用的话,FreeIMU的官网看看鼓掌排除的部分。

校准FreeIMU:

下载校准工具(只支持PC和linux)根据说明获取校准文件“calibration.h“。然后把它复制到FreeIMU文件夹里替换现有的文件(libraries->FreeIMU->calibration.h) 重新运行processing的“FreeIMU_cube.pde”程序。这次,立方体可以跟着FreeIMU移动了。

第八步:测试触控系统


这里,我会介绍如何测试Arduino代码,测试需要Arduino检测指尖触控装置产生的触控事件。正如之前提到的,Arduino通过测量压感电阻两端的电压变化来判断触控事件是否发生。我在代码中引入了一个门限值“touvhThr”,检测电压大于这个值的时候,我们认为装置的状态是“NO_TOUCH(未触发)”或者是释放按钮;当检测电压小于这个值,我们认为装置是“TOUCH(出发)”状态或者是按下按钮状态。

为了在Arduino上测试代码,下载Five_Touches.zip文件解压缩,打开它。连接Arduino并上传。当上传成功后,打开串口调试窗口,可以看见指尖触控设备产生的触控事件已经传送到电脑。记得选择“New Line(换行符)”并设置波特率为115200 现在,当你按下一个指尖触控设备,你会看见串口调试窗口上的数据(图一)。一行表示一个事件:“f”表示手指,“p”表示按下,“r”表示释放,数~4表示触控设备连接到的A0~A4脚。 比如,如果你得到“fp2”,表示2号触控设备(电阻连接到A2的那个)被按下。如果是“fr0”表示0号触控设备释放。剩下的依此类推。

第九步:通过蓝牙把事件传送到手机



如何给你的蓝牙取一个温柔的名字:
1,上传“Bluetooth_cmd”程序到你的Arduino
2,打开Arduino的串口调试窗口
3,确认串口调试的参数是:

Newline(换行符)
波特率:115200

4,在输入栏输入“D”并按回车获取蓝牙模块的基本设置,结果应该想截图1所示
5,输入“SN,你想要的新名字“,回车。截图2所示,我把我的设备取名为“Gravity touch”。
6,再次输入“D”,确认模块的名字

你可以在模块手册的附录B里找到并尝试其他的指令。当你准备好使用模块时,输入重启指令:“R,1”

下面我们测试安卓手机和手套的蓝牙通讯
1,下载 “Gravity_Touch_Bluetooth.zip”文件,解压,上传到Arduino。
2,安装 “GravityTouchTest.apk”文件,可以用手机直接下载,也可以通过电脑下载再上传到手机

打开手机蓝牙,运行“Gravity Touch Test”程序(运行前确保手机有足够的电)当绿色的LED灯点亮时表示手机和手套连接完成。如果一切顺利,当你按手套上相应的指尖触控设备,你可以看见屏幕上的立方体变绿了

我附上了我写的安卓机上处理蓝牙通信的[Java代码](http://obook.qiniudn.com/Gravity%20Touch%20Glove%20Java src.zip)。这段代码有3个部分:MainActivity.java, GloveTouchThread.java and BluetoothNoSupportedDialod.java 这里我们不解释讨论,如果你是安卓程序员,看懂这些应该没问题。注意:在这个项目中,我使用的蓝牙标准是相对较新的更靠谱的低功耗蓝牙标准。看这里大概的了解处理安卓机和低功耗蓝牙的通信方式。

这时候,手套发送定位信号和触控信号,手机接受这些信号。就像我一开始说的,这个手套的目的是作为VR或者AR游戏的输入设备。那么,我们接下来需要做的就是把这些信号传给 Unity3D游戏引擎.为什么是Unity3D呢,因为涉及到移动端3D游戏开发的时候,他是首选工具。

第十步:Unity的重力感应、触控插件

如果你是一个Unity开发人员,你想用你的手套控制你的游戏,你可以下载Unity的“gravity_touch.unitypackage”包,并导入到你的Unity项目。看一看“测试”界面可以对软件开发工具的结构有个直观的认识。 我保证,我会提供一些链接和建议帮助你在$50以内制作自己的VR设备。最好的方法就是Durovis Dive。Durovis Dive由一个叫OpenDive的套装设备和一个可以追踪手机定位的软件开发工具组成。你可以用Durovis Dive和只能手机做一个Oculus Rift(为电子游戏设计的头戴式显示器) 制作OpenDive:
1,根据这链接,下载STL文件(文件用3D打印设备制作套装的框架),然后在这里找离你最近的3D打印。我为我的设备花了$35,用了4天不到的时间。
2,OpenDiv的镜头可以在亚马逊买到
3,当你准备好框架和镜头后,按照Durovis Dive的组装说明的视频,把它们组装起来

现在,你有了手套和VR头套,尽情享受吧!
via 作者:jbesuchet

坐沙发

发表评论

你的邮件地址不会公开


*