산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

감광기로 심박수 감지

구성품 및 소모품

Digilent OpenScope MZ
× 1
Arduino UNO
× 1
Texas Instruments 범용 쿼드 연산 증폭기
× 1
Texas Instruments 고속 단일 비교기
× 1
다회전 정밀 전위차계- 10k 옴(25회전)
× 2
단일 회전 전위차계 - 100,000옴
다회전 전위차계를 사용할 수 있다면 조정하기가 더 쉬울 것입니다.
× 1
단일 회전 전위차계 - 10k 옴
× 1
커패시터 100μF
× 1
커패시터 100nF
× 1
저항 10k 옴
또는 단일 20k
× 2
저항 4.75k 옴
× 1
저항 82k 옴
100k 전위차계 중 2개를 가져와 하나를 82k로 설정할 수도 있습니다.
× 1

앱 및 온라인 서비스

Arduino IDE
Digilent WaveForms 라이브

이 프로젝트 정보

소개

이 프로젝트는 CapitanoRed가 게시한 YouTube 동영상에서 영감을 받았습니다. , 저자는 오실로스코프에 표시할 포토레지스터 기반 심박수 모니터를 만들었습니다. 그들의 비디오를 본 후 프로젝트를 복제하고 Arduino를 추가하여 심박수를 계산하고 표시하고 싶었습니다. 그렇게 하면 오실로스코프의 파형을 보면서 심박수를 읽을 수 있습니다.

심장이 수축하여 몸 전체에 혈액을 밀어 넣으면 혈압의 순간적인 변동을 감지할 수 있습니다. 이것이 우리가 맥박을 느낄 수 있는 이유입니다. 피부와 살이 충분히 얇은 신체 부위에서 이러한 펄스는 통과하는 빛의 미세한 변화에서 감지할 수 있습니다. 우리의 눈은 우리 몸을 통과하는 빛을 볼 만큼 민감하지 않지만 변동은 말할 것도 없고 포토레지스터는 이 수준의 감도를 가지고 있습니다.

포토레지스터는 떨어지는 빛의 강도에 따라 저항이 달라집니다. 저항의 변화는 조명 강도의 미묘한 변화에 대해 아주 작을 수 있지만 몇 개의 연산 증폭기 IC를 사용하여 증폭할 수 있습니다.

작동 원리

아래 다이어그램은 회로도와 이 프로젝트에 사용된 브레드보드를 ​​보여줍니다.

포토레지스터는 20kΩ 저항이 있는 전압 분배기에 있습니다. 즉, 저항의 빛의 양이 증가함에 따라 분배기의 전압도 증가합니다. 첫 번째 연산 증폭기(위 이미지의 "Amp1")는 전압 분배기의 필터 역할을 하여 신호에서 고주파 노이즈를 제거합니다. 두 번째 연산 증폭기("Amp2")는 필터를 통해 들어오는 신호를 최대화하도록 설정된 반전 증폭기 역할을 합니다. 세 번째 연산 증폭기("Amp3")는 신호를 2.5V에 집중시키는 가상 접지를 설정합니다. 이렇게 하면 연산 증폭기가 0V ~ 5V에서 최대 신호 스윙을 제공할 수 있습니다. 필터링 및 증폭된 신호는 다음과 같습니다.

Arduino가 심박수를 측정할 수 있도록 하려면 신호가 비교기(회로도에서 "Cmp")를 통과해야 합니다. 비교기는 높거나 낮은 신호를 출력하도록 설계된 특수 연산 증폭기입니다. 양극 입력의 전압이 음극 입력보다 크면 비교기는 하이를 출력하고 양극 입력의 전압이 음극 입력보다 작으면 비교기는 로우를 출력합니다. 가장 기본적인 구성에서 비교기는 임계값 감지기 역할을 하여 측정된 전압이 임계값보다 높거나 낮을 때 신호를 보냅니다. 비교기는 하이(5V) 또는 로우(0V)를 출력하므로 Arduino의 디지털 핀과의 인터페이스에 적합합니다.

