這篇文章來源于DevicePlus.com英語網(wǎng)站的翻譯稿。
點擊此處閱讀本文第一部分 >

在本文中,我們將繼續(xù)進行Arduino藍牙手套的開發(fā)。我們將建立一個機械系統(tǒng)來獲取手指的彎曲信息。同時,我們將會來了解如何整合IMU數(shù)據(jù),無線封裝和發(fā)送數(shù)據(jù),使用Kinect以及如何在實際生活中使用Arduino藍牙手套。我們強烈建議您先閱讀Arduino藍牙手套第一部分—基礎來了解有關本項目的基礎知識。
硬件
Arduino UNO R3 x 2
IMU 傳感器 x 2
電線
電位計 0-10kOhm x 10
電阻 10 kOhm x 10
Xbee USB 適配器
Bluetooth Bee V2 x 2
9V 電池 x 2
9V 電池連接器 x 2
Kinect
手套 x 2
扣件 x 20
軟件
Arduino IDE
Autodesk Inventor
LabVIEW Robotics Module
Microsoft Kinect的 Kinesthesia工具包
Kinect SDK 1.5
Github
工具
PLA 塑料
螺母 M3 x 40
自鎖螺母 M3 x 40
烙鐵
錫
焊料
膠水
手指彎曲測量
首先,為了測量手指的彎曲(手指彎折)信息,我們必須將手指彎曲程度轉(zhuǎn)換為電位計的旋轉(zhuǎn)度。我們可以通過簡單的機械系統(tǒng)來實現(xiàn)這一目的,如下圖所示:

圖1:用于測量手指彎曲程度的機械系統(tǒng)示意圖
為了在現(xiàn)實生活中進行應用,我們需要先在實體建模編輯器(如Autodesk Inventor)中進行建模。

圖2:用于測量手指彎曲程度的機械系統(tǒng)模型
接下來,我們需要將模型用3D打印技術制造出來。STL文件是所有3D打印機中常見的3D模型類型。只需要將所有模型分別導出成STL文件,并發(fā)送到3D打印機即可。

圖3:手指機械系統(tǒng)的3D打印部件
取用電位計(不帶黑色旋鈕/手柄)、螺絲、螺母以及3D打印部件,然后如圖4所示進行組裝。

圖4:手指基本單元組裝
如圖5所示擰入關節(jié)。然后,我們將黑色手柄與擰入的手指關節(jié)粘合在一起。

圖5:手指關節(jié)組裝細節(jié)

圖6:帶有扣件的基本手指單元
將關節(jié)擰緊后,我們要將組裝好的手指粘合到手套上。粘合使用的是超強力的多用途膠水。粘合前,表面必須保持清潔和干燥。然后在兩個表面涂一層薄薄的膠水,等待10到15分鐘后,將表面用力按壓幾秒鐘。如有必要,您可以在每個單元周圍也散布一些膠水。建議您將其晾干約24小時。
* 黏貼時請切勿將手指伸入手套,使用紙板或其他材料。

圖7:將基本單元粘合到近端指骨上(在每根手指的底部)
現(xiàn)在我們開始粘合手指關節(jié)。去除關節(jié)部分和兩一個粘性扣件,然后將他們黏貼在手指的指甲上方(圖8&9)。

圖8:粘合手指關節(jié)

圖9:手指關節(jié)組裝(粘合完成)
將黑色手柄插入電位計孔中,以連接兩個組裝好的部件。
耐心對每根手指再重復9次相同的操作。
整個模塊的接線圖如下所示。

圖10:Arduino手套電路圖
現(xiàn)在,我們來對手指進行連線吧!
準備紅色和黑色的電線,以及三根分別帶有白色、黃色和黑色標記的電線。此處強烈建議將顏色編碼,以避免混淆。
如圖11所示,將黑色標記和黃色標記的電線焊接到電位計上。

圖11:焊接電位計
用塑料扎線帶捆扎電線,以避免其受任何機械外力破壞。

