顯示具有 IR 標籤的文章。 顯示所有文章
顯示具有 IR 標籤的文章。 顯示所有文章

2021年6月29日 星期二

[Arduino] MAX30102 血氧心律脈搏傳感器(二)

本文在說明如何使用 MAX30102 血氧心律脈搏傳感器量測心跳和血氧,如果您尚未了解這塊模組的基本使用方法,請詳「MAX30102 血氧心律脈搏傳感器(一)」。



電路接線

Arduino      Max30102
   5V                VIN
   A5                SCL
   A4                SDA
   (不接)          INT
   (不接)          IRD
   (不接)          RD
   GND            GND
註:下圖有誤, SCL、SDA之接線應該對調才是正確。



測量每分鐘心跳數(PRbpm)

Step1 點擊下拉功能表 [檔案] > [範例] > [SparkFun MAX3010x Pluse...] ,開啟「Example5_HeartRate」。



Step2 上傳程式到 Arduino,並打開「序列埠監控視窗」,將鮑率調到 115200,您就可以看到有數據傳到視窗裡。

下圖是手指尚未按住模組時的數據。


下圖是手指按住模組時的數據。


建議您手指按住模組的時間久一些,每分鐘心跳數才會比較正確。


測量血氧(%SpO2)

Step1 點擊下拉功能表 [檔案] > [範例] > [SparkFun MAX3010x Pluse...] ,開啟「Example8_SPO2」。

Step2 上傳程式到 Arduino,並打開「序列埠監控視窗」,將鮑率調到 115200,您會看到視窗裡有一行訊息,此時請您用食指按住模組,然後在視窗上面的欄位內輸入任意一個字,並點擊 [傳送] 鈕。

接著您會看到有數據傳到視窗裡。



過了數秒後,接著才出現血氧測定的數據,如下圖


建議您手指按住模組的時間久一些,血氧數據才會比較正確。


後記

1. 量測心跳和血氧需要一段時間,所以手指要確實按住模組時間久一些,並且在實務上會有音效和螢幕提醒使用者何時開始量測,何時結束。

2. 因 MAX30102 模組本身精度和外在環境條件等因素,此實驗之心跳和血氧等數據只能僅供參考,如欲求得更精確數據,則有待更多實驗數據後進行校正。

3. CDC 提供關於 COVID-19 病人血氧監測注意事項,其中提到血氧濃度大等於 95% 才屬正常,若低於此數值,應立即通報當地衛生單位。      


參考資料

Youtube https://youtu.be/_0rAVkETtoQ

Youtube https://youtu.be/rACZQrHHxuU

Youtube https://youtu.be/8SOTsR1k8-g

使用 ESP8266 https://how2electronics.com/max30100-pulse-oximeter-with-esp8266/

使用 ESP32 http://www.esp32learning.com/code/max30102-pulse-oximetry-and-heart-rate-monitor-sensor-and-esp32.php

解決 MAX30100 模組問題 https://youtu.be/ZqdmA4NAqb0


採購資訊

露天(S&R) https://www.ruten.com.tw/item/show?22125280142290

露天(RWG) https://www.ruten.com.tw/item/show?22125280090933

蝦皮 https://shopee.tw/-RWG-MAX30102-%E8%A1%80%E6%B0%A7-%E5%BF%83%E7%8E%87%E8%84%88%E6%90%8F-%E5%82%B3%E6%84%9F%E5%99%A8-%E6%A8%A1%E5%A1%8A-i.14363185.7792558591


2021年6月28日 星期一

[Arduino] MAX30102 血氧心律脈搏傳感器(一)

 MAX30102 是一個集成的脈搏血氧儀和心率監測儀生物傳感器的模塊。它集成了一個紅光 LED和一個紅外光 LED、光電檢測器、光器件,以及帶環境光抑制的低噪聲電子電路。

