Wio Terminal 操作 Grove EMG 肌電圖感測器與GSR膚電反應感測器

前言

本文將介紹如何使用 Wio Terminal 開發板來操作 Grove EMG 肌電圖感測器與 GSR 膚電反應感測器,並將讀取結果顯示於 Wio Terminal  彩色LCD上。後續會說明如何使用 tinyML 架構,根據這兩款感測器的訊號變化來判斷肌肉狀態。

我們已經針對 Wio Terminal 推出了洞洞三套件包~ (原因請洽腦波弱老闆),也別忘了參考阿吉老師所錄製的 Wio Terminal tinyML 系列影片喔!

撰寫/攝影 邱柏憲
時間 1小時 材料表
難度 2 (滿分5)

 


本文

本文的靈感是來自於這篇 hackster.io文章,使用Grove – 肌電圖感測器 EMG 與 Grove – 皮膚電反應感測器 GSR 搭配 tinyML 框架來分析肌肉痠痛的狀態,很有趣。但在這之前,必須要正確由 Wio terminal 來讀取感測器的狀態,所以寫了這篇簡短教學與大家分享。

Grove – 肌電圖感測器 EMG

Grove – 皮膚電反應感測器 GSR

注意:這兩款感測器都無法用於醫療用途,有相關需求請洽專業醫療單位。

A.下載 Arduino IDE,並設定開發板

請先取得 Arduino IDE,本文章所使用的版本為Arduino 2.0.0-rc8。本文章推薦使用2.0以後的版本以方便之後有關AI部分的範例 。請根據您所用的作業系統與希望的安裝方式自行下載即可。

開啟Arduino IDE後首先要新增 Wio Terminal 開發板相關定義,步驟如下

1. 點擊File(檔案)->Preferences(偏好設定)

2. 新增開發板定義網址

在彈出視窗中,在 額外的開發板管理員網址 處(紅框處)輸入以下內容,再按下 OK 關閉視窗。
https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json

3. 進入開發板管理員

於 Arduino 工具列點選 Tools -> Board > Board’s Manager,來開啟開發板管理員視窗

4. 尋找並安裝 wio terminal 套件

在搜尋欄(紅框處)輸入wio,就可以在下方找到 Seeed SAMD Boards 的選項,直接安裝即可。本篇文章安裝的版本為 1.8.3。請注意,先前於 2. 的偏好設定網址一定要輸入,否則會找不到對應結果。

5. 設定開發板

上述步驟完成後就能在 Tools > Board  > Seeed SAMD Boards 選項中找到 Seeeduino Wio Terminal 與其他系列產品,不要選錯囉。

6. 連接開發板與電腦,確認 COM port 編號

接著使用 USB typeC 傳輸線連接 Wio Terminal 與電腦之後,Wio Terminal 就會自動開機,稍等一段時間等電腦安裝Wio Terminal的驅動程式後,就可以在 Tools(工具)->Port(序列埠)中找到其COM編號,以下圖為例是COM62 。或以 Windows 系統來說,也可進入 Windows 的 “裝置管理員” 來檢視。

B. 圖片轉檔

本文範例會在 wio terminal 上顯示圖檔,因此本段會說明如何轉檔,如不需要此功能可直接跳到 C.

1.轉換圖片格式

由於 wio terminal LCD 有特別的輸出的方式,因此 Seeed 原廠有特別寫一篇文章說明如何將圖片轉成 wio 所需的格式,在此就照著做一遍,步驟如下:
1. 下載 Seeed 提供的 bmp_converter.py (點我下載)
2. 在放置 bmp_converter.py 的資料夾新增一個資料夾,這裡改名為 bmp

3.將想要顯示在 wio terminal LCD 上的圖片,用小畫家(Microsoft Paint)開啟,或任何能儲存24位元點陣圖的程式也可以。在此用 CAVEDU LOGO 做範例,調整尺寸後將圖片儲存在 bmp 資料夾中,注意要將存檔類型改成24位元點陣圖

4. 確認python是否有安裝,如未安裝,安裝最新版即可。完成後開啟命令提示字元(cmd),將路徑選到bmp_converter.py的位置並執行。

python bmp_converter.py

接下來程式會詢問轉檔格式,請選擇 (2) 16-bit,完成後就會在資料夾中看到 rgb565 的資料夾,裡面就是正確格式的 .bmp檔了。萬一跳出 ImportError: No module named PIL 的錯誤,請在 cmd 中輸入 pip install pillow 安裝相關套件就可以了

5.檔案轉換完成後,將其複製到 microSD 記憶卡,然後再插入wio_terminal 中就完成了。

B2.下載RAWImage.h

