November 22, 2024

디바이스마트 미디어:

[66호] 원하는 색상으로 제어가 가능한 아두이노 IoT 스마트 무드등 키트 -

2021-06-25

★2021 ICT 융합 프로젝트 공모전 결과 발표! -

2021-05-12

디바이스마트 국내 온라인 유통사 유일 벨로다인 라이다 공급! -

2021-02-16

★총 상금 500만원 /2021 ICT 융합 프로젝트 공모전★ -

2021-01-18

디바이스마트 온라인 매거진 전자책(PDF)이 무료! -

2020-09-29

[61호]음성으로 제어하는 간접등 만들기 -

2020-08-26

디바이스마트 자체제작 코딩키트 ‘코딩 도담도담’ 출시 -

2020-08-10

GGM AC모터 대량등록! -

2020-07-10

[60호]초소형 레이더 MDR, 어떻게 제어하고 활용하나 -

2020-06-30

[60호]NANO 33 IoT보드를 활용한 블루투스 수평계 만들기 -

2020-06-30

라즈베리파이3가 드디어 출시!!! (Now Raspberry Pi 3 is Coming!!) -

2016-02-29

MoonWalker Actuator 판매개시!! -

2015-08-27

디바이스마트 레이저가공, 밀링, 선반, 라우터 등 커스텀서비스 견적요청 방법 설명동영상 입니다. -

2015-06-09

디바이스마트와 인텔®이 함께하는 IoT 경진대회! -

2015-05-19

드디어 adafruit도 디바이스마트에서 쉽고 저렴하게 !! -

2015-03-25

[29호] Intel Edison Review -

2015-03-10

Pololu 공식 Distributor 디바이스마트, Pololu 상품 판매 개시!! -

2015-03-09

[칩센]블루투스 전 제품 10%가격할인!! -

2015-02-02

[Arduino]Uno(R3) 구입시 37종 센서키트 할인이벤트!! -

2015-02-02

[M.A.I]Ahram_ISP_V1.5 60개 한정수량 할인이벤트!! -

2015-02-02

[64호]두근두근 원격 모니터링, Electro Cardio Gram

64 ICT 두근두근원격모니터링 (1)

ICT 융합 프로젝트 공모전 장려상

두근두근 원격 모니터링, Electro Cardio Gram

글 | 김창운

1. 심사평
칩센 심장질환으로 인한 질병이 발현하였을 때, 그에 대한 사전 또는 빠른 처치를 진행하기 위한 목적을 가진 작품임을 보고서 서두만으로도 충분히 알 수 있었습니다. 심사원인 저 또한 의료전문가가 아니라서 도출한 결론이 얼마나 의학적으로 명확한지는 알 수가 없습니다만, 분명한 목표와 방향을 가지고 최종 결과물까지 진행한 과정이 매우 훌륭합니다. 동영상과 보고서를 통하여 보여주는 심전도 Pulse 또한 병원 등에서 보았던 듯한 형태라 신기한 마음도 들었습니다.
펌테크 아이디어와 실용성, 상업성을 두루 갖춘 작품이라고 생각합니다. 전체적으로 세심하고 짜임새 있게 잘 구성이 되었다고 생각되며 기술적 구현도, 작품 완성도 등이 우수한 작품이라고 생각합니다.
위드로봇 심전도 신호는 측정하기가 어려운 분야인데, 노이즈를 잘 제거했습니다. 심박 신호로 응용예제까지 만들어 내면 더욱 좋겠습니다.