MAX30102 採用一個 1.8V 電源和一個獨立的 5V 用於內部 LED 電源,它可應用於穿戴設備進行心率和血氧采集檢測,佩戴於手指、耳垂和手腕等處,標準的12C通信接口將採集到的數值傳輸給 Arduino 單片機進行心率和血氧計算。

此外,該芯片還可通過軟件關斷模塊,待機電流接近為零,實現電源始終維持供電狀態。正因為其優異的性能,該芯片被大量應用在了三星 Galaxy S7 手機。與前代產品 MAX30100 相比, MAX30102 集成了玻璃蓋可以有效排除外界和內部光干擾,擁有最優可靠的性能。






原理說明

傳統的脈搏測量方法有三種:
一是心電信號中提取
二是從測量血壓時壓力傳感器測到的波動來計算脈率
三是光容積法。

前兩種方法提取信號都會限制病人的活動,如果長時間使用會增加病人生理和心理上的不舒適感。而光容積法脈搏測量作為監護測量中最普遍的測量方法之一,其具有方法簡單、佩戴方便、可靠性高等特點。

光容積法的基本原理是利用人體組織在血管搏動時造成透光率不同來進行脈搏和血氧飽和度測量的,其使用的傳感器由光源和光電轉換器兩部分組成。通過繃帶或夾子固定在病人的手指、手腕或耳垂。測血氧飽和度時,根據氧合血紅蛋白(Hb02)和血紅蛋白(Hb)對紅外光、紅外光的吸收量來計算。血管隨著心跳舒張和收縮,舒張時血量多,吸收的紅光紅外光多,收縮時血量少,吸收的紅光紅外光少。根據反射到傳感器的光量周期性變化,可以計算出心率。血氧飽和度計算公式。


模塊參數

電路板尺寸: 15*20mm
電路板厚度: 2.5mm
模塊功能:測心率、測血氧濃度、測溫度
供電電壓: 3.3~5V (經測試使用3.3~5V皆可)
檢測信號類型:光反射信號(PPG)
輸出信號接口: I2C 接口
通信接口電平: 3.3V
紅光LED峰值波長: 650nm-670nm
紅外線LED峰值波長: 870nm-900nm


電路接線

Arduino      Max30102
   5V                VIN
   A5                SCL
   A4                SDA
   (不接)          INT
   (不接)          IRD
   (不接)          RD
   GND            GND
註:下圖有誤, SCL、SDA之接線應該對調才是正確。


使用說明

Step1 安裝程式庫。點擊 Arduino 下拉功能表 [工具] > [管理程式庫],開啟「程式庫管理員」視窗。

Step2 在上方欄位內輸入「max30102」,找到「SparkFun MAX3010x Pulse ...」程式庫,安裝它。安裝完成後,關閉視窗。


Step3  點擊下拉功能表 [檔案] > [範例] > [SparkFun MAX3010x Pluse...] ,開啟「Example1_Basic_Readings」。



Step4 上傳程式到 Arduino。

Step5 打開「序列埠監控視窗」,將鮑率調到 9600,您就可以看到有數據傳到視窗裡。

下圖是手指尚未按住模組時的數據。


下圖是手指按住模組時的數據。


後記

1. 如果用 I2C_Scan 程式掃描模組,其位址是 0x57。

2. 如果要自訂 SDA、SCL 腳位,可使用 Software I2C 程式。

3. 實際量測心跳和血氧,請詳「MAX30102 血氧心律脈搏傳感器(二)」。

4. 如果您手上的是 MAX30100 模組,因為這個模組電路設計有誤,可參照下列網址修改電路

https://electronicsinnovation.com/solved-max30100-not-working-initializing-pulse-oximeter-failed/


參考資料

Makersportal https://makersportal.com/blog/2019/6/24/arduino-heart-rate-monitor-using-max30102-and-pulse-oximetry

Instructables https://www.instructables.com/DIY-Blood-Oxygen-Meter/

