메이커 Maker

환자 치료를 돕는 AI 링거걸이

지구빵집 2022. 1. 21. 09:49
반응형

 

 

작품 제안을 한 학생이 병원에 입원했을 때 링거걸이를 사용하면서 불편했던 점을 개선하기 위해 고안한 프로젝트였다. 링거걸이도 30년 동안 변하지 않았다. 한 손으로 잡아 끌거나, 화장실갈 때, 다른 손으로 무엇인가 할 때도 불편하다. 아주 창의적인 아이디어고 개선이 이루어져야 할 의료 분야다. 환자가 링거걸이을 사용할 때 양손이 자유롭고, 사용자와 함께 이동하고, 여분의 수납함이 있는 링거걸이를 만들기 위한 작품이다. 학생들이 한 학기 작업한 결과물이 단순히 작업하고 나서 사라지는 일은 아쉬운 일이라서 아래 전체 팀 프로젝트 리스트를 소개한다. 참고하세요. 

 

 

1조 의료 폐기물 수거 로봇

2조 자기야 선물~ 디자인 인테리어 무드등

3조 미니약국

4조 음주 측정 킥보드

5조 만능 스탠드

6조 분실 방지 선반

7조 마음까지 따뜻해지는 난로

8조 금연 카메라

9조 스마트 세탁기

10조 감염병 예방 음성인식 자판기

11조 환자 치료를 돕는 AI 링거걸이

12조 방충망 청소 로봇

13조 인체 감지 세이프 헬멧

 

환자 치료를 돕는 AI 링거걸이 

 

환자 치료를 돕는 AI 링거걸이 개요 환자 치료를 돕는 AI 링거걸이는 거동이 불편한 환자들을 스스로 따라다니며 남은 수액의 양을 간호사에게 전송하고, 기존의 수납공간과 같은 여러 결함을 보완한 장치입니다. 본 문서에서는 주로 장치의 구성과 각 센서 Test 방법, 동작 코드를 설명합니다. 인쇄장비 데이터 수집 전송장치의 블럭도는 아래와 같습니다. 

 

환자 치료를 돕는 AI 링거걸이 부품 구성도

 

환자의 수액의 잔량을 측정하고 간호사가 이를 수치로 쉽게 확인할 수 있도록, 압력센서와 Nextion 디스플레이를 사용합니다. 또한 거동이 불편한 환자가 링거걸이를 끌고 다니는 것이 불편하기에 pixy 캠이 환자를 추적하고 DC모터를 이용해 환자를 스스로 따라갈 수 있도록 합니다. 

 

 

 

전체 코드

 

#include <Pixy2I2C.h>

Pixy2I2C pixy;

int kp = 2;
int ki= 1;
int kd = 0.4;

int IN1 = 40;
int IN2 = 38;
int IN3 = 42;
int IN4 = 44;

int ENA = 36;
int ENB = 46;

int enp_a = 24;
int enp_b = 25;
int enp_c = 26;
int enp_d = 27;

int count_a = 0;
int count_b = 0;    

int v;
float vv;
float pre_err,pre_err2 = 0;
int ref, ref2;

hw_timer_t * timer = NULL;
volatile boolean t = false;
void IRAM_ATTR onTimer() {
  t = true;
}

void setup() {
  pinMode(IN1,OUTPUT);
  pinMode(IN2,OUTPUT);
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
  pinMode(enp_a,INPUT_PULLUP);
  pinMode(enp_b,INPUT_PULLUP);  
  pinMode(enp_c,INPUT_PULLUP);
  pinMode(enp_d,INPUT_PULLUP);  
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(enp_a),counting_a,CHANGE);
  attachInterrupt(digitalPinToInterrupt(enp_c),counting_c,CHANGE);
  timer = timerBegin(0, 80, true);  //division 80=1Mhz
  timerAttachInterrupt(timer, &onTimer, true);
  timerAlarmWrite(timer, 10000, true); 
  timerAlarmEnable(timer);
  Serial.begin(115200);
 
  Serial.print("Starting...\n");
  
  pixy.init();
}