2. 작품 개요
이 프로젝트를 진행하기 전에 앞서서 제가 할 수 있는 범위 내에서 ‘코로나19 바이러스’와 같은 질병을 예방 할 수 있는 방법이 무엇일까? 고민해보았습니다. 바이러스처럼 사람의 목숨을 빼앗아 가는 ‘심장질환 문제’에 대해서 잠시 소개하자면, 심장은 우리 몸의 중심이 되며 가장 중요한 장기입니다. 또한, 가장 예민하다고 볼 수 있는 이 심장에서 심장 질환 문제 및 심혈관 질환 문제가 세계 10대 사망원인 중 1위를 차지하고 있습니다. 특히, 심장 질환은 기존에 고혈압이나 저혈압을 앓고 있었던 환자분들과 잦은 흡연, 스트레스 등과 함께하고 있는 바쁜 현대인들에게 많이 나타나고 있습니다.
또한, 건강한 사람들도 누워서 쉬고 있는 중에 갑자기 심장질환 문제가 종종 발생하고 있습니다. 심장이 멈춘 후로부터 4분 ~ 10분 안에 심장 충격이 들어가지 않으면 생존 확률은 희박합니다. 하지만, 119 응급대원 분들이 현장에 도착하기까지 평균시간이 8분이 넘는다고 합니다. 이처럼 이제는 가정에서도 원격 진료가 필요하다고 생각합니다.
물론, 의학 전문인이 아닌 일반인이 함부로 몸의 상태를 파악할 수도 파악해서도 안 되겠지만, 의심되는 환자분들이나 진료를 희망하시는 사람을 대상으로 가정에서도 실시간으로 심박 수를 미리 모니터링 하여 가까운 병원의 의료진분들과 119 응급대원 분들께 빠른 시간 내에 현 상황을 알려서 더 빠른 조치가 취해져야 한다고 생각합니다.

64 ICT 두근두근원격모니터링 (1)

64 ICT 두근두근원격모니터링 (2)

“Eletrocardiogram” 즉, 심전도는 심장을 전기로 기록하는 것을 의미합니다. 심전도 파형은 직류이며 단지 x축(가로 축)이 시간이 아닌 주파수이기 때문에 그림과 같은 파형이 나타나는 것을 볼 수 있습니다.
심장 수축 시 눈에 보이지 않는 미세한 생체 전기신호가 발생합니다. 뇌에서 전기신호가 근육으로 가면 근육은 수축하게 되는 원리를 이용하였습니다.
심장은 혈관, 근육, 전기신호, 판막 등과 함께 어우러져 기능을 하기 때문에 그 중 하나만 이상이 생겨도 심장질환이 발생하게 됩니다. 때문에, 원격으로 심장질환 문제를 모니터링 하여 질병을 예방하고자 하였습니다. 설계된 심전도 측정 회로를 통해 심전도 신호(=심근육 펄스 신호)를 측정하여 가까운 병원의 의료진분들과 119 응급대원 분들께 환자의 현 상황을 실시간으로 모니터링 할 수 있습니다. 또, 환자의 위험상태 근처 도달 시 위험 상황을 가까운 병원의 의료진분들과 119 응급대원 분들께 알릴 수 있습니다.
이 제품의 타겟 고객을 “혼자 거주하시고 생활 하시는 독거노인분”, “기존에 심장질환을 앓고 있는 의심 환자분” 등으로 선정하였습니다.

3. 작품설명
3.1. 사용매뉴얼

64 ICT 두근두근원격모니터링 (3)

1. 심전도 패드를 오른쪽 다리(오금), 양 팔꿈치 안쪽에 붙여 줍니다.
2. ISP의 USB를 PC나 스마트폰 충전기에 연결해서 +5V를 공급합니다.
3. “-5V 전원 스위치를 킨 후 -5V가 공급되는지” LED를 통해서 확인 할 수 있습니다.
4. “심전도 신호 검출”을 빨간색 LED를 통해서 확인할 수 있습니다.
5. “심전도 신호 검출”을 파란색 LED를 통해서 확인할 수 있습니다.
6. LCD에 BPM값이 표시되는 것을 확인한 뒤 스마트폰 어플에서 블루투스 연결 후 BPM이 표시 되는 것을 원격으로 확인할 수 있습니다.
7. 원격으로 심장 질환 유/무를 확인할 수 있습니다.

3.2. 앱 설치
3.2.1. 블루투스 초기 등록

64 ICT 두근두근원격모니터링 (4)

 

64 ICT 두근두근원격모니터링 (5)

HC-06 pincode : 1234

