메이커 Maker

MedicPharm - 조씀다

지구빵집 2022. 9. 14. 07:51
반응형

 

 

진취적이고 도전적인 팀이었다. 특히 팀장과 함께 두 학기를 지내보면서 느낀 건데 개인적으로도 감사한다. 팀원과 소통하는 것, 팀을 이끄는 리더쉽, 왕성한 호기심과 어려운 과제에 대한 도전의식까지 무엇하나 나무랄데가 없는 아이다. 학교에서도 교과목에 대한 지식이 많은 아이가 아니라 대인 관계가 좋고 여러 세미나와 워크숍에 잘 다니는 방정맞은 활동을 하는 아이가 나중에 큰 성과를 낸다. 바로 이 팀 리더가 그런 아이였다. 개발 완료 보고서 마지막에 보니 스스로 평가하는 글이 있어 옮긴다. ㅎㅎ

 

 

어드벤처 디자인 2를 마무리하면서

 

"우선 여러 팀원들의 노고와 밤샘에 정말 감사함을 보낸다. 개인적으로, 로봇 팔을 내가 기어코 만들어보겠다는 생각을 했었고 그 목표를 간신히라도 이뤄낸 점에 대해서 설계 실력이 어느 정도 늘은 거 같아서 상당히 만족스러운 목표를 달성하지 않았나 싶다. 하지만, 우리 팀의 성적이 동상으로 노력에 비해 상대적 아쉬움이 진하게 남는 성적을 받았다. 다양한 평가 기준이 있었겠지만, 팀원들의 수고를 쉽사리 대변하고 보상하기에는 성적으로 평가하는 것은 크게 부족할 것이다. 예산이 많이 줄어 스케일도 많이 줄었고, 이런저런 아쉬움이 크게 남는 어벤디 2 수업이었지만, 1,2 수업을 연이어 지나오면서 상당히 그 과정을 재밌어했던 것 같다. 동기들과 함께여서 더 의미가 남았다고 해야 할까. 새로운 팀원들과 함께하는 한 학기였는데 상당히 동기들에게 수고했고 고맙다고 전하고 싶다."

 

MedicPharm 작품 기획 배경

 

전 세계의 많은 인구가 간단한 질병에도 목숨을 위협받거나 사망하는 경우가 많으며, 특히 이는 의료 체계가 현대화되지 못한 개발도상국이나 제 3세계의 국가에서 빈번하게 벌어지는 일이다. 이는 비단 해외에만 해당되는 이야기가 아니라, 국내에서도 지역마다 상급종합병원까지 소요되는 시간의 차이가 대도시에서도 최대 3배 가까운 차이가 난다는 점을 통계자료를 통해 볼 수 있었다. 즉 이는 의료의 비대칭성이 한국에서도 심화되고 있다는 사실을 말해준다.

 

우리는 이러한 문제점들을 해결하기 위해 로봇팔을 이용한 의료 시스템을 구축하는 것에 대해 관심을 갖게 되었고, 이것이 바로 MedicPharm이 탄생한 이유 중 하나라고 할 수 있다.  

 

제품 구상: 어떤 기능이 우리에게 가장 필요할까?

 

MedicPharm은 온라인을 이용한 의료환경 시스템 통합을 특징으로 하는 제품이다. 이때 우리에게 가장 필요했던 내역은 교체가 가능한 다기능 엔드 이펙터와 의약품의 보급을 해결하는 것이 가장 큰 해결과제였다. 우리는 이를 위해서 전자석을 도입하여 엔드 이펙터를 바꾸자는 아이디어를 내었고, 의약품은 약 자판기를 만들어서 보급하는 것으로 결정했다.

 

다음으로 필요한 논의는 엔드 이펙터에 어떤 기능을 탑재해서 만들어야 할까?라는 질문이었다. 제공받은 비용이 너무 적었기 때문에, 어쩔 수 없이 최소한의 기능만 살리기로 결정했다. 기본적인 의학적 판단을 할 수 있도록 환자의 환부를 볼 수 있는 내시경 카메라와, 산소포화도 및 심박수를 측정하는 심박센서, 환자의 온도를 측정하는 적외선 센서를 탑재하는 것을 목표로 하였다. 

 

작품 제작 : 로봇 팔

 

제품의 구상이 끝난 후 가장 먼저 해야할 일은 바로 로봇 팔을 설계하는 것이었다. 시제품 단계를 제작하는 것이기 때문에 로봇 팔이 실제 팔처럼 클 필요는 없다고 생각했고, 실제 팔의 절반 정도 사이즈로 구현하기로 했다. 

 

인간의 팔은 총 6자유도를 보여주고 있다. 우리는 이에 맞춰 밑판 하단 고정부, 하단 고정부와 맞물리는 회전부, 각 팔의 링크들을 제작하고 링크들은 모두 MG946R 서보모터의 서보혼과 연결될 수 있도록 제작했다. 두 개의 링크 끝에는 전자석을 탑재할 수 있는 모듈을 만들었다.

 