Youtube https://www.youtube.com/watch?v=cEtyMkubXj4


採購資訊

露天(S&R) https://www.ruten.com.tw/item/show?22125280142290

露天(RWG) https://www.ruten.com.tw/item/show?22125280090933

蝦皮 https://shopee.tw/-RWG-MAX30102-%E8%A1%80%E6%B0%A7-%E5%BF%83%E7%8E%87%E8%84%88%E6%90%8F-%E5%82%B3%E6%84%9F%E5%99%A8-%E6%A8%A1%E5%A1%8A-i.14363185.7792558591

2016年11月13日 星期日

自製紅外線遙控器

這裡我們不講硬體如何製作,而是說明如何用 Arduino 發射特定的紅外線編碼,藉以模擬出家裏的遙控器。


材料清單

接收部分
1. Arduino 開發板 *1
2. 紅外線接收模塊 *1
3. 杜邦線 *3P

發射部分
1. Arduino 開發板 *1
2. R1電阻 100R *1
3. 紅外線發射LED2 *1
4. 杜邦線 *2P


紅外線接收電路

電路接線和程式碼詳 http://pizgchen.blogspot.tw/2016/11/blog-post_13.html


紅外線發射電路

有三種電路方式,都可以作為紅外線發射電路,如下圖:


為方便起見我們採用左側那個電路,但實際應用時最好採用右側電路,因為發射信號的距離會比較遠。實際電路接線如下圖:




讓 Arduino 發射 38KHz 的信號

請您先將下列程式碼 Upload 到 Arduino,然後將紅外線發射管對準紅外線接收器,並開啟接收器的 Serial Monitor:

#include <IRremote.h>
IRsend irsend;

void setup() { }

void loop() {
  for (int i = 0; i < 3; i++) {
    irsend.sendSony(0xa90, 12); // Sony TV power code
    delay(100);
  }
  delay(1000);
}

您應該可以看到大概如下圖所示的畫面,在接收端的確有收到來自發射端發出的信號「A90」。



如果您夠仔細的話,應該會發現到雖然我們使用 D3 腳位作為發射紅外線信號,但我們並未在 setup() 區段內指定 D3 腳位的 pinMode 為 OUTPUT,那麼為什麼還可以正常發射 38KHz 信號呢? 因為 IRRemote Library 使用 Timer2 中斷,而 Timer2 是設定在 D3 腳位。

另外要提醒您,tone() 函式也是使用 Timer2 中斷,所以您如果同時使用 tone() 函式讓 Arduino 發出聲音,並且也使用 IRRemote Library 讓紅外線發射 38KHz 信號,您會發現它們無法同時作用。


發射紅外線編碼

Arduino 有內建許多廠商的紅外線編碼函式,如下

void sendNEC(unsigned long data, int nbits);
void sendSony(unsigned long data, int nbits);
void sendRC5(unsigned long data, int nbits);
void sendRC6(unsigned long data, int nbits);
void sendDISH(unsigned long data, int nbits);
void sendSharp(unsigned long data, int nbits);
void sendPanasonic(unsigned int address, unsigned long data);
void sendJVC(unsigned long data, int nbits, int repeat);


其實 KEYES 遙控器是採用 NEC 編碼格式,因此如果您想發出「1」的編碼,可以

irsend.sendNEC(0xFF6897, 32);

如果是未知廠商的編碼,您可以使用下列函式

void sendRaw(unsigned int buf[], int len, int hz);

以發射 KEYES 遙控器為例,如果要發射按鍵「1」的編碼,程式碼如下

unsigned int raw_1[68] = {0xB3,0x5A,0xB,0xC,0xB,0xC,0xB,0xD,0xA,0xC,0xB,0xD,0xA,0xD,0xA,0xD,0xA,0xD,0xA,0x22,0xB,0x22,0xA,0x22,0xA,0x23,0xA,0x22,0xA,0x22,0xB,0x22,0xB,0x21,0xB,0xC,0xB,0x22,0xA,0x22,0xB,0xC,0xB,0x22,0xB,0xC,0xA,0xD,0xB,0xC,0xA,0x22,0xB,0xC,0xB,0xC,0xB,0x22,0xB,0xC,0xA,0x22,0xB,0x22,0xB,0x21,0xB,};