3.2.2. 블루투스 연결

64 ICT 두근두근원격모니터링 (6)

3.3. 전체적인 주요 시스템 구성

3.3.1. 심전도 신호 처리 회로

 

64 ICT 두근두근원격모니터링 (7)

64 ICT 두근두근원격모니터링 (8)

64 ICT 두근두근원격모니터링 (2)

3.3.2. 설계 알고리즘 : 플로우차트

64 ICT 두근두근원격모니터링 (9)

3.4. 주요 동작 및 특징(동작원리)
· INA128 소자의 입력으로써 -5V 전압이 필요하기 때문에 필요한 -5V 전압을 9V 사각전지와 LM7805 소자를 이용하여 만들어 낼 수 있습니다. INA128 소자는 주로 계측용 차분증폭을 할 때 사용 되는 차분 증폭기 모듈입니다. INA128 소자의 특징은 CMRR(공통모드제거비)으로써 두 개의 단자에 발생하는 잡음과 전송선로의 잡음을 없앨 수 있습니다. 따라서, 심전도 리드케이블로 얻어지는 생체 신호를 증폭하며 잡음을 없애기 위해서 INA128 소자가 꼭 필요하다고 생각하였습니다.
· 필터의 입력으로써 2개의 전압이 필요하기 때문에 외부전원 +5V 전압을 Rs232케이블을 통해 끌어옵니다.
· 최종 증폭된 신호 때 까지 주파수는 그대로 유지 되어야하며 단지 변하는 것은 전압범위입니다. 전극과 같은 역할을 하는 리드케이블로 심장 근육에 가는 전기신호를 읽어 들여서 노이즈 주파수만 걸러지고 심박 주파수는 그대로 있어야 측정할 수 있습니다. 심박 주파수에 잡음이 섞여 있기 때문에 심박 주파수를 기준으로 높거나 낮은 주파수를 필터를 통해서 걸러냅니다. HPF(고주파 성분만 통과) LPF(저주파 성분만 통과)
· LM324 소자를 통해서 증폭된 신호의 전압레벨이 5V 로 출력 됩니다.
· ATmega128(MCU)에 입력되기 위해서 저항 10[] 과 다이오드를 이용하여 0[V] 이하 전압은 0[V]로 만들어 주었습니다.
· 심전도 신호가 직접 LED로 확인 될 수 있게 해서 리드 케이블과 연결된 심전도 패드가 잘 부착 되어서 심전도 신호가 잘 입력되었는지 등을 확인 할 수 있습니다.
· 측정한 심전도 신호를 실시간으로 계속 전송하기 때문에 가까운 병원의 의료진분들과 119 구급대원분들이 가정 내에서 생활 하고 있는 환자분을 모니터링 할 수 있습니다.
· 측정한 심전도 신호 중 이상 신호가 발견 될 시 가까운 병원의 의료진분들과 119구급대원분들이 부저를 통해 응급상황을 빠르게 알 수 있습니다.

3.5. 개발환경
Code Vision AVR, Code Vision AVR, APP INVENTOR, 오실로스코프, 멀티미터

3.6. 재료

64 ICT 두근두근원격모니터링 (10) 64 ICT 두근두근원격모니터링 (11)

4. 단계별 제작 과정
심전도 측정 회로의 아날로그 신호를 ATmega128에서 획득한다.

64 ICT 두근두근원격모니터링 (12) 64 ICT 두근두근원격모니터링 (13) 64 ICT 두근두근원격모니터링 (14)

4.1. 전체 회로도

64 ICT 두근두근원격모니터링 (16)

 

64 ICT 두근두근원격모니터링 (17) 64 ICT 두근두근원격모니터링 (18) 64 ICT 두근두근원격모니터링 (19)

5. 소스코드
5.1. ATmega128 소스코드

#define F_CPU 16000000UL
#define sbi(PORTX,bitX) PORTX|=(1<<bitX)
#define cbi(PORTX,bitX) PORTX&=~(1<<bitX)

#include <mega128.h>
#include <delay.h>
#include <stdio.h>

