[57호]전신 마비 환자의 의사소통을 위한 eye-keyboard
2019 ICT 융합 프로젝트 공모전 참가상
전신 마비 환자의 의사소통을 위한 eye-keyboard
1. 심사평
칩센 레이저를 통해 알파벳과 같은 글자를 가리키고, QTR-1A 센서를 통해 선택하는 방식으로 구현을 하였으나, 작품 데모 동영상에도 보이는 정도의 움직임이나 선택을 해야한다면 중증 환자가 사용하기에는 어려운 면이 있을 것 같습니다. QTR-1A센서에서 눈동자의 방향을 tracking 후 선택할 수 있는 방안에 대하여 더 많은 고민이 필요할 것으로 보입니다.
뉴티씨 전신마비환자들의 경우 의사전달에 매우 어려움을 겪을 것인데, 점자와 같은 어려운 방법 외에 이렇게 다양한 방법으로 의사소통을 할 수 있도록 준비해주는 것은 매우 도움이 된다고 생각됩니다. 또한, 다양한 방법을 앞으로도 많이 개발해 내서, 다양한 환자들이 본인에게 잘 맞는 방법을 사용할 수 있도록 해 주면 좋겠습니다. 높은 점수를 드립니다.
위드로봇 센서 부분을 개선해서 전체 시스템의 응답 속도를 끌어 올리면 더욱 좋은 작품이 될 것 같습니다.
펌테크 작품의 아이디어와 창의성이 돋보이며 추후 작품 완성도를 높일 경우 실제 전신마비 장애인을 위한 의사소통 장치로도 충분히 활용이 가능할 수준급의 작품이라고 생각합니다. 작품의 기획의도, 기술 구현도, 완성도 등에서 상당히 뛰어난 작품으로 생각됩니다.
2. 작품 개요
루게릭병은 근위축, 근력 약화, 섬유 속성 연축 등을 특징으로 하는 퇴행성 신경계 병변을 의미하며, 이로 인해 전신이 마비되어 몸을 움직일 수 없고 말을 할 수 없다. 그렇기에 환자들과 보호자가 의사소통에 불편을 겪고 있지만, 다행히 루게릭병 환자들은 안구를 움직일 수 있다. 본 연구는 안구의 움직임을 이용해서 의사소통을 할 수 있는 안경을 만드는 것을 목적으로 한다. 이 안경은 루게릭병 이외에도 거동이 불편한 근육병 환자들이 양 손으로 작업을 해야하는 경우에 사용자들의 효율성을 증진시킬 수 있다. 기존의 의사소통을 위한 기구는 모스부호를 사용하는 기구와 아이마우스가 있는데 그림 1은 모스부호 방식으로 뒤통수를 움직여 양쪽의 센서에 닿게 해서 모스 부호를 입력하는 방식이다. 모스 부호 방식은 모스 부호를 외워야 하는 번거로움과 소음 문제가 있고 아이마우스 방식은 복잡한 프로그래밍과 고가의 아이마우스를 사야하는 문제가 있다. 우리는 아두이노 보드와 QTR sensor, laser module을 사용해서 키보드와 eye-motion을 만들어 기존의 방식보다 간단하게 의사소통을 할 수 있도록 한다. 키보드를 입력하여 전하고자 하는 문자를 모니터에 입력할 수 있고 LED로 만든 아이모션 눈동자를 이용해서 모니터를 볼 수 없는 원거리에서도 간단한 의사소통이 가능하게 한다.
3. 작품 설명
3.1. 주요 동작 및 특징
3.1.1. 감지부
작품의 감지부에서는 사지를 움직이지 못하는 환자분들을 위해 눈동자의 움직임과 고개를 약간씩 움직이는 것만으로 의사소통을 할 수 있게 한다. 눈동자의 움직임을 감지할 수 있도록 QTR-1A 센서를 이용하였다. 환자가 왼쪽을 볼 때 눈동자가 왼쪽으로 이동하는 것을 감지할 수 있고, 오른쪽을 보면 눈동자가 오른쪽을 본다는 것을 QTR-1A 센서가 감지할 수 있다. 눈을 깜빡이는 것 또한 센서가 감지하여 환자의 눈 상태를 정밀하게 감지할 수 있다. 레이저 리시버는 레이저를 감지하는 센서이고 이를 통해 환자가 안경에 부착된 레이저 포인터로 원하는 글자에 해당하는 레이저 리시버에 레이저를 발사할 시 레이저 리시버는 이를 인식할 수 있다. 또한 두 개의 감지부를 이용하여 입력하고 싶은 문자에 레이저를 발사할 때 눈동자를 한번 깜빡이면 해당 문자가 출력되도록 하였다.
QTR-1A 센서
작품의 감지부중 하나로 눈동자가 움직일 때 움직임을 감지해주는 QTR-1A 센서 이다. QTR-1A 센서는 적외선 LED와 광 트랜지스터로 구성된다. 적외선 LED에서 적외선을 방출, 적외선이 물체와 부딪히면 일부는 흡수, 일부는 반사되는데 반사된 적외선을 광 트랜지스터에서 인식, 반사율에 따라 다른 전압을 출력한다. 이때 낮은 전압 출력은 좀 더 많은 적외선이 반사되었다는 것을 의미한다. 검은색은 흰색보다 빛을 더 많이 흡수하기 때문에 동공이 가까이 오면 적외선의 반사율이 떨어지고, 센서에서 읽어 들이는 값은 증가한다. 이를 이용해 양쪽 센서 중 한쪽 센서의 값이 증가하고 다른 쪽은 그대로이면 증가한 쪽으로 시선이 움직였다는 것을 알 수 있다. 눈을 감으면 양쪽 센서값이 동시에 감소하는데 이를 통해 눈을 감았는지 확인 한다.
레이저 리시버
레이저 수신 모듈을 이용하여 레이저를 발사하였을 때 레이저 리시버는 이를 감지할 수 있으며 이로 인해 레이저의 인식 유무에 따라 0과 1로 표현할 수 있다. 환자가 원하는 글자에 해당하는 레이저 리시버를 겨냥할 때 레이저 리시버가 이를 감지하도록 한다. 영어 알파벳으로 자판을 구성하며, 알파벳 개수에 맞추어 레이저 리시버를 부착하여 환자는 레이저 리시버를 통해 원하는 말을 출력할 수 있다.
3.1.2. 제어부
아두이노 MEGA 2560
아두이노는 모두가 원하는 바를 비교적 쉽게 구현할 수 있도록 만들어진 마이크로컨트롤러 보드와 개발 환경을 통칭하는 말이다. 여기서 마이크로컨트롤러는 말하자면 컴퓨터의 역할을 하는 것으로 아두이노 MEGA 2560은 마이크로컨트롤러가 아닌 마이크로컨트롤러 보드라 할 수 있다. 마이크로컨트롤러는 특수한 환경에서 사용하기 위해 만들어진 작은 컴퓨터라 볼 수 있으며, 가격이 저렴하고 다양한 제품이 있으므로 구현하고자 하는 기능에 맞게 선택할 수 있다는 장점이 있다. 여기 코드를 지정하고 아두이노를 통해 하드웨어를 구성하여 구동시켜 보고자 한다.
아두이노 메가2560은 ATmega2560 마이크로 컨트롤러를 사용한 아두이노 보드다. 통상적으로 쓰이는 보드는 아두이노 우노이지만, 아두이노 우노는 최대 20개의 디지털 입출력 핀을 가지고 있지만, 메가 2560은 최대 54개의 핀수를 가지며 아두이노 우노와 호환도 가능하다. 우노와 또 다른 점은 하드웨어 시리얼을 4개 이용 가능한 점이 있으나 입출력 핀의 차이를 제외하면 근본적인 것은 우노와 동일하다.
3.1.2. 출력부
초안은 사지가 불편한 환자가 글자를 출력할 때, 안경에 부착된 레이저 리시버에 레이저를 발사하면 바로 글자가 입력된다는 구조였지만 환자의 레이저 수신 모듈이 다른 레이저 리시버에 스치기만 해도 글자가 출력된다면 의사소통이 원활하게 이루어지지 않을뿐더러 오류가 많이 발생할 것 같아 눈동자를 한번 깜빡이면서 출력하고 싶은 문자의 레이저 리시버에 레이저를 쏘면 글자가 출력되는 것으로 수정하였다. 그리고 QTR-1A 센서에서 인식하는 눈동자의 움직임을 그대로 네오픽셀에 출력하게 하였다.
그리고 Neopixel을 사용해서 눈동자 모양의 아이모션을 만들어서 모니터를 볼 수 없는 원거리에서도 간단한 의사소통을 할수 있게 하였다.
Adafruit Neopixel
LED는 다른 조명들에 비해 가격이 비싸지만 수명이 길고 더 밝게 빛난다. 그래서 요즘 LED를 많이 사용하며 그중 네오픽셀은 회사 Adafruit에서 붙인 이름이며, WS281x 칩을 내장하고 있는 LED이다. 네오픽셀의 장점으로는 LED가 여러 개 길게 연결되어 있더라도 각각의 LED들의 색과 ON, OFF를 조절할 수 있으며 선3개로 LED의 갯수와 상관없이 제어가 가능하다. 아두이노의 디지털핀은 5V 40mA까지 출력이 가능하지만, 네오픽셀은 그에 적합한 스팩을 가지며 연결 시에 추가로 저항을 연결할 필요가 없으므로, 아두이노 사용에 편리하다.
네오픽셀의 종류에는 RGB와 RGBW가 있는데 White를 만들기 위해선 Red, Green, Blue를 모두 사용해야 하므로, White가 많이 쓰일 경우에는 RGBW를 사용하는 것이 효율이 더 높다. 네오픽셀은 여러 가지 모양을 가지고 개별로도 사용가능하며, 링 타입, 스트립 타입, 매트릭스 타입, 스틱타입 등 여러 가지가 있지만 스트립 타입을 사용한다.
사람의 눈 모양과 흡사하게 구성하기 위해 총 8줄, 68개의 네오픽셀을 배열하였다. QTR-1A 센서에서 환자의 눈동자 움직임을 인식하면 그에 맞게 네오픽셀에 환자의 현재 눈동자 상태를 출력해준다. 눈에서의 흰색 눈동자는 흰색으로 하였으며 동공은 파란색, 홍채는 하늘색으로 구성하였다. 눈을 감을 시에는 LED 전체가 OFF되게 코드를 설정했다.
3.2. 전체 시스템 구성
3.2.1. FLOW CHART
3.2.2. 회로도
3.2.3. 개발 환경
아두이노는 오픈소스 소프트웨어의 시작이라고 할 수 있으며, 2005년 이탈리아 디자이너들이 개발하였다. 아두이노는 Wiring을 기반으로 하는 Arduino 프로그래밍 언어와 Arduino Software(IDE)를 기반으로 한다. 여기서 Wiring은 마이크로컨트롤러를 위한 오픈 소스 프로그래밍 프레임 워크이다. 오픈 소스 소프트웨어를 바탕으로 두고 있기 때문에 코드를 짜는 과정에서의 어려움을 완화시켜주었으며 접근성을 높였다. 하지만 아두이노를 사용할 때 코드 작성에 필요한 C언어를 필수적으로 다를 줄 알아야 한다. 최근 여러 곳에서 많이 이용하고 있는데 그 이유는, 아두이노 보드는 다른 마이크로컨트롤러 플랫폼에 비해 가격이 저렴하며, 아두이노 소프트웨어(IDE)는 Windows외에도 Macintosh OSX 및 Linux 운영 체제에서도 지원이 되기 때문이다.
3.2.4. 소스코드
#include <QTRSensors.h>
#include <Adafruit_NeoP/ixel.h>
#define LaserOut 52 // 레이저 발신기 52번핀
#define button 53 // 센서값 초기화 버튼 53번핀
int LaserIn[29] = {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30};
// 29개의 레이저 수신기
char key[29] = {‘.’,’^’,’?’,’m’,’n’,’b’,’v’,’c’,’x’,’z’,’a’,’s’,’d’,’f’,’g’,’h’,’j’,’k’,’l’,’q’,’w’,’e’,’r’,’t’,’y’,’u’,’i’,’o’,’p’}; // 레이저 수신기에 할당된 키
int countOn = 0; // 중복 문자 입력 방지용
#define NUM_SENSORS 2 // 사용된 QTR 센서 수
#define NUM_SAMPLES_PER_SENSOR 10
#define EMITTER_PIN QTR_NO_EMITTER_PIN
int iniSensorValL, sensorValL; // 왼쪽 센서 초기값, 현재값
int iniSensorValR, sensorValR; // 오른쪽 센서 초기값, 현재값
#define PIN A2 // 네오픽셀 LED 아날로그 2핀에 연결
Adafruit_NeoPixel led = Adafruit_NeoPixel(68, PIN, NEO_GRB + NEO_KHZ800);
int blackNum = 24; // 홍채를 표현하는 LED 수
int pupilNum = 12; // 동공을 표현하는 LED 수
uint32_t color;
int brightness = 40; // LED 밝기
byte eyeColor;
int LR =7;
//눈동자 위치를 나타냄. 눈 가운데를 7로, 가장 왼쪽이 3, 가장 오른쪽이 11
boolean lid = false; // 눈 상태를 표시. false면 뜬 상태, true면 감은 상태
/* 홍채 위치를 나타내는 15개의 배열, 각 숫자는 네오픽셀 LED. 아래 blink 함수로 상황에 맞는 눈 모양을 구현하는데에 쓰임 */
int blackLED[15][24] = {{12,32,35,55,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68},
{12,13,31,36,54,55,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68},
{11,13,14,30,37,53,54,56,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68},
{10,11,14,15,29,38,52,53,56,57,68,68,68,68,68,68,68,68,68,68,68,68,68,68},
{ 9,10,11,12,15,16,28,33,34,39,51,52,55,56,57,58,68,68,68,68,68,68,68,68},
{ 0, 8, 9,10,11,12,13,16,17,27,32,35,40,50,51,54,55,56,57,58,59,67,68,68},
{ 0, 1, 7, 8, 9,10,13,14,17,18,26,31,36,41,49,50,53,54,57,58,59,60,66,67},
{ 1, 2, 6, 7, 8, 9,14,15,18,19,25,30,37,42,48,49,52,53,58,59,60,61,65,66},
{ 2, 3, 5, 6, 7, 8,15,16,19,20,24,29,38,43,47,48,51,52,59,60,61,62,64,65},
{ 3, 4, 5, 6, 7,16,17,20,21,23,28,39,44,46,47,50,51,60,61,62,63,64,68,68},
{ 4, 5, 6,17,18,21,22,27,40,45,46,49,50,61,62,63,68,68,68,68,68,68,68,68},
{ 4, 5,18,19,26,41,48,49,62,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68},
{ 4,19,20,25,42,47,48,63,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68},
{20,21,24,43,46,47,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68},
{21,23,44,46,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68}};
// 동공 위치를 표현한 15개의 배열
int pupilLED[15][12] = {{33,34,68,68,68,68,68,68,68,68,68,68},
{32,33,34,35,68,68,68,68,68,68,68,68},
{12,31,32,33,34,35,36,55,68,68,68,68},
{12,13,30,31,32,33,34,35,36,37,54,55},
{13,14,29,30,31,32,35,36,37,38,53,54},
{14,15,28,29,30,31,36,37,38,39,52,53},
{15,16,27,28,29,30,37,38,39,40,51,52},
{16,17,26,27,28,29,38,39,40,41,50,51},
{17,18,25,26,27,28,39,40,41,42,49,50},
{18,19,24,25,26,27,40,41,42,43,48,49},
{19,20,23,24,25,26,41,42,43,44,47,48},
{20,21,22,23,24,25,42,43,44,45,46,47},
{21,22,23,24,43,44,45,46,68,68,68,68},
{22,23,44,45,68,68,68,68,68,68,68,68},
{22,45,68,68,68,68,68,68,68,68,68,68}};
/*
*/
int eyelid = 0; // 눈꺼풀 상태, 0 완전히 뜬 상태, 8 완전히 감은 상태
int eyelidNum[8] = {0,4,8,16,24,34,44,56};
int eyelidLED[56] = {64,65,66,67,58,59,60,61,56,57,62,63,49,50,51,52,47,48,53,54,38,39,40,41,46,55,36,37,42,43,26,27,
28,29,35,44,24,25,30,31,15,16,17,18,34,45,23,32,13,14,19,20,6,7,8,9};
QTRSensorsAnalog qtra((unsigned char[]) {0, 1}, NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN);
unsigned int sensorValues[NUM_SENSORS];
void blink(int eyelid, int LR) { // blink 함수 정의
if (eyelid != 8){
//모든 LED를 흰색으로 해서 흰자 표현
for(uint16_t i=0; i<led.numPixels(); i++) {
led.setPixelColor(i, led.Color(66, 66, 66));
}
/* 눈동자 위치를 나타내는 LR과 배열 blackLED를 이용해 바라보는 방향에 맞는 홍채 표현 */
for(uint16_t i=0; i<blackNum; i++) {
led.setPixelColor(blackLED[LR][i], color);
}
/* 눈동자 위치를 나타내는 LR과 배열 blackLED를 이용해 바라보는 방향에 맞는 동공 표현 */
for(uint16_t i=0; i<pupilNum; i++) {
led.setPixelColor(pupilLED[LR][i], led.Color(0, 0, 66));
}
/* 변수 eyelid 값이 커지면 배열 eyelidLED에 정해진 LED들을 점점 끈다. 최종적으론 모든 LED가 꺼진다. */
for(int i=0; i < eyelidNum[eyelid]; i++) {
led.setPixelColor(eyelidLED[i], 0);
}
} else if (eyelid == 8){ // 눈 감았을 때 모든 LED 끔
led.clear();
}
led.show();
}
void setup() {
Serial.begin(9600); // 컴퓨터와 통신
led.begin(); // 네오픽셀 LED 연결
led.setBrightness(brightness); // LED 밝기 설정
led.show(); // 모든 LED 끄기
color = led.Color(0, 177, 55); //홍채 색, 녹색
delay(100);
qtra.read(sensorValues); // 센서값 읽기
iniSensorValL = sensorValues[0];
iniSensorValR = sensorValues[1]; // 읽은 값을 초기값으로 설정
blink(eyelid, LR); //blink 함수 실행
pinMode(LaserOut, OUTPUT);
pinMode(button, INPUT);
for (int i = 0; i < 29; i++)
{
pinMode(LaserIn[i], INPUT);
} // 29개의 레이저 수신기 연결
digitalWrite(LaserOut, HIGH); // 레이저 발신기 켜기
}
void loop() {
qtra.read(sensorValues); // 센서값 읽기
sensorValL = sensorValues[0];
sensorValR = sensorValues[1]; // 센서 읽은 값을 현재값으로 설정
double rasioL = (double)sensorValL / iniSensorValL;
double rasioR = (double)sensorValR / iniSensorValR;
// 초기값과 현재값 비교
if(rasioL > 0.985 && rasioR < 0.985){ // 오른쪽 볼때
for(int i = LR; i < 12; i++){
//눈동자 오른쪽으로 이동할 때 까지 반복 실행
blink(0, i); //blink 함수 실행
delay(40);
LR = i; // 맨 오른쪽으로 눈동자 위치 설정
}
}else if(rasioL < 0.985 && rasioR > 0.985){ // 왼쪽 볼때
for(int i=LR; i>2; i–){ // 눈동자 왼쪽으로 이동할 때 까지 반복 실행
blink(0, i); //blink 함수 실행
delay(40);
LR = i; // 맨 왼쪽으로 눈동자 위치 설정
}
}else if(lid == false && rasioL < 0.96 && rasioR < 0.96){ // 눈감기
for(int i = 1; i < 9; i++){ // 눈꺼풀 완전히 감길 때까지 반복 실행
blink(i, LR);
delay(40);
lid = true; // 눈상태 감은 상태로 설정
countOn++; // 감은 상태일 때 CountOn 변수 계속 증가
}
}else if(lid == true && rasioL > 0.96 && rasioR > 0.96){ // 눈뜨기
for(int i = 8; i > 0; i–){ // 눈꺼풀 완전히 떠질 때까지 반복 실행
blink(i, LR);
delay(40);
lid = false; // 눈상태 뜬 상태로 설정
for (int i = 0; i < 29; i++)
{
if (digitalRead(LaserIn[i]) == HIGH && countOn > 5)
{
Serial.print(key[i]); // 눈을 떳을때 순서대로 모든 레이저 수신기의 레이저 수신 여부를 확인, 수신했으면 그 수신기에 해당하는 문자 출력
}
}
countOn = 0;
}
}else if(lid == false && rasioL > 0.96 && rasioR > 0.96) {
// 정면 볼때
if(LR <= 7){ // 왼쪽에서 가운데로 복귀할 때까지 반복 실행
for(int i=LR; i<=7; i++){
blink(0, i);
delay(40);
LR = i;
}
}else {
for(int i=LR; i>=7; i–){
// 오른쪽에서 가운데로 복귀할 때까지 반복 실행
blink(0, i);
delay(40);
LR = i;
}
}
}
// 버튼 누르면 초기값 재설정
if (digitalRead(button) == HIGH){
iniSensorValL = sensorValL;
iniSensorValR = sensorValR;
}
}
레이저 수신 모듈과 레이저 리시버가 서로를 잘 인식하는지 실험하기 위해 연결하였고 잘 작동하였으며, 작은 크기의 레이저 리시버가 레이저를 얼마나 잘 인식하는지도 알아보았다.
QTR-1A 센서를 연결하여 센서가 잘 인식하는지 확인하였고, 레이저 리시버가 다수가 될 경우에도 각각의 레이저 리시버가 알맞게 결과를 출력하는지도 알아보았다.
네오픽셀과 QTR-1A 센서를 같이 연결하여 잘 작동하는지 확인하였으며 네오픽셀이 눈동자의 움직임에 따라 결과를 잘 출력해내는지 확인하였다.
네오픽셀을 구 모양의 모형에다가 부착하여 눈동자의 형태로 만들어 완성도를 높였다.
cad로 도면을 그린 뒤 아크릴을 레이저 커팅을 해서 키보드를 만들었다.
알파벳 갯수에 맞는 레이저 리시버들을 연결하였고 하나하나 잘 작동하는지 확인해보았으며, 키보드를 기울이자 계속 오류가 났었는데 실험실의 조명이 LED였고 LED를 인식하여 오류가 난 것으로 판단하여 키보드를 90도로 세워서 사용해야 된다는 것 또한 확인하였다.
실제로 적용해보기 위해 안경에 QTR-1A 센서와 레이저 수신 모듈을 부착하여 제대로 인식하고 작동하는지 확인하였다.
5. 결과
작동이 잘 되는지 확인하기 위해 장치가 부착된 안경을 쓰고 단어와 문장을 입력해 보았다. 사용 방법은 다음과 같다.
먼저 기기를 작동시키고 안경을 쓴다. 그 다음, QTR 센서의 위치를 사용자에 맞추어 조절한다. 센서의 높이와 두 센서간의 거리를 사용자에게 맞추어야 보다 정확한 작동이 보장된다. 조절이 끝나면 안경을 쓰고 정면을 본 상태로 센서 초기화 버튼을 누른다. 준비가 끝나면 판에서 원하는 문자에 레이저를 조준하고 눈을 깜빡인다. 원하는 문자가 연결된 컴퓨터에 출력되면 성공이다.
작동성 확인을 위해 1개의 단어를 입력하여 입력 소요 시간을 구해 정확성과 편의성을 확인한다. 그 다음 문장 입력으로 실험을 반복한다.
· 단어 입력 : what 이라는 단어를 입력하는데 8초가 소요되었다.
· 문장 입력 : what time is it? 문장을 입력하는데 42초가 소요되었다.
6. 결론
본 기기는 의사소통이 불편한 전신 마비 환자가 약간의 목 움직임과 눈 깜빡임으로 원하는 글자를 입력하여 소통을 가능하게 하는 것을 목표로 한다. 이렇게 글자를 입력하는 것은 다소 힘들고 시간이 걸리기 때문에 눈을 모방한 LED 모형을 추가해 간단한 의사소통에 사용할 수 있게 하였다.
기기는 컴퓨터와 연결해서 사용하며 안경, 문자판, 안구 모형으로 구성된다. 안경에는 렌즈에 QTR 센서, 안경테에 레이저 발신기가 부착되어 있다. 문자판은 29개의 문자와 29개의 레이저 수신기로 구성된다. 안구 모형은 네오픽셀 LED를 눈 모양으로 배치하였다.
글자를 입력하는 방법은 레이저 발신기와 레이저 수신기, QTR 센서를 이용한다. 안경을 쓰고 레이저로 문자를 조준, 눈을 깜빡이면 레이저 수신기와 QTR 센서가 이를 감지하고 문자를 컴퓨터에 출력한다.
안구 모형은 레이저 입력 기구를 보조하는 역할은 한다. QTR 센서값을 읽어 이를 네오픽셀 LED로 출력, 눈을 깜빡이는지, 왼쪽을 보는지, 오른쪽을 보는지 보여준다. 이를 통해 간단한 규칙을 정해두면 간호인이 환자가 뭔가 원하는 것이 있다는 것을 쉽게 알 수 있다.
이를 통해 기기가 작동하는 것을 확인하였으나 실제 제품화 시에는 레이저 수신기의 크기를 키우고 QTR 센서를 보다 정밀한 것으로 대체한다면 보다 쉽게 사용할 수 있다고 생각한다.
7. 참고문헌
[1] https://www.youtube.com/watch?v=Oc_QMQ4QHcw
[2] https://www.pololu.com/docs/0J19/all
[3] https://m.blog.naver.com/PostView.nhn?blogId=dokkosam&logNo=221041758473&proxyReferer=https%3A%2F%2Fwww.google.com%2F
[4] https://www.arduino.cc/en/Guide/Introduction
https://m.post.naver.com/viewer/postView.nhn?volumeNo=17855946&memberNo=38316664&vType=VERTICAL
[5] https://create.arduino.cc/projecthub/H0meMadeGarbage/eye-motion-tracking-using-infrared-sensor-227467?ref=search&ref_id=eye%20motion&offset=0