圖12:用扎線帶束緊電線
接下來,您需要將黑色標記的電線與黑色電線以及黃色和白色標記的電線焊接到電阻上。紅色電線必須焊接到電阻的另一端,白色標記的電線連接至Arduino模擬輸入端。

圖13:焊接一個手指單元

圖14:將黑色和紅色標記的電線整合
焊接完所有單元后,我們將用熱縮管對電線進行收縮,并用束線帶將電線整合。

圖15:手指與主體連接

圖16:將組裝好的手指與Arduino連接

圖17:處理器主體(Arduino)

圖18:IMU傳感器連接

圖19:組裝好的Arduino手套
組裝完成!我們繼續(xù)進行編程部分。
安裝新版本的 IMU Library。請參考 第一部分了解如何安裝該庫。
打開bending.ino 并將其上傳到Arduino Uno。
#include "glove.h" TFinger Finger1 = TFinger(A0); TFinger Finger2 = TFinger(A1); TFinger Finger3 = TFinger(A2); TFinger Finger4 = TFinger(A3); TFinger Finger5 = TFinger(A4); void setup() { Serial.begin (9600); // Open the serial port Serial.println ("Be ready to set min, in 3..."); delay(1000); Serial.println ("2..."); delay(1000); Serial.println ("1..."); delay(1000); Finger1.setmin(); Finger2.setmin(); Finger3.setmin(); Finger4.setmin(); Finger5.setmin(); Serial.println ("Minimum is set"); Serial.println ("Be ready to set max, in 3..."); delay(1000); Serial.println ("2..."); delay(1000); Serial.println ("1..."); delay(1000); Finger1.setmax(); Finger2.setmax(); Finger3.setmax(); Finger4.setmax(); Finger5.setmax(); Serial.println ("Maximum is set"); Finger1.calibrate(); Finger2.calibrate(); Finger3.calibrate(); Finger4.calibrate(); Finger5.calibrate(); Serial.println ("Calibrated"); } void loop() { Serial.print ( Finger1.read() ); Serial.print ("t"); Serial.print (Finger2.read()); Serial.print ("t"); Serial.print (Finger3.read()); Serial.print ("t"); Serial.print (Finger4.read()); Serial.print ("t"); Serial.print (Finger5.read()); Serial.println ("t"); delay(300); // }
您將會看到如圖20所示的運行結(jié)果:

圖20:手指彎折讀取結(jié)果
請注意,必須遵循校準程序才能夠?qū)?shù)據(jù)進行準確測量。
IMU數(shù)據(jù)融合
在 Arduino藍牙手套第一部分 – 基礎 中,我們介紹了IMU傳感器的基礎知識?,F(xiàn)在,我們將來學習如何整合陀螺儀和加速度計的數(shù)據(jù)。
首先,我們返回并查看之前的測量結(jié)果。

