學習目標 : 認識faya 心跳偵測模組的功能及使用方式
學習時間 : 55mins
示範模組 : (1) faya brickNano
(2) faya 心跳偵測模組
====================功能介紹====================
faya心跳偵測模組利用一紅外線感測器(CNY70)量測使用者的心跳資訊,使用時,只要將食指指腹輕輕的放在感測器的上方,就能透過Arduino量測波形並計算每分鐘的心律。
下圖為模組的外觀,中間正方形的元件即為CNY70,左方可變電阻用來調整輸出波型的大小,讓輸出範圍一致,方便量測與運算。右方Signal輸出埠的輸出格式為類比電壓值。
我們可以將Signal連接到Arduino的類比或數位腳位,當連接到類比腳位時 , 輸出的類比波形,經過可變電阻將訊號放大後,輸出會以脈波的型態呈現; 當連接到數位腳位時 ,也能達到同樣的結果,兩者皆方便我們計算每分鐘的心跳次數,我們會在文章的範例中介紹。
====================原理知識====================
上圖為CNY70的外觀和元件示意圖,裡面包含了一紅外線發光二極體和光電晶體,紅外線發射後,遇到阻礙反射回來的光,在光電晶體接收後,會產生相對應的電壓輸出。
當我們把感測器放在指尖的時候,發射出的紅外線穿過肌膚,被經過的血液阻擋,反射回來的紅外線強度會隨著血液量而變化。由於血管中的血液會隋著心臟的跳動有規律的體積變化,此一周期性的體積變化就會產生不一樣的光強度大小,因而得到一周期性、上下起伏的波形圖。大家可以在Google 搜尋 - [光體積變化掃描圖(PPG, Photoplethysmography)],可找到許多相關資訊。
上圖為CNY70的外觀和元件示意圖,裡面包含了一紅外線發光二極體和光電晶體,紅外線發射後,遇到阻礙反射回來的光,在光電晶體接收後,會產生相對應的電壓輸出。
由於量測到的PPG波形頻率是和心跳頻率是一致的,因此我們只要透過電路適當的將PPG波形放大,輸出的波形就會以脈波的形式呈現,模組電路圖如下所示,可變電阻VR1用來調整放大倍率。
範例程式:
備註:
-L22 : 程式除了把讀取的腳位從數位轉到類比腳位,其餘皆相同。
範例結果:
接線:
備註:
-L30 : ((input != lastInput)&&(input == HIGH)); 偵測數位腳位上源觸發時的語法,第一個判斷邏輯準位改變時,第二個判斷狀態為HIGH時
-L27~L38 : 每次偵測到上源訊號時,記錄時間,算出兩次上緣信號發生時的時間差後,取倒數算出頻率,並且轉換單位變成每分鐘的心跳數。
範例結果:
影片中我們從示波器看到穩定的脈波輸出,所算出來的每分鐘心律和手上的Garmin心律偵測錶十分的接近。
討論:
也歡迎大家在底下留言或到我們的粉絲團留言喔!
====================範例實作(一)====================
了解模組功能(原理)後,我們用以下範例來展示模組的功能:
目標:
範例程式:
備註:
-L20~21 : 程式很簡單,利用analogRead讀取連接的類比腳位,然後輸出至序列埠監控視窗
範例結果:
從工具列開啟開啟序列繪圖家(Serial Plotter),將食指指腹輕放在感測器上方,即可看到量測波形。
影片10秒鐘的位置,我們調整放大倍率,使得波形以接近脈波的形式輸出,如下圖所示,這種形式方面計算其頻率,我們在下個範例,改用數位腳位讀取心律資訊,大家可以比較齊集果。
====================範例實作(二)====================
目標:
目標:
(1)使用Serial Plotter,觀看輸出波形圖
接線:
(1) 電源線連接如下圖所示,連接的說明請看這篇文章 或簡易版
(2) 訊號線連接
Arduino_A5 ===> 心跳偵測模組_Signal 範例程式:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 2018/6/19 | |
// Faya-Nugget 範例程式 (IRPulse_2.ino) | |
// 單元: 模組介紹:faya心跳偵測模組 | |
// 網址: https://fayalab.blogspot.com/2018/06/IRPulse.html | |
// 目標: (1)使用Serial Monitor,觀看心跳數值 (利用數位腳位讀取) | |
// (2) 利用輸出波形,計算每分鐘心律 | |
// 接線: Arduino ==> faya模組 | |
// D10 ==> 心跳偵測模組_Signal | |
#define ppgPin 10 //心跳偵測模組輸出腳位 | |
int ppgOut; //輸出變數 | |
void setup() | |
{ | |
Serial.begin(9600); | |
pinMode(ppgPin, INPUT); | |
} | |
void loop() | |
{ | |
ppgOut = digitalRead(ppgPin); //儲存類比輸出至變數 | |
Serial.println(ppgOut); //列印變數值 | |
delay(10); | |
} |
備註:
-L20~21 : 程式很簡單,利用analogRead讀取連接的類比腳位,然後輸出至序列埠監控視窗
範例結果:
從工具列開啟開啟序列繪圖家(Serial Plotter),將食指指腹輕放在感測器上方,即可看到量測波形。
影片10秒鐘的位置,我們調整放大倍率,使得波形以接近脈波的形式輸出,如下圖所示,這種形式方面計算其頻率,我們在下個範例,改用數位腳位讀取心律資訊,大家可以比較齊集果。
====================範例實作(二)====================
目標:
(1)使用Serial Plotter,觀看心跳波形 (利用數位腳位讀取)
接線:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 2018/6/19 | |
// Faya-Nugget 範例程式 (IRPulse_2.ino) | |
// 單元: 模組介紹:faya心跳偵測模組 | |
// 網址: https://fayalab.blogspot.com/2018/06/IRPulse.html | |
// 目標: (1)使用Serial Monitor,觀看心跳波形 (利用數位腳位讀取) | |
// 接線: Arduino ==> faya模組 | |
// D10 ==> 心跳偵測模組_Signal | |
#define ppgPin 10 //心跳偵測模組輸出腳位 | |
int ppgOut; //輸出變數 | |
void setup() | |
{ | |
Serial.begin(9600); | |
} | |
void loop() | |
{ | |
ppgOut = digitalRead(ppgPin); //儲存類比輸出至變數 | |
Serial.println(ppgOut); //列印變數值 | |
delay(10); | |
} |
備註:
-L22 : 程式除了把讀取的腳位從數位轉到類比腳位,其餘皆相同。
範例結果:
由影片中可看出,在序列繪圖家中,輸出呈現完整的方波波形。
====================範例實作(三)====================
目標:
(1)利用心跳的數位波形,計算每分鐘心跳數
接線:
和範例實作二相同
範例程式:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 2018/6/19 | |
// Faya-Nugget 範例程式 (IRPulse_3.ino) | |
// 單元: 模組介紹:faya心跳偵測模組 | |
// 網址: https://fayalab.blogspot.com/2018/06/IRPulse.html | |
// 目標: (1) 利用輸出波形,計算每分鐘心律 | |
// 接線: Arduino ==> faya模組 | |
// D10 ==> 心跳偵測模組_Signal | |
#define ppgPin 10 //心跳偵測模組輸出腳位 | |
int ppgOut; //輸出變數 | |
int input, lastInput; //最近觸發時的狀態, 上一次觸發時的狀態 | |
int pulseTime, lastTime; //最近觸發的時間, 上一次觸發的時間 | |
int heartPeriod, heartRate; //兩心跳間著週期, 每分鐘心跳數 | |
void setup() | |
{ | |
Serial.begin(9600); | |
pinMode(ppgPin, INPUT); | |
} | |
void loop() | |
{ | |
heartRateCount(); | |
} | |
void heartRateCount() | |
{ | |
input = digitalRead(ppgPin); //讀取心跳感測模組 | |
if ((input != lastInput)&&(input == HIGH)) { //偵測到上緣觸發時 | |
pulseTime = millis(); //紀錄時間 | |
heartPeriod = pulseTime - lastTime; // 取兩次上源觸發時的差值 | |
heartRate = 60000/heartPeriod; // 每分鐘的頻率 = 60 / 週期(秒) = 60 / (heartRate / 10000) = 60000/週期 | |
Serial.println(heartRate); | |
lastTime = pulseTime; // 新值時間取代舊值時間 | |
} | |
lastInput = input; // 新值狀態取代舊值狀態 | |
} |
備註:
-L30 : ((input != lastInput)&&(input == HIGH)); 偵測數位腳位上源觸發時的語法,第一個判斷邏輯準位改變時,第二個判斷狀態為HIGH時
-L27~L38 : 每次偵測到上源訊號時,記錄時間,算出兩次上緣信號發生時的時間差後,取倒數算出頻率,並且轉換單位變成每分鐘的心跳數。
範例結果:
影片中我們從示波器看到穩定的脈波輸出,所算出來的每分鐘心律和手上的Garmin心律偵測錶十分的接近。
討論:
- 反射式的PPG量測,需要穩定的量測環境,手指的抖動,會立刻影響輸出的波形,因此使用者可以在模組的周邊,利用積木隔出一個小空間固定指尖,讓指尖的擺放更加穩定。
- 本程式範例利用兩次心跳的間隔,即時算出每分鐘的心跳數,由於只取樣一次,所顯示出的數據變動量會很大,我們可以多取幾次,再用取移動式平均值 (rolling average),如此一來,顯示的每分心跳數會較為平穩。˙
- 如果想要增加一點困難度可以再增加串列七字節上去讓它顯示在上面,這樣就不用在Serial Monitor上看囉,只要插上行動電源就可以得知自己的心跳數值是不是很方便呢。
也歡迎大家在底下留言或到我們的粉絲團留言喔!
沒有留言:
張貼留言