연산 증폭기에서 나오는 신호의 이미지를 자세히 살펴보면 전압이 떨어지기 전에 2차 펄스가 있음을 알 수 있습니다(이것을 dicrotic notch라고 함). 또한 신호에 상당한 양의 노이즈가 있습니다. 이 두 가지 사실은 기본 비교기 구성이 펄스를 적절하게 감지할 수 없다는 것을 의미합니다. 모든 심장 박동에 대해 단일 사각 펄스 대신 비교기가 여러 펄스를 생성합니다. 이것은 잡음으로 인해 신호가 상향 및 하향 스윙에서 임계값을 여러 번 교차하게 하기 때문에 발생하며 임계값이 설정된 위치에 따라 가능한 이중 노치 중에도 발생합니다. 이렇게 하면 Arduino가 실제로 존재하는 것보다 더 많은 펄스를 계산하게 됩니다.

잡음이 있는 신호는 히스테리시스를 사용하여 처리할 수 있습니다. 이 문서 Texas Instruments의 히스테리시스가 있는 신호 컨디셔닝 주제에 대한 훌륭한 토론을 제공하고 신호 노이즈가 비교기 성능에 미치는 영향과 이러한 문제를 처리하는 방법을 보여줍니다. 나는 이 프로젝트를 위한 비대칭 비교기를 설계하기 위해 그들의 회로도와 파생 방정식(각각 문서의 5페이지와 7페이지)을 사용했습니다. 전반적인 아이디어는 출력의 피드백 루프가 양의 입력에서 전압을 변경한다는 것입니다. 즉, 로우에서 하이로 이동하는 임계값은 하이에서 로우로 이동하는 임계값과 다릅니다. 이것이 심장 펄스의 맥락에서 의미하는 바는 비교기가 업스윙의 한 지점에서 트리거되도록 설정될 수 있고 그런 다음 다운스윙의 다른 지점에서 트리거되도록 설정할 수 있다는 것입니다. 이런 식으로 Arduino는 아래와 같이 각 하트비트에 대해 단일 사각 펄스를 볼 수 있습니다.

포토레지스터 준비

투명 열 수축과 같은 포토레지스터에 투명 덮개를 사용하는 것이 좋습니다. 최소한 리드가 피부에 닿지 않도록 완전히 덮어야 합니다. 신체에서 생성된 전압은 광저항기가 맥박을 감지할 때 생성하는 범위 내에 있으므로 피부에 접촉하면 결과가 왜곡될 수 있습니다.

심박수 모니터 조정

회로도(R7)의 전위차계의 경우 단일 회전 전위차계를 사용하고 포화 상태가 되지 않고 연산 증폭기의 이득을 최대화하도록 조정합니다. 전위차계의 한쪽을 약 375Ω으로 설정하고 필터("Amp1")를 이쪽에 연결하여 시작합니다. 이 양의 이득은 WaveForms Live에서 볼 수 있을 만큼 충분한 펄스를 생성해야 합니다. 다음 섹션("WaveForms Live에서 펄스 보기")의 단계를 따르고 펄스를 성공적으로 확인한 후 필요한 경우 게인을 변경할 수 있습니다. 필터 측 저항을 더 작게 만들기 위해 전위차계를 돌려 펄스 진폭을 높입니다. 진폭이 이미 너무 커서 클리핑을 일으키는 경우 필터 측 저항을 더 크게 만드십시오. 다음 이미지의 캡션을 읽고 바람직한 신호가 어떤 모습인지 결정하십시오.

비교기의 임계값을 정확하게 설정하려면 저항 R3 및 R4에 다중 회전 전위차계를 사용하는 것이 좋습니다. 저항 R5는 정확하게 측정되는 한 10-100kΩ 범위의 모든 저항이 될 수 있습니다. 첨부 섹션의 스프레드시트를 사용하여 측정된 R5 값과 임계 전압을 기반으로 R3 및 R4를 설정할 값을 결정할 수 있습니다. 임계값 "Vl" 및 "Vh"는 오실로스코프를 통해 볼 펄스를 기반으로 변경해야 합니다("비교기 임계값 설정" 섹션 참조).

저항 R8 및 R9는 하나의 전위차계로 교체할 수 있으며 중간 핀은 연산 증폭기의 양의 입력에 연결됩니다. 이렇게 하면 일치하는 저항을 찾을 필요 없이 가상 접지를 쉽게 조정할 수 있습니다. 출력을 2.5V로 조정하면서 전압계 또는 OpenScope를 사용합니다.

WaveForms Live에서 펄스 보기

