Chương 3 đưa ra các phân tích cơ sở thiết kế Module đo và giám sát nhịp tim
- Yêu cầu của đề tài đặt ra là thiết kế một module xác định nhịp tim bằng đầu đo cảm biến gắn trên đầu ngón tay, đồng thời hiển thị các thông số đo được lên một giao diện trực quan được xây dựng trên phần mềm Processing của máy tính.
- Trình bày cụ thể về sơ đồ khối hệ thống, từ đó phân tích chỉ rõ nguyên lí hoạt động của hệ thông.
Chương 4. THỰC THI THIẾT KẾ MODULE ĐO VÀ GIÁM SÁT NHỊP TIM 4.1. Thiết kế phần cứng
Phần cứng gồm: Cảm biến nhịp tim (Pulse Sensor) và Arduino Uno R3, các chân của cảm biến được kết nối với vi điều khiển như sau: Chân dữ liệu, chân dương nguồn, chân nối đất của cảm biến lần lượt nối với chân Analog 0 (A0), VCC và GND của Arduino. Cable của Arduino được nối với cổng USB của máy tính.
4.2. Thiết kế phần mềm
Hình 4.2. Lưu đồ thuật toán chương trình điều khiển
Các tín hiệu xung của nhịp tim ở đầu ra PPG là sự biến đổi của điện áp (analog) có dạng sóng như hình:
Hình 4.3. Dạng sóng của nhịp tim
Xung từ cảm biến thay đổi tương đối trong cường độ ánh sáng. Nếu lượng ánh sáng thu được từ cảm biến vẫn không đổi, tín hiệu sẽ vẫn ở (hoặc gần) giá trị 512 (điểm giữa của dải ADC). Nếu ánh sáng nhiều hơn thì tín hiệu đi lên và ngược lại đối với ánh sáng ít. Ánh sáng từ đèn LED màu xanh lá cây được phản xạ trở lại với thay đổi trong mỗi xung.
Mục tiêu là đo khoảng thời gian giữa hai nhịp tim kế tiếp (khoảng thời gian giữa hai xung đỉnh), được gọi là Inter Beat Interval (IBI) dựa theo hình dạng và mô hình sóng PPG. Đề tài sẽ thực hiện đo IBI giữa các tín hiệu có biên độ sóng tăng lên vượt 50% tính từ thời điểm có sự thay đổi về độ lớn của xung.
Điều quan trọng để tính chính xác BPM là nghiên cứu về sự thay đổi của nhịp tim HRV và đo thời gian truyền xung PTT (Pulse Transit Time). BPM được xác định bằng cách tính trung bình của 10 giá trị IBI. Mỗi khi có 1 xung (nhịp tim) thì đèn Led nối vào chân 13 của Arduino Uno R3 sẽ chớp sáng tắt tương ứng.
Hình 4.4. Hình ảnh hiển thị trên giao diện phần mềm Processing
4.3. Kết quả nghiên cứu
Kết quả của đề tài thu được gồm : Các giá trị đo được của nhịp tim là BPM, IBI, Heart Rate Frequency (Hz), Power Spectral Density (PSD), LF vs HF (Low Frequency vs High Frequency), Phổ tần số, Phổ BPM, Phổ IBI, Beats, Hiệu năng HF, LF và dạng sóng HR sẽ được vi điều khiển Arduino Uno R3 thu nhận từ cảm
biến Pulse, tính toán và gửi dữ liệu ra cổng nối tiếp Serial. Chương trình trên Processing có nhiệm vụ đọc các giá trị này và hiện thị lên giao diện đồ họa trên máy tính.
Hình 4.6. Các giá trị và dạng phổ năng lượng của BPM, IBI, tần số HR
Hình 4.7. Các giá trị và phổ năng lượng của IBI Spectrum, LF, HF, Beats và LF vs HF Percentage
4.4. Đánh giá sai số
Tuy sản phẩm đã đạt được các yêu cầu về thiết kế nhưng trong quá trình vận hành và sử dụng vẫn còn một phần sai số do nhiều nguyên nhân gây ra. Các yếu tố ảnh hưởng đến kết quả đo bao gồm:
- Sai số do cảm biến: +-2%, ảnh hưởng của môi trường như nhiệt độ, độ ẩm... - Sai số trong quá trình đo như khi đo chúng ta có những cử động không ổn định làm thay đổi trạng thái của ngón tay cũng làm ảnh hưởng đến kết quả đo. - Trạng thái tâm lí lúc căng thẳng, lúc hồi hộp cũng là một trong những yếu tố ảnh hưởng đến phép đo.
Sau đây là quá trình kiểm định và đánh giá sai số thu được của sản phẩm so với những thiết bị khác của các hãng Apple và SamSung
4.5. Kết luận chương 4
Chương 4 trình bày việc thực thi thiết kế Module đo và giám sát nhịp tim
- Nêu ra được nguyên lí của phần cứng và có hình ảnh minh họa về phần cứng kết nối với máy tính.
- Có đầy đủ những hình ảnh mô phỏng chụp lại được từ giao diện phần mềm Processing, từ những hình ảnh thu được đó chúng ta có thể đánh giá được tình trạng sức khỏe nói chung và các thông số của nhịp tim nói riêng.
- Đánh giá các yếu tố ảnh hưởng đến sai số của phép đo và các hình ảnh so sánh với các sản phẩm đo nhịp tim của các hãng khác nhau.
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN
Về cơ bản báo cáo và sản phẩm đã đạt được những yêu cầu đặt ra của đề tài, đó là: Tìm hiểu cấu trúc, hoạt động của tim và tầm quan trọng của nhịp tim đối với sức khỏe con người. Giới thiệu các phương pháp đo nhịp tim phổ biến hiện nay và đề xuất phương án thiết kế. Tìm hiểu về các thông số của nhịp tim, cơ sở thu nhận tín hiệu điện tim. Phân tích cơ sở thiết kế và thực thi Module đo và giám sát các thông số về nhịp tim. Thiết kế một module xác định nhịp tim bằng đầu đo cảm biến gắn trên đầu ngón tay, đồng thời hiện thị các thông số đo được về nhịp tim như Beats Per Minute (BPM), Interbeat Intervals (IBI), Heart Rate Frequency (Hz), Power Spectral Density (PSD), LF vs HF (Low Frequency vs High Frequency), Phổ tần số, Phổ BPM, Phổ IBI, Beats, Hiệu năng HF, LF và dạng sóng HR lên một giao diện trực quan được xây dựng trên phần mềm Processing của máy tính.
Đề tài có thể được phát triển thêm khi có thể thu gọn lại kích thước sản phẩm (sử dụng vi điều khiển nhỏ hơn), các thông số về nhịp tim hiện thị trên màn hình LCD và đeo được hoặc có thể giám sát trên màn hình máy tính thông qua các Module không dây như Zigbee, giám sát từ xa qua ứng dụng trên điện thoại hay trên Websever.
TÀI LIỆU THAM KHẢO
[1] Kil-sang Yoo and Won-hyung Lee Chung-Ang University, “Metal stress assessment based on pulse photoplethysmogram,” International Symposium on Consumer Electronics IEEE 15th, 2011.
[2] “Heart rate variability Standards of measurement,” physiological interpretation, and clinical use Task Force of The European Society of Cardiology and The North American Society of Pacing and Electrophysiology (Membership of the Task Force listed in the Appendix), 1996.
[3] Yu-Hao Lee, Vincent Shieh Chih-Lung Lin and Yung-Jong Shiah, National Cheng Kung University - National Kaohsiung Normal University, “A stress evulation and personal relaxation system based on mesurment of photoplethysmography,” Second International Conference on Robot, Vision and Signal Processing, 2013.
[4] David Pereg, Rachel Gow, Morris Mosseri, Michael Lishner, Michael Rieder, Stan Van Uum, Gideon Koren “Hair cortisol and the risk for acute myocardial infarction in adult men,” Stress The International Journal on the Biology of Stress, 2010.
[5] John T. Ramshur, University of Memphis, Department of Biomedical Engineering, Memphis, TN, HRVAS: Heart Rate Variability Analysis Software, 2010.
[6] Xu xu, “Analysis on Mental Stress/Workload Using Heart Rate Variability and Galvanic Skin Response during Design Process,” A Thesis in the Concordia Institute for Information Systems Engineering, Concordia University Montreal, Quebec, Canada, April 2014.
[7] https://www.arduino.cc/ [8] http://arduino.vn/
[9] https://processing.org/ [10] http://pulsesensor.com/
PHỤ LỤC
I. Phần mềm phụ trợ
Vì Arduino IDE được viết trên Java nên cần phải cài đặt JRE trước Arduino IDE. Link: http://www.oracle.com/technetwork/java/javase/downloads/jre7-downloads- 1880261.html
2 bản JRE phổ biến nhất là bản dành cho Windows 32bit (x86) và Windows 64bit (x64) được đánh dấu trong hình. Chọn "Accept License Agreement".
Download JRE
Tiếp theo truy cập địa chỉ http://arduino.cc/en/Main/Software/ . Đây là nơi lưu trữ cũng như cập nhật các bản IDE của Arduino, để tải phiên bản phù hợp và mới nhất về máy tính.
Processing là một ngôn ngữ lập trình mã mở, thiết kế với mục đích lập trình đồ họa trên nhiều môi trường khác nhau: Linux, Window, Mac, Android, và cả Web. Ngôn ngữ được Casey Reas và Benjamin Fry của phòng thí nghiệm đa phương tiện đại học MIT sáng tạo, nên nó cũng thích hợp cho học tập, nghiên cứu những khái
niệm cơ sở của đồ họa máy tính. Dự án processing bắt đầu năm 2001, xây dựng trên ngôn ngữ Java, nhưng sử dụng cú pháp đơn giản hơn [9].
Gói processing có kèm theo sketchbook, một IDE nhỏ phụ trợ lập trình. Mỗi sketch trong Processing là một lớp con của lớp Java PApplet. Khi lập trình Processing, tất cả các lớp định nghĩa sẽ được xếp vào lớp bên trong (inner class) khi mã Processing dịch sang Java trước khi biên dịch. Do vậy nếu không viết mã trong chế độ thuần Java, mã Processing không thể dùng các biến/ hàm tĩnh. Processing cũng cho phép người dùng tạo các lớp riêng bên trong PApplet sketch. Điều này cho phép tạo và sử dụng các kiểu dữ liệu phức tạp, không hạn chế trong các kiểu dữ liệu chuẩn như int, char (ký tự), float (số thực), và color (RGB, ARGB, hex)…
Trình soạn thảo gồm 4 phần chính: Thanh công cụ; Phần chạy chương trình (debug); Ô soạn thảo mã (code); Phần thông báo/báo lỗi.
Thanh công cụ: chứa các công cụ giúp chỉnh sửa, cài đặt cho người dùng soạn thảo một cách dễ dàng, xuất ra file cuối, trợ giúp,…
Phần chạy chương trình: Sau khi soạn thảo xong chương trình một cách hoàn chỉnh(không có lỗi), tại đây bấm vào nút Debug để chạy chương trình, trình soạn thảo sẽ biên dịch và chạy chương trình.
Ô soạn thảo: Gồm các tab, trong tab gồm các dòng được đánh dấu cho người lập trình soạn thảo mã lên đó.
Phần thông báo/báo lỗi: phần này thông báo cho người lập trình biết phần nào đang sai, để chỉnh sửa. Thông báo này sẽ có kèm theo dòng, kí thứ bao nhiêu bị sai.
Các thông tin về hướng dẫn lập trình, download phần mềm có thể vào trang https://processing.org/ để tham khảo.
II. Mã chương trình nạp cho Arduino Uno R3
/* Chuong trinh chinh */ // Variables
int pulsePin = 0; // Chan du lieu (day tim cua cam bien Pulse ket noi voi chan analog 0 cua Arduino
int blinkPin = 13; // den led tren Arduino (chan 13) nhap nhay moi khi co nhip tim
int fadePin = 5; // pin to do fancy classy fading blink at each beat int fadeRate = 0;// used to fade LED on with PWM on fadePin
// Volatile Variables, su dung cho cac vong lap thuong xuyen gian doan
volatile int BPM; // bien giu nguyen gia tri tren Analog 0, cap nhat gia tri moi 2mS
volatile int Signal; // bien giu nguyen gia tri chua xu ly den volatile int IBI = 600; // bien giu khoang thoi gian giua cac nhip dap
volatile boolean Pulse = false; // "True" khi co nhip tim nguoi. "False" khi nguoi dung khong ket noi voi cam bien
volatile boolean QS = false; // bien se co gia tri “True” khi Arduino phat hien co nhip tim
// Truyen thong noi tiep dau ra
//static boolean serialVisual = false; // mac dinh lay gia tri “False” khi co gia tri tren man hinh Serial cua Arduino thi chuyen sang “True”
void setup(){
pinMode(blinkPin,OUTPUT); // led nhap nhay theo nhip tim pinMode(fadePin,OUTPUT); // led mo di theo moi nhip tim Serial.begin(115200); // toc do Baud 115200
interruptSetup();// Cai dat doc xung moi 2mS // analogReference(EXTERNAL); } // main void loop(){ serialOutput() ;
if (QS == true){ // Neu co nhip tim, BPM va IBI duoc xac dinh
fadeRate = 255; // Lay gia tri 255 de lam mo LED khi co xung serialOutputWhenBeatHappens(); // khi co nhip tim dua du
lieu toi dau ra noi tiep
QS = false; // thiet lap lai gia tri cho QS } ledFadeToBeat(); delay(25); } void ledFadeToBeat(){
fadeRate -= 15; // set LED fade value fadeRate = constrain(fadeRate,0,255); // keep LED fade value from going into negative numbers!
analogWrite(fadePin,fadeRate); // fade LED }
void serialOutput(){ // Output Serial.
sendDataToSerial('S', Signal); // goes to sendDataToSerial function
}
// Decides How To OutPut BPM and IBI Data void serialOutputWhenBeatHappens(){
sendDataToSerial('B',BPM); // send heart rate with a 'B' prefix
sendDataToSerial('Q',IBI); // send time between beats with a 'Q' prefix
}
// Sends Data to Pulse Sensor Processing App or Third-party Serial Readers.
void sendDataToSerial(char symbol, int data ){ Serial.print(symbol);
Serial.println(data); }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* Chuong trinh ngat*/
volatile int rate[10]; // array to hold last ten IBI values
volatile unsigned long sampleCounter = 0; // used to determine pulse timing
volatile unsigned long lastBeatTime = 0; // used to find IBI volatile int P =512; // used to find peak in pulse wave, seeded volatile int T = 512; // used to find trough in pulse wave, seeded volatile int thresh = 525; // used to find instant moment of heart beat, seeded
volatile int amp = 100; // used to hold amplitude of pulse waveform, seeded
volatile boolean firstBeat = true; // used to seed rate array so we startup with reasonable BPM
volatile boolean secondBeat = false; // used to seed rate array so we startup with reasonable BPM
void interruptSetup(){
// Initializes Timer2 to throw an interrupt every 2mS.
TCCR2A = 0x02; // DISABLE PWM ON DIGITAL PINS 3 AND 11, AND GO INTO CTC MODE
TCCR2B = 0x06; // DON'T FORCE COMPARE, 256 PRESCALER
OCR2A = 0X7C; // SET THE TOP OF THE COUNT TO 124 FOR 500Hz SAMPLE RATE
TIMSK2 = 0x02; // ENABLE INTERRUPT ON MATCH BETWEEN TIMER2 AND OCR2A
sei(); // MAKE SURE GLOBAL INTERRUPTS ARE ENABLED }
// THIS IS THE TIMER 2 INTERRUPT SERVICE ROUTINE.
// Timer 2 makes sure that we take a reading every 2 miliseconds ISR(TIMER2_COMPA_vect){ // triggered when Timer2 counts to 124
cli(); // disable interrupts while we do this
Signal = analogRead(pulsePin); // read the Pulse Sensor
sampleCounter += 2; // keep track of the time in mS with this variable
int N = sampleCounter - lastBeatTime; // monitor the time since the last beat to avoid noise
// find the peak and trough of the pulse wave
if(Signal < thresh && N > (IBI/5)*3){ // avoid dichrotic noise by waiting 3/5 of last IBI
T = Signal; // keep track of lowest point in pulse wave
} }
if(Signal > thresh && Signal > P){ // thresh condition helps avoid noise
P = Signal; // P is the peak
} // keep track of highest point in pulse wave
// NOW IT'S TIME TO LOOK FOR THE HEART BEAT
// signal surges up in value every time there is a pulse if (N > 250){ // avoid high frequency noise
if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) ){ Pulse = true; // set the Pulse
flag when we think there is a pulse
digitalWrite(blinkPin,HIGH); // turn on pin 13 LED
IBI = sampleCounter - lastBeatTime; // measure time between beats in mS
lastBeatTime = sampleCounter; // keep track of time for next pulse
if(secondBeat){ // if this is the second beat, if secondBeat == TRUE
secondBeat = false; // clear secondBeat flag for(int i=0; i<=9; i++){ // seed the running total to get a realisitic BPM at startup
rate[i] = IBI; }
}
if(firstBeat){ // if it's the first time we found a beat, if firstBeat == TRUE
firstBeat = false; // clear firstBeat flag