void LCD_init(void);
void LCD_data(char data);
void LCD_command(char command);
void LCD_string(char line, char *string);
int Adc_Channel(char Adc_input);
void USART_Transmit(char data);
void USART_Transmit_int(int data);

char buf[16] = {‘ ‘,};
int adc_data = 0;
int cnt_ms = 0;
float cnt_s = 0.000;
float cnt_m = 0.000;
float cnt_data = 0.000;
float bpm = 0.000;
int bef_flag = 0;
int flag = 0;
int tick = 0;
int tick_flag = 0;

void main()
{
// io 핀 설정
DDRA = 0xFF;
DDRB = 0xFF;
DDRC = 0xFF;
PORTA = 0×00;
PORTB = 0×00;
PORTC = 0×00;

// ADC
ADMUX = 0×00;
ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);

// TIMER/COUNTER
TCCR0 = (1<<CS02)|(1<<CS00); // 128분주
TCNT0 = 256-125; // 125번 => 0.001s
TIMSK = (1<<TOIE0);

// UART
UCSR1A = 0×00;
UCSR1B = (1<<TXEN1);
UCSR1C = (1<<UCSZ11)|(1<<UCSZ10); //8bit
UBRR1H = 0;
UBRR1L = 103;

// LCD
LCD_init();
LCD_string(1,” BPM “);

#asm(“sei”)

// 동작 시작 부저 알림 “삡,삡”
sbi(PORTC,0);
delay_ms(100);
cbi(PORTC,0);
delay_ms(300);
sbi(PORTC,0);
delay_ms(100);
cbi(PORTC,0);

while(1)
{

adc_data = Adc_Channel(0);
bef_flag = flag;

if(adc_data > 500) // 기준치 보다 전압 신호 크면
{
sbi(PORTB,1);
flag = 1;
}

else
{
cbi(PORTB,1);
flag = 0;
}

if((bef_flag == 0) && (flag == 1)) // 기준치 보다 전압신호 높아지는 순간
{
cnt_data = (float)cnt_ms; // 카운트된 값 저장 . 심박 신호간 길이 (밀리초)
cnt_ms = 0;

cnt_s = cnt_data/1000; // 심박 신호간 길이 (초)
cnt_m = cnt_s/60; // 심박 신호간 길이 (분)
bpm = 1/cnt_m; // 분당 심박수 (주기와 주파수는 역수관계)
}

if(tick_flag == 1) // 2초에 한번 동작 하는 곳
{
//LCD 표시
sprintf(buf, ” %4d “,(int)bpm);
LCD_string(2,buf);

//블루투스 전송
USART_Transmit_int(bpm);
USART_Transmit(0);
//부저 동작
if ((bpm < 50) || (bpm > 180)) // 이상 BPM
{
sbi(PORTC,0);
USART_Transmit(‘ ‘);
USART_Transmit(‘W’);
USART_Transmit(‘A’);
USART_Transmit(‘R’);
USART_Transmit(‘N’);

USART_Transmit(‘ ‘);
USART_Transmit(‘S’);
USART_Transmit(‘T’);
USART_Transmit(‘A’);
USART_Transmit(‘T’);
USART_Transmit(‘E’);
}
else
cbi(PORTC,0);

tick_flag = 0;
}
}
}

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
cnt_ms ++; // 0.001s 1씩 증가

tick ++;
if(tick >= 2000)
{
tick = 0;
tick_flag = 1;
}

TCNT0 = 256-125;
}

int Adc_Channel(char Adc_input)
{
ADMUX = 0b01000000 | Adc_input;
ADCSRA |= 0×40;
while((ADCSRA & 0×10) == 0);
return ADCW;
}

void LCD_command(char command)
{
PORTA = (command&0xF0); // send High data
cbi(PORTA,0); // RS=0
//cbi(PORTA,1); // RW=0
sbi(PORTA,2); // Enable
delay_us(1);
cbi(PORTA,2); // Disable

PORTA = (command&0x0F)<<4; // send Low data
cbi(PORTA,0); // RS=0
//cbi(PORTA,1); // RW=0
sbi(PORTA,2); // Enable
delay_us(1);
cbi(PORTA,2); // Disable
}

