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

ECG를 사용한 심장 박동 표시기

구성품 및 소모품

uECG 장치
× 1
Arduino Nano R3
× 1
Adafruit NeoPixel 링:WS2812 5050 RGB LED
× 1
리튬 이온 배터리 1000mAh
× 1

필요한 도구 및 기계

납땜 인두(일반)

이 프로젝트 정보

수년 동안 저는 제 심장 박동에 맞춰 깜박이는 LED로 무언가를 만들고 싶었습니다. 그것은 놀라울 정도로 어려운 것으로 밝혀졌고, 나는 몇 년 동안 시도했지만 실패했습니다. 하지만 더 이상은 아닙니다!

실제로 모든 무거운 작업은 uECG에 의해 수행됩니다. uECG는 오픈 소스이며 Arduino 친화적인 출력 핀(핀이 각 하트비트에 따라 높음/낮음이 됨)이 있는 소형 웨어러블 ECG 장치입니다. 이러한 핀 상태를 처리하는 것이 ECG 신호를 처리하는 것보다 훨씬 쉽고 최대한 활용하려고 했습니다.
UPD:무선 링크를 통해 데이터를 수신하는 이 프로젝트의 두 번째 반복을 확인하는 것이 좋습니다.

1. 회로도
여기서는 디지털 신호로만 작업하기 때문에 매우 간단합니다. 그러나 웨어러블 기기로서 대부분의 연결이 납땜이면 훨씬 더 안정적이고 더 작을 것입니다. 빠른 테스트를 위해서는 필요하지 않지만 일부 활동이 많을 때 착용할 예정이라면 적극 권장합니다.
회로도는 다음과 같습니다.