WaveForms Live를 통해 심장 박동을 보려면 메뉴에서 일부 설정을 변경해야 합니다. 기본적으로 출력은 확장되어 해석하기 어렵거나 업데이트 속도가 매우 느려 깨끗한 펄스를 생성하기 위해 포토레지스터 그립을 조정하기가 어렵습니다.

OpenScope 오실로스코프 채널 2(파란색 와이어)를 "Amp2"의 출력에 연결하고 접지 와이어가 브레드보드의 접지에 연결되어 있는지 확인합니다. WaveForms Live에서 시간 변경 "1" 및 트리거 메뉴 끄기 누르기 단추. Osc Ch 1 모두 및 Osc Ch2 메뉴 세트 오프셋 2.5V 및 샘플 옆 자물쇠 아이콘을 클릭하고 사용 가능한 필드에 "1000"을 입력하십시오. 이렇게 하면 신호가 해석하기 쉬운 시간 척도에 나타나게 되지만 기본적으로 발생하는 것보다 업데이트가 더 자주 발생합니다. 화면은 약 4초마다 업데이트되어야 합니다. 그래도 너무 느리면 샘플을 늘릴 수 있습니다. 값이지만 신호의 더 짧은 스니펫을 희생해야 합니다("2000"은 한 번에 약 하나의 하트비트를 캡처함).

실행을 누릅니다. 버튼을 누르고 포토레지스터에 손가락을 대고 맥박을 잰다. 일관된 결과를 얻으려면 가장 좋은 방법을 찾아야 합니다. 시스템은 압력 변화에 매우 민감하므로 손가락을 매우 움직이지 않게 유지하는 방법을 찾아야 합니다. 나는 내 맥박을 재기에 가장 좋은 곳이 검지 손가락의 첫 번째 관절이라는 것을 알았다. 자신을 훈련하는 데는 약간의 시간이 걸리지만 결국에는 최상의 방법을 찾을 수 있을 것입니다. 맥박이 너무 작게 보이면 이전 섹션("심박수 모니터 조정")의 첫 번째 단락에 설명된 대로 전위차계를 조정하십시오.

비교기 임계값 설정

신호가 오실로스코프에 표시되면 비교기가 Arduino를 트리거하고 신호를 보내는 임계값을 설정해야 합니다. 대표 파형을 가져오고 캡처를 중지하여 디스플레이에 파형을 유지합니다. 화면 하단에서 CURSORS를 누릅니다. 단추. 유형 아래 "Voltage"를 선택하고 CursorChannels를 모두 설정합니다. "Osc 2"로. 두 개의 수평 파선이 디스플레이에 나타납니다. 왼쪽에 있는 삼각형을 드래그하여 이동합니다. 펄스의 피크 근처 지점에 라인 중 하나를 설정하고 dicrotic 노치 아래 지점에 다른 라인을 설정합니다. 화면 하단을 보고 괄호 안에 표시된 두 전압을 기록합니다. 끝에 첨부된 스프레드시트의 임계값 전압 "Vl" 및 "Vh"로 이 값을 입력합니다. 작은 값은 "Vl"이고 큰 값은 "Vh"입니다. 이 값과 선택한 저항 R5 값을 기반으로 스프레드시트가 계산하는 전위차계 R3 및 R4 값을 설정합니다.

비교기가 설정되면 "포토레지스터 준비" 섹션 이전과 유사한 신호를 출력하기 시작해야 합니다.

Arduino 코드

Arduino 코드는 주파수 카운터와 분당 심박수를 계산하는 방법으로 구성됩니다. 주파수 카운터는 비교기에서 오는 펄스의 폭을 고려하고 200밀리초 미만 또는 800밀리초 초과를 거부합니다. 이렇게 하면 포토레지스터가 측정에 사용되지 않고 비교기가 높거나 낮거나 두 상태 사이를 빠르게 전환할 수 있을 때 잘못된 데이터가 표시되는 것을 방지할 수 있습니다. 이 코드는 우발적인 움직임으로 인한 신호 노이즈로 인해 놓친 맥박을 걸러내기 위해 이전 15초 동안의 평균 심박수를 유지합니다.

향후 개선 사항