圖21:IMU傳感器讀數(shù)
例如,陀螺儀返回12492數(shù)字值:
如果將陀螺儀配置為“測量范圍 ±250 dps”,則該值將乘以0.00875 dps/數(shù)位,計算得到109.30 dps角速度。(109.30 dps表示具有該角速度的物體繞測量軸旋轉(zhuǎn)一周大約需要四秒鐘)。
如果將陀螺儀配置為“測量范圍 ±2000 dps”,則該值將乘以0.07 dps/數(shù)位,計算得到874.44 dps的角速度。(874.44 dps表示具有該角速度的物體繞測量軸旋轉(zhuǎn)一周大約需要2.5秒鐘)。
傳感器的靈敏度表示的是該傳感器可檢測到的最小變化值。請注意,范圍約大,您從陀螺儀獲得的靈敏度越低。
角速度是通過陀螺儀測量的值。因此,陀螺儀能夠估計人體繞某個軸旋轉(zhuǎn)的速度。在實際應用中,需要確定我們手套的位置。我們可以通過整合所有角速度值,然后除以時間變化,來估算當前角位置。
因為角速度的測量不是連續(xù)的,而是離散的,所以我們會得到一個叫做漂移的誤差。之所以稱為“漂移”,是因為即使身體處于靜止狀態(tài),這些角位置變化的總和也會發(fā)生浮動。
我們一起看下面的陀螺儀漂移示例:
#include // Library for I2C #include // Library for working with IMU modules Gyroscope gyro; // Create an object to work with Gyroscope // Time Variables unsigned long starttime; unsigned long endtime; float dt; int ticker = 0; bool firstcall=true; // Indicator of a first iteration // Angle Variables float gyro_rateX, gyro_rateY, gyro_rateZ; float Pitch=0; float Roll=0; float Yaw=0; void setup () { Serial.begin (9600); // Open the serial port Serial.println ("Begin init ..."); // Display a message on the beginning of the initialization gyro.begin (); // Initialize the gyroscope at 100Hz Output Data Rate gyro.setRange(RANGE_2000); // set the gyroscope at 2000 dps range sensitivity Serial.println ("Init completed"); // Display a message about the successful initialization Serial.println ("Gyroscope"); } void loop () { endtime = micros(); // End time for the current Measurement if (firstcall) { firstcall=false; } else { dt = (float)(endtime - starttime)/1000000; // Get time beetween measurements gyro_rateX=gyro.readX_DegPerSec(); // Current Angle rate around the X-axis gyro_rateY=gyro.readY_DegPerSec(); // Current Angle rate around the Y-axis gyro_rateZ=gyro.readZ_DegPerSec(); // Current Angle rate around the Z-axis Pitch += 1 * gyro_rateX * dt; // Current Angle around the X-axis Roll += 1 * gyro_rateY * dt; // Current Angle around the Y-axis Yaw += 1 * gyro_rateZ * dt; // Current Angle around the Z-axis delay (10); } starttime = micros(); // Start time for the next Measurement if (ticker > 30) // Print Message every 300 ms { ticker=0; Serial.print (Roll); // Output angular velocity around the axis X Serial.print ("t"); Serial.print (Pitch); // Output of the angular velocity around the Y axis Serial.print ("t"); Serial.print (Yaw); // Output of the angular velocity about the Z axis Serial.print ("t"); Serial.println (""); } else {ticker++;} }
如果讓IMU傳感器保持不動,您將會看到漂移現(xiàn)象(圖22)。

圖22:陀螺儀漂移演示
如上所述,由于有漂移的趨勢,總和將會隨著時間的增加產(chǎn)生誤差。但我們可以通過計算和利用零速率電平來緩解漂移帶來的影響。
有關零速率電平的定義在陀螺儀數(shù)據(jù)表的“2.6.2 零速率電平”一節(jié)中有詳細描述。有這一現(xiàn)象的主要原因是在IMU上施加的機械應力,例如,在印刷電路板上焊接之后殘留的應力。當有了機械應力之后,零速率電平會隨溫度略有改變,所以這一變化也許就可以被忽略了。

圖23:基于零速率電平的陀螺儀測量
您可以點擊此處查看在新版本IMU庫中的執(zhí)行細節(jié)。
經(jīng)過這些強化后,我們就可以使用陀螺儀數(shù)據(jù)了,但是只能短期使用。
我們?nèi)孕枰陂L時間內(nèi)能夠保持穩(wěn)定的信息。加速度計是一種測量加速度的設備。通過使用加速度計,我們可以根據(jù)計算獲得的重力矢量來確定傳感器工作平面的角度。但是,使用智能手套時,傳感器將測量所有其他加速度,包括手臂的運動,這可能會破壞所測量的重力矢量。
低通濾波器可用于從隨機加速度中過濾掉重力矢量。加速度計的測量值只適用于長期使用。
將傳感器數(shù)據(jù)融合的最常見方法之一是使用功能強大的Kalman濾波器(很難理解,也很難在Arduino上實現(xiàn))。
我們使用互補濾波器作為整合IMU數(shù)據(jù)的解決方案,這種濾波器非常易于理解,且容易在Arduino上實現(xiàn)。互補濾波器基本原理如下:

其中,Roll_i – 上一次迭代中計算出的橫滾角
gyroRoll_i+1 –基于最近一次陀螺儀數(shù)據(jù)進行的最近一次測量所得到的角度變化
accelRoll_i+1 –基于最近一次的加速度計數(shù)據(jù)計算出的橫滾角
Roll_i+1 –最新計算得到的帶有互補濾波器的橫滾角
該濾波器可以在短期內(nèi)利用陀螺儀的動態(tài)特性,并通過加速度計數(shù)據(jù)在長期內(nèi)消除誤差。您可以自己進行測試,只需在Arduino IDE中打開imu_2.ino并將其上傳到您的Arduino IDE即可。
更新信息發(fā)送端
當我們獲取測量數(shù)據(jù)時,必須使用無線藍牙連接來將數(shù)據(jù)傳送到PC。
首先,檢查Bluetooth Bee是否已正確配置。將Bluetooth Bee安裝在Xbee USB適配器上,將Bluetooth Bee換為AT模式,然后使用“AT+UART?”指令檢查UART配置。Bluetooth Bee應返回“115200,0,0”(波特率115200位/秒,一個停止位,無奇偶校驗位)。如果不是,請發(fā)送“AT+ UART=115200,0,0”指令來配置Bluetooth Bee,然后再次檢查UART配置。檢查后不要忘記關閉AT模式!
另外需要注意的是位于無線SD擴展板上的“串行選擇”開關,該開關將指定將無線連接所讀取的數(shù)據(jù)發(fā)送到何處。

圖24:位于無線擴展板上的串行選擇開關/ ?Arduino LLC
將其切換到MICRO位置。當處于MICRO位置時,藍牙模塊會連接到Arduino。請注意,Arduino仍連接到USB串口轉(zhuǎn)換器。如果您從Arduino將數(shù)據(jù)寫入串行端口,數(shù)據(jù)將會以兩種方式發(fā)送:USB傳送和無線傳送。
將messaging.ino上傳到Arduino。請注意,每次打開或重置Arduino時,它都會通過三個步驟進行校準:
陀螺儀零速率電平計算;
測量手指位置最小值;
測量手指位置最大值。
在計算陀螺儀零速率電平之前,請保持IMU靜止不動。在測量手指位置最小值之前,請戴上Arduino手套并握緊拳頭。在測量手指最大位置之前,請戴上Arduino手套并松開拳頭。
在Arduino IDE中打開messaging.ino并將其上傳到您的Arduino UNO中。
關閉Arduino電源,然后將Bluetooth Bee放置在無線擴展板上。請確保Bluetooth Bee不在AT模式下,并且將無線擴展板串行選擇開關切換到MICRO位置。
用9V電池為Arduino Uno供電,并使用“1234”作為密碼與您的Bluetooth Bee配對。確認配對成功后,您可以在設備管理器中找到您的無線藍牙連接作為虛擬COM端口。

圖25:與Bluetooth Bee配對

圖26:設備管理器中的虛擬COM端口
從項目瀏覽器窗口中打開 Messaging.lvproj LabVIEW項目和 Messaging Test.vi。選擇相關COM端口并運行。