void LCD_data(char data)
{
delay_us(100);

PORTA = (data&0xF0); // send High data
sbi(PORTA,0); // RS=1
//cbi(PORTA,1); // RW=0
sbi(PORTA,2); // Enable
delay_us(1);
cbi(PORTA,2); // Disable

PORTA = (data&0x0F)<<4; // send Low data
sbi(PORTA,0); // RS=1
//cbi(PORTA,1); // RW=0
sbi(PORTA,2); // Enable
delay_us(1);
cbi(PORTA,2); // Disable
}

void LCD_init(void)
{
delay_ms(50);

LCD_command(0×28); // DL=0(4bit) N=1(2Line) F=0(5×7)
delay_ms(2); // [function set] 0b00101000
// 4:(DL) 1이면 8bit모드, 0이면 4bit모드
// 3:(N) 0이면 1줄짜리, 1이면 2줄짜리
// 2:(F) 0이면 5x8dots, 1이면 5x11dots

LCD_command(0x0C); // LCD ON, Cursor X, Blink X
delay_ms(2); // [display on/off control] 0b00001100
// 2:(D) 1이면 display on, 0이면 off
// 1:(C) 1이면 cursor on, 0이면 off
// 0:(B) 1이면 cursor blink, 0이면 off

LCD_command(0×06); // Entry Mode
delay_ms(2); // [entry mode set] 0b00000110
// 1:(I/D) 1이면 오른쪽으로, 0이면 왼쪽
// 0:(SH) CGRAM 사용관련

LCD_command(0×01); // LCD Clear
delay_ms(2);
}
void LCD_string(char line, char *string)
{
LCD_command(0×80+((line-1)*0×40));
while(*string)
LCD_data(*string++);
}

void USART_Transmit(char data)
{
while(!(UCSR1A & 0×20));
UDR1 = data;
}

void USART_Transmit_int(int data)
{
int temp;

if(data < 10)
{
temp = data;
USART_Transmit(temp+48);
}
else if(data < 100)
{
temp = data/10;
USART_Transmit(temp+48);
temp = (data%10)/1;
USART_Transmit(temp+48);
}
else if(data < 1000)
{
temp = (data%1000)/100;
USART_Transmit(temp+48);
temp = (data%100)/10;
USART_Transmit(temp+48);
temp = (data%10)/1;
USART_Transmit(temp+48);
}
else
{
temp = data/1000;
USART_Transmit(temp+48);
temp = (data%1000)/100;
USART_Transmit(temp+48);
temp = (data%100)/10;
USART_Transmit(temp+48);
temp = (data%10)/1;
USART_Transmit(temp+48);
}
}

5.2. 앱인벤터 코드 

64 ICT 두근두근원격모니터링 (20) 64 ICT 두근두근원격모니터링 (21)

6. 참고문헌
· 윤성우 “열혈 C++ 프로그래밍” (오렌지미디어 2010)
· 천정아 “개념을 콕콕 잡아주는 C 프로그래밍” (이한출판사 2009)
· 윤덕용 “ AVR ATMEGA128A 바이블 ” (OHM사 2007)
· 이재창 “ AVR ATmega128 제어 ” (21세기사 2017)
· 필터(Filter)관련 참고자료 : https://blog.naver.com/ojh3110/221647169821, https://blog.naver.com/racoonjonny/221619139911
· 관련 기사문 참고자료 : https://www.hankyung.com/society/article/202003264188i
· 의학용어 관련 참고자료 : https://www.youtube.com/watch?v=4Ddb1bclk1c, https://www.youtube.com/watch?v=vdNoT-159dQ

6.1. 응용분야
전극(패드)을 조금 더 추가 사용하여 차량 내부 시스템 등에 사용 할 수 있는 활용 범위가 높은 제품입니다.

64 ICT 두근두근원격모니터링 (22)

 

 

 

 

Leave A Comment

*