主題
使用 BlocklyDuinoF2 中的法蘭斯積木,設計出一個可以用手勢控制的實例。
功能
用人的手勢來控制遠端的led 燈,黃燈在左邊,綠燈在右邊:
- 舉左手,黃燈亮
- 舉右手,綠燈亮
- 雙手舉起,黃燈、綠燈皆亮
- 雙手放下,黃燈、綠燈皆暗
有關 Pixel:Bit 的介紹,請看我的另一篇文章「Pixel:Bit 的入門介紹 -學習範例」。
原理
使用 Google Mediapipe,實現 手部追蹤、人臉檢測、姿勢偵測、物體檢測等功能,可看此網址的介紹:
使用的電子元件
ESP32-S
藍色 led 燈接到 Pin 2,如果可以連線到 MQTT Server,燈就亮,否則燈滅。
黃色 led 燈接到 Pin 5,綠色 led 燈接到 Pin 17。黃色 led 燈和 綠色 led 燈 ,皆由遠端來遙控亮不亮。
Pixel:Bit
執行結果
舉左手,黃燈亮:
舉右手,綠燈亮:
雙手舉起,黃燈、綠燈皆亮:
請使用「裝置管理員」確認是接到那個COM,這是我的例子:ESP32-S 接 COM3,Pixel:Bit 接 COM5。每個人可能都不一樣。
Pixel:Bit
因為使用到影像處理的功能,工作模式請選 「ESP32 Wrover Module」,COM 選 COM5。
「啟動 Arduino IDE」。
在 Arduino ,「工具/開發板 /ESP32 Arduino/ESP32 Wrover Module」。
BlocklyDuinoF2 和 Arduino 的工作模式,二者要一樣。
工具/Partition Scheme /Huge APP,這樣的設定可容納比較大的程式。
UART 切換開關記得要切換到中間的 ESP 位置 。
完整程式
程式說明
從 「法蘭斯積木/Server模組/Pixel:Bit 網頁模組」,拿出 「PIXEL:BIT(張流)」,修改「無線網路名稱」和「無線網路密碼」。
從 「法蘭斯積木/Server模組/全身辨識」,拿出 「網頁元素(Javascript)區塊 全身偵測(mediapipe)」。
其他積木,依此類推。
有關全身偵測參數的意思
視訊 Y,瀏覽器要出現視訊。設為 N,是不出現視訊。
臉部 Y,要偵測臉部。
姿態 N,不偵測姿態。
左手掌 Y,要偵測左手掌。
右手掌 Y,要偵測右手掌。
鏡像 N,不使用鏡像,所以 面對鏡頭,舉左手變成右手,舉右手變成左手。
如果設為 Y,使用鏡像,舉左手,就是左手。舉右手,就是右手。
透明度 1,0.9,0.8,......,0.1,0。 1 :最清楚,0 :看不到視訊。
因為沒有使用鏡像,程式中的右手,實際上是人的左手,程式中的左手,實際上是人的右手。
y 值愈小,是 往上。 y 值愈大,是 往下。程式中的 右手腕.y < 右耳.y ,表示對應到人的左手腕比左耳高,表示 左手 是舉起來。
程式中的 左手腕.y > 左耳.y ,表示對應到人的右手腕比右耳低,表示 右手 是放下。
右手腕.y < 右耳.y 且 左手腕.y > 左耳.y ,表示人的左手 是舉起來 而且 右手 是放下,state 的值設為 left,也就是讓左邊的燈亮起來(即黃燈亮)。
人的右手是舉起來 而且左手是放下,state 的值為 right。也就是讓右邊的燈亮起來(即綠燈亮)。
人的右手是舉起來 而且左手是舉起來,state 的值為 on。也就是讓左、右邊的燈都亮起來(即黃燈和綠燈皆亮起來)。
人的右手是放下來 而且左手是放下,state 的值為 off。也就是讓左、右邊的燈都不亮(即黃燈和綠燈皆為暗)。
如果 cmd 的值為 hand, 「MQTT 向主題 /my666/home/light 發布訊息文字 參數 p1」的意思,把 p1 的值發布到 到 MQTT 主機,主題為 /my666/home/light 。
存檔後,將 BlocklyDuinoF2 關閉。
ESP32-S
執行 BlocklyDuinoF2。
工作模式請選 「ESP32 Dev Module」,COM 選 COM3。
「啟動 Arduino IDE」。
在 Arduino ,「工具/開發板 /ESP32 Arduino/ESP32 DevModule」。
程式說明
ESP32-S 的接法為 :藍色 led 燈接到 Pin 2,黃色 led 燈接到 Pin 5。綠色 led 燈接到 Pin 17。
向 MQTT主機,訂閱主題為 /my666/home/light 。
從 MQTT 主機接收訊息。
接收到的訊息為 left ,表示舉左手,黃燈亮 (數位寫入 Pin 5 狀態 高電位,數位寫入 Pin 17 狀態 低電位)。
接收到的訊息為 right ,表示舉右手,綠燈亮 (數位寫入 Pin 17 狀態 高電位,數位寫入 Pin 5 狀態 低電位)。
接收到的訊息為 on ,表示舉雙手,黃燈和綠燈皆亮 (數位寫入 Pin 5 狀態 高電位和數位寫入 Pin 17 狀態 高電位)。
接收到的訊息為 off ,表示放下雙手,黃燈和綠燈皆暗 (數位寫入 Pin 5 狀態 低電位和數位寫入 Pin 17 狀態低電位)。
有關 ESP32-S使用MQTT,請看我的另一篇文章「 ESP32 - 使用 BlocklyDuino-物聯網MQTT的應用」。