快速設計您專屬的低成本 3D 手勢控制器
資料提供者:DigiKey 北美編輯群
2019-08-13
人類與機器和嵌入式裝置的互動方式,基本上不外乎旋鈕、按鈕、手柄和觸控式螢幕。不過近期在感測器技術上的進步,為開發人員開啟了在產品中新增三維度 (3D) 手勢控制功能的可能性。
視採用的技術而定,購買與整合手勢控制器可能所費不貲。不過,目前已有廣泛多樣的手勢感測器技術可供選擇,涵蓋採用紅外線 LED 與光電二極體來偵測動作的低成本感測器,到昂貴的手勢識別攝影機。紅外線手勢感測器既便宜,又能以數位方式介接低成本的微控制器,並且對許多應用而言,只需少許軟體,便能夠達到足夠的準確度。
本文將探討如何使用 Broadcom 的 APDS-9960 進行手勢控制;此紅外線 (IR) 手勢控制感測器可輕鬆整合到幾乎所有嵌入式系統中。
IR 型手勢感測器
IR 型手勢感測器背後的運作原理相當簡單。偵測手勢時,開發人員可能希望偵測到以下幾種不同的手勢:
- 向上/向下
- 向左/向右
- 向前/向後
在每種情況下,感測器必須能夠偵測到動作的方向。為此,需要在感測器中使用兩大元件:一個發光二極體 (LED) 以及多個指向性光電二極體。所謂指向性光電二極體,是指數量至少四個且離 IR LED 一段預定距離的光電二極體。例如,Broadcom 的 APDS-9960 環境光、接近與手勢感測器,會將其光電二極體以菱形樣式放置,且每個二極體都有一個方向指示,例如上、下、左、右 (圖 1)。
圖 1:Broadcom 的 APDS-9960 內建 IR LED 及四個指向性光電二極體,可偵測反射的 IR 能量,以用於分析建立手勢剖析檔。(圖片來源:Broadcom)
LED 發射紅外線能量時,能量會發射到空曠的空間中,除非遭到物體 (如手) 的反射。反射的能量可由光電二極體偵測到不同的強度,視物體的位置而定。例如,沿著手勢前緣的光電二極體剛開始接收到的反射能量,會比處於後緣的光電二極體少,這會導致有個光電二極體的計數值比另一個高。在手勢進行期間持續地測量,能讓光電二極體偵測到位於不同二極體位置的不同反射強度。隨後可以分析這一連串的方向資訊,進而判斷出手勢。
例如,如果使用者將手從感測器上方揮動到下方,當手勢開始時,下方的光電二極體會比上方的光電二極體偵測到更多的入射反射光。隨著手勢進行,手會移動到兩個二極體接收到等量能量的位置。當手勢完成時,下方的光電二極體會接收到較少的反射光,而上方的光電二極體會接收到更多的反射光,同時逆轉光電二極體的曲線及相位 (圖 2)。
圖 2:當向下的手勢劃過 Broadcom 的 APDS-9960 時,將會產生這些光電二極體曲線,其中主導曲線代表手勢方向。(圖片來源:Broadcom)
瞭解手勢的資料是如何產生之後,下一步便是看看要如何介接 APDS-9960。
介接 Broadcom 的 APDS-9960 手勢控制器
APDS-9960 採用八引腳表面黏著 (SMD-8) 封裝,只需佔用最少的 PC 電路板空間 (圖 3)。感測器的尺寸僅有 3.94 × 2.36 × 1.35 mm。此封裝含有常規的電源與接地引腳、可與微控制器進行數位連接的 I2C 介面,以及可用於客製化 LED 驅動電路的引腳。此外,封裝還含有中斷引腳,可在有手勢資料可供處理時通知微控制器。
圖 3:APDS-9960 採用緊湊的表面黏著 SMD-8 封裝,可將佔用的電路板空間降至最少。 (圖片來源:Broadcom)
提供多種不同的選項可用於原型開發並介接 APDS-9960。例如,SparkFun 的 APDS-9960 評估板就提供一個相對較小的分接板,其中整合 LED 驅動電路,因此開箱即可使用 (圖 4)。開發人員只需要焊接排針座以跳接電源和接地,並將 I2 匯流排和選配的中斷引腳連接到微控制器,即可著手開發嵌入式軟體。此外,SparkFun 板還含有安裝孔,如果在應用中使用既有的板件是合理的作法,就可將 SparkFun 板加入到設計中。
圖 4:SparkFun 的 APDS-9960 評估板具有開始進行手勢控制所需的所有板載電路。(圖片來源:DigiKey)
或者,開發人員也可以使用 Adafruit 的 APDS-9960 分接板,這是另一個多功能合一的解決方案 (圖 5)。Adafruit 分接板非常值得關注,因為不僅體積小,而且含有板載的 3 V 穩壓器,可用來供電給電源 LED、甚至低功率微控制器等其他電路。除此之外,Adafruit 還為開發人員提供完整的 Adafruit APDS9960 分接使用指南,以及多個軟體函式庫,可連接 Arduino 板或執行 Python 的開發板。因此,APDS-9960 具有出色的開箱即用體驗,並可大幅縮短開發人員剛開始使用感測器所花的時間。
圖 5:Adafruit 的 APDS-9960 分接板包括 APDS-9960、板載 3 V 穩壓器以及 I2C 電壓轉換電路,可支援 3 V 或 5 V 的匯流排。(圖片來源:DigiKey)
若要介接這些分接板,最簡單的方法是將 Molex 的 22-28-4255 分接頭焊接在電路板上。最好是將排針座朝下,這可帶來許多優點。首先,這可以讓板件接至試驗電路板上,例如 Digilent 的 340-002-1 免焊式試驗電路板套件 (圖 6)。其次,這可讓電路板的頂端表面維持淨空,有足夠的空間來做出手勢,而不會意外地碰到懸掛在排針座上的電線。
圖 6:Adafruit 的 APDS-9960 分接板在 Digilent 免焊式試驗電路板上的焊接和準備。(圖片來源:Adafruit)
此時,需要連接電源和接地線,且必須將 I2C 線路接至所需的微控制器開發板上。只要是具有微控制器的開發板,都可使用。不過,建議使用 STMicroelectronics 的 B-L475E-IOT01A2 STM32L475 物聯網節點探索套件 (圖 7)。此開發板具有 Arduino 排針座,且支援 MicroPython,可以輕鬆地在板件上進行編程。完成編程後,即可使用 Python 指令碼與手勢感測器進行介接,進一步確保輕鬆實現手勢控制。
圖 7:STM32L475 物聯網節點探索套件具有 Arduino 排針座,可輕鬆介接到 APDS-9960 分接板。(圖片來源:STMicroelectronics)
使用 Python 偵測手勢
從 APDS-9960 取得手勢資料並不難,但開發人員需要詳閱規格書。APDS-9960 有以下幾個不同的功能:
- 手勢感測
- 環境光感測
- RGB 顏色感測
- 接近感測
這些全都由狀態機控制,並根據應用所設定的暫存器來執行。舉例來說,若要避免手勢引擎持續執行,有個很好的方法就是使用接近感測引擎來偵測手的存在。一旦反射的 IR 能量達到預設的計數,接近引擎狀態將會切換至手勢引擎,就會測量指向性光電二極體,並將測量值放入先進先出 (FIFO) 緩衝器。為了啟用此功能,需要將控制暫存器設定成啟用接近感應,同時需要設定計數閥值。
視應用所需的手勢而定,開發人員可能需要編寫演算法來偵測特定手勢。不過,如果是上/下、左/右等常見手勢,開發人員可利用 Adafruit 的 APDS-9960 CircuitPython 函式庫。將其複製到 Python 元件後,就能使用清單 1 所示的程式碼進行匯入。此程式碼可匯入 APDS-9960 函式庫以及多個支援 I2C 匯流排的函式庫。
複製 import board import busio import adafruit_apds9960.apds9960 i2c = busio.I2C(board.SCL, board.SDA) sensor = adafruit_apds9960.apds9960.APDS9960(i2c)
清單 1:CircuitPython 匯入與函式庫初始化程式碼,可介接 APDS-9960 手勢控制器。(圖片來源:Adafruit)
感測器物件是 APDS-9960 函式庫的實例,我們稍後便會瞭解到這個物件很容易使用。若要啟用手勢,開發人員只需要使用以下程式碼啟用手勢功能:
複製 sensor.enable_gesture = True The main program loop setup to read the gesture is itself just a few lines of code (Listing 2).gesture = sensor.gesture() while gesture == 0: gesture = sensor.gesture() print('Saw gesture: {0}'.format(gesture))
清單 2:偵測手勢非常簡單,只需重複調用某個函數庫即可。(圖片來源:Adafruit)
正如您在閱讀程式碼時所注意到的,如果發現手勢,偵測到的手勢將會列印到螢幕上 (圖 8)。
圖 8:Adafruit 的 APDS-9960 CircuitPython 函式庫手勢輸出結果範例。(圖片來源:Adafruit)
手勢輸出以數字形式提供,可使用下列鍵值輕鬆轉換:
0 = 未偵測到手勢
1 = 偵測到向上手勢
2 = 偵測到向下手勢
3 = 偵測到向左手勢
4 = 偵測到向右手勢
如上所述,如果利用先前已有的函式庫,則只需幾行程式碼便能輕鬆地實現基本的手勢識別。而更複雜的手勢就需要修改函數庫,以分析手勢原始資料。
構建手勢控制器的秘訣與訣竅
在產品中構建及整合手勢控制感測器並不容易。以下是開發人員在使用紅外線型手勢控制器時需要考慮的一些秘訣與訣竅:
- 使用手勢感測器的內部接近偵測器來觸發手勢控制引擎,以將無效的手勢啟動減至最少。
- 從現有的手勢庫著手,在既有的功能之外構建更多的手勢。
- 將光電二極體的增益,調整至最適合最終手勢應用的數值。
- 將 LED 輸出的驅動強度,調整至最適合應用的數值。為了獲得可重現的結果,上述作法可能需要進行一些微調。
- 在開發任何手勢應用時,開發人員應該先從高層級軟體開發著手,在瞭解感測器後,再進行低層級程式碼開發。
遵循這些訣竅,將有助於確保開發人員在最短的時間內讓 IR 手勢控制器啟動並操作。
結論
業界一直穩定推動著以更自然、更直覺的方式與機器進行互動。其中,最重要的一個選項就是採用手勢控制技術。雖然手勢控制技術有很多不同的類型,但是成本最低且最容易使用的技術,則是紅外線型手勢感測器。如前面所述,如果開發人員能善用現有的硬體和軟體技術,整合手勢感測器和微控制器就不需要耗費大量時間。

聲明:各作者及/或論壇參與者於本網站所發表之意見、理念和觀點,概不反映 DigiKey 的意見、理念和觀點,亦非 DigiKey 的正式原則。