이 프로젝트의 주요 단점은 펄스가 사용 간에 동일한 진폭이 되도록 포토레지스터를 유지하기 어렵다는 것입니다. 센서는 펄스 감지를 위해 주변광에 의존하기 때문에 하루 종일 조도를 변경하면 다른 결과가 발생할 수 있습니다. 흐린 날에는 비교기 임계값이 너무 넓고 밝은 날에는 dicrotic notch가 매우 뚜렷하여 잘못된 펄스 감지를 유발할 수 있음을 알아차렸습니다. 또한 실내의 움직임으로 인한 미세한 빛 변화도 포토레지스터로 감지할 수 있습니다. 일관성 문제는 몇 가지 다른 방법으로 해결할 수 있습니다.

센서 시스템은 일관된 빛을 제공하기 위해 LED를 포함할 수 있습니다. 이는 진료실에서 사용하는 심장 모니터링 클립이나 휴대폰에서 볼 수 있는 심장 박동 모니터와 유사합니다. 다른 쪽의 포토레지스터로 빨간색 LED를 손가락 위쪽에 대고 시도했습니다. 결과는 고무적이었으므로 좋은 인클로저가 만들어질 수 있다면 이것은 아마도 실행 가능한 옵션일 것입니다.

소프트웨어 측면에서 잠재적인 솔루션은 Arduino에서 자동 범위 알고리즘을 사용하는 것입니다. 펄스를 감지하고 피크와 저점을 찾습니다. 그러나 이것은 심박수 측정을 수행하기에 충분하지 않습니다. 적절한 주파수 카운터에는 인터럽트가 필요합니다. 인터럽트가 없으면 Arduino의 프로세서는 입력 핀을 확인하고 펄스를 놓치는 것 외에 다른 작업을 수행할 수 있습니다. 인터럽트는 디지털 핀에서만 사용할 수 있으므로 자동 범위를 구현하는 가장 좋은 방법은 디지털 전위차계를 사용하는 것입니다. Arduino는 아날로그 핀을 사용하여 펄스가 나타나는 범위를 찾고, 비교기 임계값을 결정하고, 디지털 전위차계를 통해 적용한 다음, 비교기의 디지털 신호를 사용하여 주파수 카운트를 수행합니다. <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • 비교기 calcs.xlsx
  • Arduino 심박수 카운터
  • 비교기 calcs.xlsxArduino
    이 Excel 스프레드시트는 R3 및 R4 값을 계산하여 비교기에 대한 비대칭 임계값을 설정합니다. R5 열을 측정된 저항 값으로 변경할 수 있습니다. Vl 및 Vh는 심박수에서 깨끗한 맥박을 얻기 위해 필요한 임계값으로 변경해야 합니다.
    미리보기 없음(다운로드만 가능).
    Arduino 심박수 카운터Arduino
    이 코드는 비교기가 보낸 펄스를 기반으로 심박수를 계산합니다.
    #define INT0 3float frequency;long timeCount;int counter;long pulseStart;int inputPin =3;boolean low;float freqAvg;float total;void setup() { attachInterrupt(digitalPinToInterrupt(INT0), 방해, 변경); 카운터 =0; timeCount =0; 주파수 =0; 낮음 =거짓; Serial.begin(9600); 총 =15;} 무효 루프() { timeCount =millis(); while(millis() - timeCount <5000){ 빈도 =카운터; } if(주파수> 3){ 총 +=빈도; 총계 -=freqAvg; freqAvg =총/3; } 쇼HR(); 카운터 =0;}무효 침입(){ if(digitalRead(3) ==0){ fallDetect(); 낮음 =사실; } else if(digitalRead(3) ==1){ widthCheck(); }}void fallDetect(){ pulseStart =millis();}void widthCheck(){ long pulseEnd =millis(); if((펄스 종료 - 펄스 시작> 200) &&(펄스 종료 - 펄스 시작 <800) &&낮음){ 카운터++; 낮음 =거짓; }}void showHR(){ Serial.print("심박수 ="); Serial.println(freqAvg * 12); }

    회로도

    hr_monitor_tnffXlVQQV.fzz

    제조공정

    1. 외부 제세동기
    2. 인공 심장
    3. 인공 심장 판막
    4. EKG 기계
    5. Raspberry Pi로 번개 감지
    6. Windows 10 IoT Core – 심박수 펄스 읽기
    7. 원격 심박수 모니터
    8. 단일 원자핵의 자기 검출
    9. 의류에 통합된 센서는 심박수를 모니터합니다.
    10. 심장 건강은 기름이 없는 압축 공기로 시작됩니다.