irsend.sendRaw(raw_1,68,38);



進階題目

聲音函式和紅外線發射函式真的無法同時使用嗎? 答案是否定的。只要讓 tone() 函式和紅外線發射函式不使用同一個 Timer 中斷,如此即可解決問題,但此問題不在本文的討論範圍內。


相關連結

Timers and Interrupts http://letsmakerobots.com/node/28278


採購資訊

紅外線遙控器套件 http://goods.ruten.com.tw/item/show?21628077374704



找出紅外線遙控器的編碼

為了避免遙控器互相干擾,各家電器廠商大都會自訂該公司專屬的紅外線編碼,例如 SONY、JVC、PANASONIC...。

如果你家的遙控器壞掉了或是不見了,那該怎麼辦呢? 比較方便的方式就是再去買一支,再不然就是...自己做一支。

找出遙控器的編碼是一個關鍵,本文就是在說明如何找出遙控器編碼。


材料清單

1. Arduino 開發板
2. 紅外線接收模塊



電路接線

Arduino      紅外線接收模塊
VCC         中間腳(橙色線)
GND        「-」(綠色線)
D3            「S」(黃色線)


程式碼

以下程式可以找出大部分紅外線遙控器的編碼,包括 KEYES 紅外線遙控器套件的編碼。

#include <IRremote.h>

int RECV_PIN = 3;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
}

您可以發現 Serial Monitor 內的資料正是 KEYES 這款遙控器套件的編碼。



後記

南桃園電視盒的遙控器壓一次按鍵似乎會傳出數組編碼,而且好像不是那麼固定,我壓了數次「1」鍵,結果產生如下編碼,個人無法理解這編碼的規則性:



相關連結

IR receiver 1838 Datasheet https://arduino-info.wikispaces.com/file/view/IR-Receiver-AX-1838HS.pdf
紅外線遙控器 http://pizgchen.blogspot.tw/2016/11/blog-post.html


採購資訊

紅外線遙控器套件 http://goods.ruten.com.tw/item/show?21628077374704



紅外線遙控器

市售紅外線遙控器有很多種,硬體上我們在此僅介紹「KEYES」這一款紅外線遙控器套件,至於其它款式的原理及操作,其實也跟「KEYES」大同小異。



紅外線遙控器套件清單:
1. 遙控器 * 1
2. 接收模塊 *1
3. 5mm發射 LED *1
4. 杜邦線母母頭 * 3P


電路接線

這裡要注意的是, 接收模塊的腳位上面只有標示「S」和「-」,沒有標示「VCC」。這裏「S」表信號腳位(黃色杜邦線),「-」表 GND 腳位(綠色杜邦線),而中間那支腳就是 VCC (橙色杜邦線),詳下圖:



Arduino    紅外線接收模塊
VCC         中間腳(橙色線)
GND        「-」(綠色線)
D3            「S」(黃色線)


程式碼

#include "IRremote.h"

/*-----( Declare Constants )-----*/
int receiver = 3; // pin 1 of IR receiver to Arduino digital pin 3

/*-----( Declare objects )-----*/
IRrecv irrecv(receiver);           // create instance of 'irrecv'
decode_results results;            // create instance of 'decode_results'
/*-----( Declare Variables )-----*/

void setup()
{
  Serial.begin(9600);
  Serial.println("YourDuino IR Receiver Button Decode Test");
  irrecv.enableIRIn(); // Start the receiver
}

void loop()
{
  if (irrecv.decode(&results)) // have we received an IR signal?
  {
//    Serial.println(results.value, HEX);  UN Comment to see raw values
    translateIR();
    irrecv.resume(); // receive the next value
  }
}/* --(end main loop )-- */