圖27:LabVIEW PC應用程序中顯示的來自Arduino手套的信息
您將會看到Arduino Uno在串行端口中寫入的數(shù)據(jù)已通過藍牙傳輸,并從虛擬COM端口中讀取。
添加Kinect測量
表面上看,Kinect 是一款Xbox 360游戲設備控制器,可替代常見的游戲桿。實際上,它是一個功能強大的運動捕捉控制器,可獲取您的姿態(tài)信息,并使您可以用手或者身體來控制游戲過程。雖然這個設備是為了游戲而開發(fā)的,但也可以在實際生活中使用。
想要在LabVIEW環(huán)境中使用用于Xbox 360的Kinect,您需要安裝以下軟件:
Microsoft Kinect SDK 1.5 (適用于Windows SDK v1.5的Kinect)
Microsoft .NET 4.0 Framework (Microsoft .NET Framework 4 (獨立安裝程序))
適用于Microsoft Kinect的Kinesthesia LabVIEW工具包
從項目瀏覽器窗口中打開 Kinect.lvproj LabVIEW Project和 Kinect Test.vi ,然后運行。如果正確安裝了所有要求的軟件,您將看到類似以下內(nèi)容的視頻和Kinect處理結(jié)果:

圖28:視頻與Kinect處理結(jié)果/ ?Kinesthesia
整合所有內(nèi)容
現(xiàn)在,我們需要把所有內(nèi)容整合到一個應用程序中。
打開 Arduino Gloves.lvproj LabVIEW Project。然后從項目瀏覽器窗口打開 Host Main.vi 。為左右手套藍牙連接選擇相應的COM端口。插入Kinect,并確??梢允褂?。
然后戴上Arduino藍牙手套并打開電源,為校準提供所需要的必要條件。
之后,運行 Host Main.vi ,您將會看到以下內(nèi)容:

圖29:在一個應用程序中完成所有測量
請確認對每個手指的彎曲度進行了準確的測量,并且橫滾角、俯仰角和偏航角與您的手的實際姿勢相對應。
機器人控制
Arduino藍牙手套在現(xiàn)實生活中的機器人控制應用領域很有用。所有處理過的數(shù)據(jù)都可以通過UDP信息傳輸?shù)饺魏蔚谌綉贸绦蛑小?/p>

圖30:傳送信息到第三方應用程序示意圖
我們選擇工業(yè)機器人手臂的模擬器—UDPPuma560 作為第三方應用程序的示例,同時添加了UDP接收器環(huán)路。 從項目瀏覽器窗口打開 Puma560 Simulator.lvproj, Host Main.vi 以及 Puma560 Simulator.vi 。
為左右手套藍牙連接選擇相應的COM端口。插入Kinect并確保可以使用。
然后戴上Arduino藍牙手套并打開電源,并為校準提供所需的必要條件。
運行完這兩個VI后,您將會得到以下結(jié)果:

圖31:將處理后的數(shù)據(jù)導出到Puma560模擬器
請注意,您必須對從智能手套獲取的數(shù)據(jù)進行正確的解譯,而不應該直接使用沒有經(jīng)過任何處理的數(shù)據(jù)。例如,操作員的右手坐標不可能與機器人的手臂夾持器相同,所以您需要將測量數(shù)據(jù)從操作員的坐標系轉(zhuǎn)換為機器人的坐標系。
審核編輯黃宇
-
藍牙
+關注
關注
119文章
6336瀏覽量
178924 -
Arduino
+關注
關注
190文章
6526瀏覽量
197088
發(fā)布評論請先 登錄
執(zhí)行“生成啟動 SD 卡”后將獲得什么輸出?
固態(tài)斷路器采用SiC JFET的四個理由
汽車聲學測量趨勢洞察(二)
【飛凌OK-MX9596-C開發(fā)板試用】②體驗WIFI、藍牙、音頻、視頻,為AI應用打下基礎
雷卯針對香橙派Orange Pi 5 Pro開發(fā)板防雷防靜電方案
【米爾NXP i.MX 91開發(fā)板評測】開發(fā)環(huán)境搭建+編譯uboot,kernel
微電機關鍵零部件制造誤差對其質(zhì)量的影響權重分析
提高篇——C語言核心技術(中文版)
英飛凌碳化硅產(chǎn)品創(chuàng)新的四大支柱綜述(二)
TI大學計劃-電源篇
如何用 Raspberry Pi 500 搭建家庭錄音室?
Arduino藍牙手套第二部分—集成所有部件
評論