熱門資訊
隔空操控:用Arduino實現無線手套體驗VR游戲
來源:3XMaker 發布時間:2019年01月02日隔空操控:用Arduino實現無線手套體驗VR游戲
嘿,小伙伴們,我想跟你們分享一款我自己制做的,專門為像Google Glass,Meta,Moverio BT這一類AR眼鏡,或者Oculus Rift,Samsung Gear VR,vrAse,Durovis 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會返回:
1 | 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的代碼里找到這么一段:
1 | 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,確認串口調試的參數是:
1 2 | 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頭套,盡情享受吧!

南京合越智能,增強智造,增強感知,增強交互!
業務合作
(我們會第一時間與您聯系)聯系方式
- 微信:13815863530(手機同號)
- QQ:38260484
- 3XMaker@163.com