/*-----( Declare User-written Functions )-----*/
void translateIR() // takes action based on IR code received
// describing KEYES Remote IR codes
{
  switch(results.value)
  {
  case 0xFF629D: Serial.println(" FORWARD"); break;
  case 0xFF22DD: Serial.println(" LEFT");    break;
  case 0xFF02FD: Serial.println(" -OK-");    break;
  case 0xFFC23D: Serial.println(" RIGHT");   break;
  case 0xFFA857: Serial.println(" REVERSE"); break;
  case 0xFF6897: Serial.println(" 1");    break;
  case 0xFF9867: Serial.println(" 2");    break;
  case 0xFFB04F: Serial.println(" 3");    break;
  case 0xFF30CF: Serial.println(" 4");    break;
  case 0xFF18E7: Serial.println(" 5");    break;
  case 0xFF7A85: Serial.println(" 6");    break;
  case 0xFF10EF: Serial.println(" 7");    break;
  case 0xFF38C7: Serial.println(" 8");    break;
  case 0xFF5AA5: Serial.println(" 9");    break;
  case 0xFF42BD: Serial.println(" *");    break;
  case 0xFF4AB5: Serial.println(" 0");    break;
  case 0xFF52AD: Serial.println(" #");    break;
  case 0xFFFFFFFF: Serial.println(" REPEAT");break;
  default:
    Serial.println(" other button   ");
  }// End Case

  delay(500); // Do not get immediate repeat
}

UPLOAD 程式到 Arduino 後,請開啟 Serial Monitor 並隨意按下遙控器按鍵,您就可以看到 Arduino 已正確接收到紅外線信號,如下圖:


至於程式裏面的紅外線編碼是怎麼來的,您可以參考「相關連結」裏的「找出紅外線遙控器的編碼」這篇文。



進階題目

遙控器上面有 0~9 共 10 個數字鍵,那麼遙控器只能按出 0~9 這樣的數字給 Ardunio 嗎? 答案是否定的。

我們可以在程式上指定一個字串變數用來儲存使用者按下的數字(其實它是字元),使用者每按下一個數字按鍵,便將這個字元結合到該字串變數尾端,一直遇到「#」字(註A),才將整組字串變數傳回,如此相當於遙控器按出一組數字信號。

一組數字信號是由多個字元組成,在傳輸過程中難免發生錯誤,所以我們應該要檢查這組資料的正確性。藉由檢查資料長度以及資料內容,可以確立傳輸的資料是否正確。您可以仿效紅外線編碼格式,指定一個前導字符和結尾字符,然後把固定長度的資料夾在其中,例如

*27584#

「*」表前導字符
「#」表結尾字符
27584 表傳輸的資料,它的資料長度是 5 碼

另外,濾除多次重覆按鍵也是一個課題。

當我們可以正確用紅外線發出一串數字編碼之後,我們可以用它來做哪些應用呢? 建議您可以試著去做一個紅外線遙控器密碼鎖來玩玩。

註:
A. 使用其它按鍵也可以,例如「*」鍵。


後記

1. 紅外線接收器容易受環境光源干擾,因此應避免將紅外線遙控裝置使用於戶外。
2. 如果您使用這樣的遙控器在您家的客廳搖控自走車,您可能會發現電視節目自己胡亂跳台,很明顯地這樣的紅外線遙控會干擾電器設備,因此要審慎使用。自訂遙控器編碼,或許可以解決這樣的問題。


相關連結

IR receiver 1838 Datasheet https://arduino-info.wikispaces.com/file/view/IR-Receiver-AX-1838HS.pdf
找出紅外線遙控器的編碼 http://pizgchen.blogspot.tw/2016/11/blog-post_13.html


採購資訊

紅外線遙控器套件 http://goods.ruten.com.tw/item/show?21628077374704