void counting_a() {
  int p_a = digitalRead(enp_a); 
  int p_b = digitalRead(enp_b);
  if(p_a == p_b) count_a--;
  if(p_a != p_b) count_a++;
}
void counting_c() {
  int p_c = digitalRead(enp_c); 
  int p_d = digitalRead(enp_d);
  if(p_c == p_d) count_b--;
  if(p_c != p_d) count_b++;
}
void check_v() {
  v = (int)0.395*(count-count_a);
  count_a=count;
}
void check_vv() {
  vv = (int)0.395*(countt-count_b);
  count_b=countt;
}
int go() {
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,HIGH);
  digitalWrite(IN3,LOW);
  digitalWrite(IN4,HIGH);
  ref = 397;
}
int turn_left() {
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,HIGH);
  digitalWrite(IN3,HIGH);
  digitalWrite(IN4,LOW);
  ref = 397;
  ref2 = 397;
}
int turn_right() {
  digitalWrite(IN1,HIGH);
  digitalWrite(IN2,LOW);
  digitalWrite(IN3,LOW);
  digitalWrite(IN4,HIGH);
  ref = 397;
  ref2 = 397;
}
int go_back() {
  digitalWrite(IN1,HIGH);
  digitalWrite(IN2,LOW);
  digitalWrite(IN3,HIGH);
  digitalWrite(IN4,LOW);
  ref = 397;
  ref2 = 397;
}
void loop() {
 
  int i;
  if(t)
    {
      float err = ref - v;
      float err2 = ref2 - vv;
      sum_err += err;
      sum_err2 += err2;
      int duty = (int)(kp*err+ki*sum_err+kd*(err-pre_err));
      int duty2 = (int)(kp*err2+ki*sum_err2+kd*(err2-pre_err2));
      pre_err = err;
      pre_err2 = err2;

      ma(duty);
      mb(duty2);
      t = false;
    }
  pixy.ccc.getBlocks();
  if (pixy.ccc.numBlocks)
  {
    Serial.print("Detected ");
    pixy.ccc.blocks[i].print();
    if(pixy.ccc.blocks[i].m_x > 178)  {  
      while(pixy.ccc.blocks[i].m_x > 168) {
        pixy.ccc.getBlocks();
        pixy.ccc.blocks[i].print();
        turn_right();
      }
    }
    else if(pixy.ccc.blocks[i].m_x < 138) {
      while(pixy.ccc.blocks[i].m_x < 148) 
      {
        pixy.ccc.getBlocks();
        pixy.ccc.blocks[i].print();
        turn_left();
      }
    }
    else {
      if(pixy.ccc.blocks[i].m_y > 104+20) {
        while(pixy.ccc.blocks[i].m_y > 114) {
          pixy.ccc.getBlocks();
          pixy.ccc.blocks[i].print();
          go();
        }
      }
      else if(pixy.ccc.blocks[i].m_y < 104-20)  {
        while(pixy.ccc.blocks[i].m_y < 94) {
          pixy.ccc.getBlocks();
          pixy.ccc.blocks[i].print();
          go_back();
        }
      }    
    }
  }  
  else
  {
    digitalWrite(IN1,HIGH);
    digitalWrite(IN2,HIGH);
    digitalWrite(IN3,HIGH);
    digitalWrite(IN4,HIGH); 
    Serial.println("Not Detected");
  }
}

 

모바일 로봇 제작 기대 효과

 

이 로봇이 개발이 된다면 3교대로 항상 힘들어하는 간호사들의 숨을 돌릴 수 있을 것이다. 그로 인해 간호사들의 업무 환경이 향상 될 것이다. 또한 환자들의 편의성이 향상될 것이다. 불 필요한 움직임을 할 필요가 없기 때문에 편의성이 향상 될 것이고, 다친 부위를 사용하지 않아도 되기 때문에 치유속도 또한 향상 될 것이다.

이 로봇이 병원에서 돌아다니게 된다면 소음이 문제가 될 것이 분명하다. 이 부분은 BLDC모터를 이용하거나 모터의 속도를 조절하는 것으로 해결이 가능할 것이다. 또한 작동 불능에 대한 대처가 필요할 것이다. 배터리 방전 OR 모터 고장으로 인해 작동 불능일 경우 비상용 help 버튼이나 작동 여부를 확인하는 추가 장치를 통해 간호사에게 알리면 될 것이다. 병원엔 다들 똑같은 병원복을 입고 있기 때문에 대상을 인식하는 과정에서 문제가 생길 것이다. 이 부분은 인식하는 조건을 여러가지 사용하여 인식 대상이 놓치지 않게 보안하면 될 것이다. 

 

 

환자 치료를 돕는 AI 링거걸이 기능

 

 

 

반응형