網頁

2022年8月30日 星期二

Pixel:Bit -手勢控制-全身偵測的應用

 主題

使用 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


執行結果

舉左手,黃燈亮:

舉右手,綠燈亮:

雙手舉起,黃燈、綠燈皆亮:


雙手放下,黃燈、綠燈皆暗:

執行BlocklyDuinoF2

請使用「裝置管理員」確認是接到那個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的應用」。