<울>
  • LED 링의 DI 핀은 핀 D11로 연결됩니다(코드에서 구성 가능).
  • uECG 장치의 DRV 핀은 핀 D3으로 연결됩니다(구성 가능).
  • 배터리의 +는 Arduino 5V 및 LED 링 5V 입력으로 연결됩니다.
  • 배터리 - Arduino GND로 이동, 링 GND 및 uECG의 GND
  • 저는 LiPo 배터리를 5V 입력으로 직접 사용했습니다. Vin에 연결하면 실수가 없습니다. 안정적으로 작동하지 않습니다(Vin의 전압 조정기는 전압 강하를 유발하므로 여기에서 절대 여유가 없습니다). 문제는 Arduino는 입력 전압이 3.4V 이하로 떨어지지 않는 한 안정적입니다. LiPo 배터리는 완전히 충전되었을 때 4.2V에서 시작하여 15% 미만의 충전량이 남아 있을 때만 3.4V에 도달합니다. 따라서 ~200mAh보다 큰 배터리를 사용하면 적절한 작동 시간을 얻을 수 있습니다. 그 외에 배터리는 커넥터를 통해 연결해야 하는 점 참고해주세요 :) 회로도에서 분리해서 가끔 충전을 하고 싶기 때문입니다.

    2. 코드
    프로그램은 간단한 방식으로 작동합니다. 지속적으로 D3 핀을 읽고 변경이 감지되면 해당 변경 시간을 20개 요소 배열로 푸시합니다. 첫 번째 요소와 마지막 요소의 차이를 20으로 나눈 값은 비트당 평균 시간(밀리초)입니다. 따라서 1분(60000밀리초)을 해당 숫자로 나누면 BPM 값이 나옵니다. 배열의 요소 수를 조정할 수 있습니다. 요소 수가 적을수록 응답은 빨라지지만 결과는 덜 안정적입니다(비트 감지에 문제가 있으면 계산된 BPM이 크게 증가함). 요소 수가 많을수록 데이터는 더 안정적이지만 BPM이 빠르게 변경되면 응답이 느려집니다.

    그런 다음 BPM은 색상(BPM이 낮음에서 높음으로 갈 때 파란색->녹색->노란색->분홍색->빨간색)으로 매핑되고 LED 수로 매핑됩니다. (스케일도 코드에서 조정 가능).

    #include 
    #ifdef __AVR__
    #include
    #endif
    // LED 링의 DI 핀
    #define PIN 11
    // 링의 픽셀 수
    #define NUMPIXELS 16
    // uECG 연결을 위한 입력 핀
    int in_pin =3;
    Adafruit_NeoPixel 픽셀 =Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
    void setup() {
    pixels.begin(); // NeoPixel 라이브러리를 초기화합니다.
    pinMode(in_pin, INPUT); //핀을 입력 모드로 설정
    digitalWrite(in_pin, 1); //enable PULLUP:이것은 중요합니다. uECG에는 내부 pull-up이 없습니다.
    }
    //BPM을 평균하기 위해 마지막 20개의 하트비트를 저장합니다.
    //값이 높을수록 더 안정적이겠지만
    //BPM이 변경되면 출력 변화를 확인하는 데 더 많은 시간이 걸립니다
    #define BEAT_HIST 20
    long beats[BEAT_HIST];
    void push_beat(long ms) //배열의 모든 비트를 이동하고 현재 비트를 삽입합니다.
    {
    for(int x =0; x {
    beats[x] =beats[x+1];
    }
    beats[BEAT_HIST-1] =ms;
    }
    int get_bpm() //첫 번째 비트와 마지막 비트 사이의 시간차 사용
    {
    긴 dt =비트[BEAT_HIST-1] - 비트[0];
    긴 bpm =BEAT_HIST * 60000 / dt;
    반환 bpm;
    }
    long last_pix_upd =0; // 이전에 픽셀을 업데이트한 시간을 추적하기 위해
    int prev_in_state =0; //입력 핀의 이전 상태:상태 변경만 처리하고 싶습니다.
    void loop()
    {
    long ms =millis();
    int in_state =digitalRead(in_pin ); //비트가 감지되지 않으면 1, 비트에서 0
    if(in_state ==1 &&prev_in_state ==0) //변화에만 반응
    {
    push_beat(ms);
    }
    prev_in_state =in_state;
    if(ms - last_pix_upd> 10) //픽셀을 너무 자주 업데이트하지 마십시오.
    {
    int r, g, b;
    last_pix_upd =ms;
    int bpm =get_bpm();
    int max_bright =120; //최대 밝기 값, 최대 255. 하지만 항상 최대 밝기를 원하는 것은 아닙니다. :)
    float dd =20; //색조 간의 BPM 변화(파랑->초록->노랑->분홍->빨강)
    float t1 =90, t2, t3, t4; //t1 - "기본" BPM, t1보다 낮으면 파란색
    t2 =t1 + dd;
    t3 =t2 + dd;
    t4 =t3 + dd;
    / /현재 t1...t4 범위에 따라 색상을 변경하는 코드
    if(bpm else if(bpm else if(bpm else if(bpm 그 외 {r =max_bright; g =0; b =0; }
    if(in_state) //비트가 아닐 때 강도의 1/4이므로 비트만 강조 표시됩니다.
    {
    r *=0.25;
    g *=0.25;
    b *=0.25;
    }
    int on_pixels =(bpm+5)/10; //사용된 LED 수:60 BPM의 경우 6개의 LED가 켜집니다. 120 - 12 등
    for(int i=0;i{
    if( i elsepixels.setPixelColor(i,pixels.Color(0,0,0)); //다른 모든 LED 끄기
    }
    pixels.show();
    }
    }

    3. 웨어러블로 조립
    아두이노를 링 내부에 배치하는 것이 편리합니다. 크기가 거의 완벽하게 일치합니다. 배터리도 근처에 맞습니다. uECG가 가슴에 위치한다는 것을 잊지 마십시오. 따라서 커넥터가 있는 와이어가 필요합니다. 먼저 와이어를 배치한 다음 다른 구성 요소가 있는 셔츠를 입은 다음 커넥터를 꽂습니다. 그렇지 않으면 그것을 입는 것이 정말 불편할 것입니다 - 저를 믿으십시오, 나는 시도했습니다))

    기본적으로 모든 것이 올바르게 수행되면 모든 커넥터를 연결한 후 30초 이내에 깜박이기 시작하고 BPM을 표시합니다.

    4. 현장 테스트
    걷고 달리면서 테스트한 결과, 달리는 동안 배터리가 ECG 센서 위로 튀어 나와 판독값이 왜곡된다는 것을 발견했습니다. 조금 옮겨보니 uECG와 Arduino를 연결하는 와이어가 너무 짧고 각 단계에서 ECG 센서를 당겨 판독 값이 다시 왜곡되는 것으로 나타났습니다. 전반적으로 걷기와 서 있을 때만 안정적인 비트를 얻었지만 달리기는 했지만 개선할 것이라고 생각합니다. 센서 자체는 다른 셔츠와 함께 사용했을 때 실행 중에도 BPM을 올바르게 표시했습니다(앱을 통해 확인).

    또한 가슴에 있는 LED는 멋져 보이지만 실제로는 쓸모가 없다는 것이 밝혀졌습니다. 맥박을 확인하기 위해 아래를 내려다보는 것은 정말 불편합니다. 다음 반복에서는 비트 대신 비트를 표시하는 일종의 손목 팔찌를 만들 생각입니다.

    추신 uECG 프로젝트에 관심이 있으시면 hackaday 페이지에서 확인할 수 있습니다. 많은 기술 세부 사항, PCB 설계, 토론 및 프로젝트 로그가 있습니다.

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • uECG_pixel_ring.ino
  • uECG_pixel_ring.ino아두이노
    #include #ifdef __AVR__ #include #endif// LED 링의 DI 핀#define PIN 11// 링의 픽셀 수#define NUMPIXELS 16// 입력 uECGint 연결용 핀 in_pin =3; Adafruit_NeoPixel 픽셀 =Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); 무효 설정() { pixel.begin(); // NeoPixel 라이브러리를 초기화합니다. 핀모드(in_pin, 입력); // 핀을 입력 모드로 설정 digitalWrite(in_pin, 1); //enable PULLUP:이것은 중요합니다. uECG에는 내부 pull-up이 없습니다.}//BPM을 평균하기 위해 마지막 20개의 하트비트를 저장합니다. // 값이 높을수록 더 안정적이게 됩니다. // 하지만 더 많은 시간이 소요됩니다. BPM이 변경될 때 출력 변경을 확인하는 시간#define BEAT_HIST 20long beats[BEAT_HIST];void push_beat(long ms) //배열의 모든 비트를 이동하고 현재 비트를 삽입{ for(int x =0; x  10) //픽셀을 너무 자주 업데이트하지 않음 { int r, g, b; last_pix_upd =ms; 정수 bpm =get_bpm(); int max_bright =120; //최대 밝기 값, 최대 255. 하지만 항상 최대 밝기를 원하는 것은 아닙니다. float dd =20; //색조 간의 BPM 변화(파란색->녹색->노란색->분홍색->빨간색) float t1 =90, t2, t3, t4; //t1 - "기본" BPM, t1보다 낮으면 파란색 t2 =t1 + dd; t3 =t2 + dd; t4 =t3 + dd; // 현재 t1...t4 범위에 따라 색상을 변경하는 코드 if(bpm   

    회로도


    제조공정

    1. 외부 제세동기
    2. 롤링 핀
    3. 인공 심장
    4. 인공 심장 판막
    5. Raspberry Pi를 사용한 모션 센서
    6. Raspberry Pi를 사용하여 집 온도 모니터링
    7. 원격 심박수 모니터
    8. 시스템은 스마트 스피커를 사용하여 심장 리듬의 비접촉 모니터링을 가능하게 합니다.
    9. 전자 문신으로 장기간 중단 없는 심장 모니터링 가능
    10. 너클 조인트 이해하기