로봇 팔의 전반적인 모델링이 완료되고 난 후 로봇 팔을 출력한다.

 

다음으로 엔드 이펙터를 제작하는 과정을 가졌다. 엔드 이펙터는 총 2 타입으로, 한 곳에는 내시경 카메라를 달아 원격으로 환자의 환부를 볼 수 있도록 했고 다른 한 곳에는 기본적인 센서들을 탑재하여 환자의 상태를 파악할 수 있도록 했다. 카메라 모듈은 바로 컴퓨터로 전송이 가능했지만, 센서들은 그렇지 못했기에 아두이노 나노 RP2040 탑재가 가능한 구역을 만들고, 외부 전원을 공급할 수 있도록 배터리를 달 수 있는 공간을 만들었다.

 

엔드 이펙터 역시 3D프린터로 설계했으며, 엔드 이펙터가 전자석에 매달릴 수 있도록 자석을 하단부에 달았다.  

 

로봇팔 더미 – 로봇팔 블루투스 연결 소스 드

 

#include<Servo.h>
int i = 0;
int m = i % 4;
String str;
Servo motor1;
Servo motor2;
Servo motor3;
Servo motor4;
void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);
  motor1.attach(5);
  motor2.attach(6);
  motor3.attach(10);
  motor4.attach(11);
  motor1.write(90);
  motor2.write(90);
  motor3.write(90);
  motor4.write(90);
}

void loop() {
  while (Serial1.available()) {
    int buffer0 = Serial1.read();
    if (Serial1.read()) {
      i++;
      int m = i % 4;
      if (m == 1) {
        motor1.write(buffer0);
        Serial.print("a");
        Serial.println(buffer0);
      }
      else if (m == 2) {
        motor2.write(buffer0);
        Serial.print("b");
        Serial.println(buffer0);
      }
      else if (m == 3) {
        motor3.write(buffer0);
        Serial.print("c");
        Serial.println(buffer0);
      }
      else if (m == 0) {
        motor4.write(buffer0);
        Serial.print("d");
        Serial.println(buffer0);
      }
    }
  }
}


제품 구현 : 로봇팔 더미 – 로봇팔 블루투스 연결

#include <Servo.h>
#include <Serial.h>
#define SW 3

Servo motor1;
Servo motor2;
Servo motor3;
Servo motor4;

short val1, val2, val3, val4;
short x1, x2, x3, x4;
byte deg1 = 90, deg2 = 90, deg3 = 90, deg4 = 90;
byte phase = 0;

void setup() {
  Serial.begin(9600);
  motor1.attach(5);
  motor2.attach(6);
  motor3.attach(10);
  motor4.attach(11);
  pinMode(SW, INPUT_PULLUP);
  motor1.write(90);
  motor2.write(90);
  motor3.write(90);
  motor4.write(90);
}

void loop() {
  if (digitalRead(SW) == LOW) {

    phase = 1;
    x1 = analogRead(A1);
    Serial.print(x1);
    x2 = analogRead(A2);
    Serial.print("          ");
    Serial.print(x2);
    x3 = analogRead(A3);
    Serial.print("          ");
    Serial.print(x3);
    x4 = analogRead(A4);
    Serial.print("          ");
    Serial.println(x4);

  }
  if (phase == 1) {
    val1 = analogRead(A1);
    val2 = analogRead(A2);
    val3 = analogRead(A3);
    val4 = analogRead(A4);
    val1 -= x1;
    val2 -= x2;
    val3 -= x3;
    val4 -= x4;
    deg1 = map(val1, -340, 340, 0, 180);
    deg2 = map(val2, -340, 340, 0, 180);
    deg3 = map(val3, -340, 340, 0, 180);
    deg4 = map(val4, -340, 340, 0, 180);
    deg1 = constrain(deg1, 0, 180);
    deg2 = constrain(deg2, 0, 180);
    deg3 = constrain(deg3, 0, 180);
    deg4 = constrain(deg4, 0, 180);
    Serial.write(deg1);
    Serial.write(deg2);
    Serial.write(deg3);
    Serial.write(deg4);
    
  }
  Serial.print("deg1=");
    Serial.print(180 - deg1);
    Serial.print("  deg2=");
    Serial.print(180 - deg2);
    Serial.print("  deg3=");
    Serial.print(180 - deg3);
    Serial.print("  deg4=");
    Serial.println(180 - deg4);
  delay(50);
}

 

 

MedicPharm - 조씀다
MedicPharm - 조씀다
MedicPharm - 조씀다
MedicPharm - 조씀다
MedicPharm - 조씀다
MedicPharm - 조씀다
MedicPharm - 조씀다
MedicPharm - 조씀다
MedicPharm - 조씀다
MedicPharm - 조씀다
MedicPharm - 조씀다
MedicPharm - 조씀다

 

 

 

반응형