此標頭檔是由 Seeed 提供,可將圖片輸出於 Wio Terminal LCD 的函式庫,請由此取得:
https://files.seeedstudio.com/wiki/Wio-Terminal/res/RawImage.h

直接複製文字後將其貼入一個新開啟的空白.txt檔案,完成後再將其改名為 RawImage.h 再直接放入Arduino的library資料夾內 (或任何您覺得順手的做法都可以),例如以下路徑 C:\Program Files (x86)\Arduino\libraries

C.接線圖

由於 wio terminal 只有一個類比訊號輸入的Grove頭,因此在肌電圖感測器 (EMG Detector) 需要接到板子背後的腳位才行,此處可使用Grove轉杜邦線或是直接拿三條公公杜邦線連接(本文章做法)
連接方法為:

  • 黑接黑(GND)
  • 紅接紅(5V)
  • 黃接橘(訊號)
  • 白色空接

與wio terminal連接為:

  • 上排右邊數來第1格接紅色(5V)
  • 上排右邊數來第3格接黑色(GND)
  • 上排右邊數來第8格接橘色(訊號)

而皮膚電反應感測器(GSR) 就簡單許多,只需將其用Grove 線與右方的Grove腳位座連接即可(紅圈處)

D.程式

程式中關於圖片名稱需與以下相同:
drawImage<uint16_t>("cave.bmp", TFT_HEIGHT/2, TFT_WIDTH-200);
內的cave.bmp一樣否則便無法順利執行程式,如使用其他名稱圖檔,請自行修改即可。

另外如果跳過步驟B的讀者,請註解這行程式碼,否則程式會無法運行 (因為圖檔不存在呀)

// Include the required libraries.
#include <SPI.h>
#include <Seeed_FS.h>
#include "TFT_eSPI.h"
#include "SD/Seeed_SD.h"
#include "RawImage.h"

// Define the TFT screen:
TFT_eSPI tft;

// Define the sprite settings:
TFT_eSprite spr = TFT_eSprite(&tft);

// Define the sensor voltage (signal) pins:
#define GSR A0
#define EMG A2
int gsr_value , emg_value ;
// Define the data holders.
uint32_t background_color = tft.color565(0, 0, 0);
uint32_t text_color = tft.color565(174, 255, 205);



void setup() {
  Serial.begin(115200);

  // Check the connection status between Wio Terminal and the SD card.
  if (!SD.begin(SDCARD_SS_PIN, SDCARD_SPI)) while (1);

  // Initiate the TFT screen:
  tft.begin();
  tft.setRotation(3);
  tft.fillScreen(background_color);
  tft.setTextColor(text_color);
  tft.setTextSize(2);
  // Create the sprite.
  spr.createSprite(TFT_HEIGHT / 2, TFT_WIDTH);
  spr.setTextSize(3);

  drawImage<uint16_t>("cave.bmp", TFT_HEIGHT / 2, TFT_WIDTH - 200);
}

void loop() {
  // Obtain current measurements generated by the GSR sensor and the EMG sensor.
  get_GSR_data(3);
  get_EMG_data();
  // Initialize the sprite.

  spr.drawString("gsr:= ", 10, 10);
  spr.drawString("(finger) ", 10, 40);
  spr.drawString(String(gsr_value), 10, 70);
  spr.drawString("emg:= ", 10, 100);
  spr.drawString("(arm)", 10, 130);
  spr.drawString(String(emg_value), 10, 160);

  spr.pushSprite(0, 0);
  delay(50);
  spr.fillSprite(background_color);
}

void get_GSR_data(int calibration) {
  long sum = 0;
  // Calculate the average of the last ten GSR sensor measurements to remove the glitch.
  for (int i = 0; i < 10; i++) {
    sum += analogRead(GSR);
    delay(5);
  }
  gsr_value = (sum / 10) - calibration;
  Serial.print("GSR Value => "); Serial.println(gsr_value);
}

void get_EMG_data() {
  long sum = 0;
  // Evaluate the summation of the last 32 EMG sensor measurements.
  for (int i = 0; i < 32; i++) {
    sum += analogRead(EMG);
  }
  // Shift the summation by five with the right shift operator (>>) to obtain the EMG value.
  emg_value = sum >> 5;
  Serial.print("EMG Value => "); 
  Serial.println(emg_value); 
  Serial.println();

  delay(10);
}
wio terminal read emg and gsr sensors

E. 執行測試

接下來只要將感測器安裝完畢即可。GSR(皮膚電反應感測器)將布套分別套在食指和中指,EMG(肌電圖感測器) 則是按照Seeed官方示意圖的大略位置將貼片黏於手臂上,安裝完畢後大概位置會如下圖所示

最後就能Wio Terminal上看到當前的量測數值囉!大家可以試試看甚麼情況下的數值可以有變化

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。