스마트 필 디스펜서: 정밀 약물 관리 시스템
프로젝트 동기
현재 시중의 알약 디스펜서는 비전동식과 자동식 두 종류뿐입니다. 대부분 알림 기능이 있지만 시각/청각 장애인에게 부적합하고, 보호자가 매일/매주 약을 칸별로 채워줘야 해 환자가 타인에 의존하게 됩니다. 코로나19로 가족이나 요양보호사의 방문이 어려워진 상황에서, 수동 정리 불필요, 장애인 접근성 보장, 환자 자립 지원을 목표로 스마트 필 디스펜서를 개발했습니다.
시스템 구성
SmartPill 시스템은 두 개의 서브시스템으로 구성됩니다:
- SmartPill 디스펜서: 약을 정리, 보관, 배출하는 물리적 장치. 환자의 주 인터페이스 역할
- SmartPill 웹 앱: 의사나 보호자가 약물 설정과 복용 이력을 원격 관리하는 웹 인터페이스
작동 원리
웹 앱에서 최대 4가지 약물을 디스펜서당 등록하고, 약물별 하루 최대 3회 복용 시간을 설정할 수 있습니다. 의사가 원격으로 용량을 변경하면 환자 개입 없이 즉시 반영됩니다.
치매, 알츠하이머, 시각/청각 장애 환자를 배려해 대형 터치스크린으로 약 채우기를 안내하고, 음성/빛 알림으로 복용 시간을 알려줍니다. 사용자는 약을 어디에 어떻게 넣을지 고민할 필요 없습니다. 스마트 메커니즘이 약을 내부에서 자동 분배하고 정확한 시간에 정확한 용량을 배출합니다.
마이크로칩 AVR-IoT 보드의 와이파이로 AWS 클라우드와 연결되어 원격 모니터링/설정이 가능합니다. 앱은 복용 완료 여부를 표시하고, 미복용 시 보호자에게 알림을 보냅니다.
디스펜서 상세 구조
주요 기계 부품 (전체 3D 프린팅, PLA)
- 베이스: 전체 지지대, 모션 센서용 구멍 2개, 알약을 컵으로 내리는 플랩 포함
- 슬라이더: 상단이 약통 지지대, 하단에 약이 미끄러져 내려오는 경사면, 전자부품 수납 공간
- 사이드 파트: 습기, 온도, 먼지로부터 하드웨어와 약 보호
- Nextion NX8048T070 7인치 터치스크린: 사용자 인터페이스
- 탑 파트: 상부는 보호 커버, 하부는 드럼과 약통 분리
- Parallax 360° 서보(900-0005): 드럼을 정확한 위치로 회전
- 드럼: 외부와 약통을 연결하는 회전 튜브
- 백 도어: 슬라이더와 약통 탈착용
- 스피커: 음성 안내 출력
- 초음파 센서 HC-SR04: 컵 이동 감지
- 약통 (4개, 확장 가능): 각각 SG90 마이크로 서보로 개별 제어, 정량 배출
조립 순서
- 슬라이더 3분할 출력 부품을 너트 삽입 후 나사로 결합, 전자부품 배선 후 커버 장착
- 약통 조립 (파트1+7 결합 → SG90 장착 → 파트3+4(베어링) 결합 → 파트2 추가 → 슬라이더 상부에 나사 고정)
- 스크린을 사이드 파트에 나사 고정 후 플러그 연결, 사이드 파트를 베이스에 결합
- 탑 파트 2개에 너트 삽입 후 드럼과 Parallax 서보 사이에 끼우고 나사 결합
- 백 도어를 탑 파트 조립체에 나사 고정
전자 회로
아두이노 메가 2560이 메인 컨트롤러로 서보 모터, Nextion 터치스크린, RTC, 사운드, AVR-IoT 통신 보드를 제어합니다.
- AVR-IoT ↔ 아두이노 메가: 시리얼 UART 통신
- 서보 모터: PWM 제어
- RTC: I2C 통신
- IR 차단 센서(약 배출 감지): 아날로그 핀 연결
브레드보드나 자작 PCB로 회로 구성 후 나무 판 등에 고정하는 것을 권장합니다.
SmartPill 웹 앱
주요 기능
- 환자 정보, 약물, 용량, 복용 시간 간편 설정
- 복용 이력 실시간 모니터링
기술 스택
- 백엔드: AWS API Gateway (HTTP API REST)
- 프론트엔드: Ionic & Angular (NodeJS 기반, iOS/안드로이드 네이티브 컴포넌트 제공)
Ionic은 HTML, CSS, JavaScript, Angular로 모바일 앱 수준의 웹앱을 만듭니다. Node.js 필수. Ionic CLI로 프로젝트 생성 후 ionic serve로 브라우저 테스트 가능.
앱 구조 및 핵심 코드
- app-routing.module.ts: 라우트 정의, 변수 전달 지원
- post.service.ts: API 통신 담당 (Post, Dep, Log 인터페이스 정의, CRUD 메서드 구현)
- 설정/편집 페이지(page-config, page-edit-pill): 약물 추가/수정/삭제, 다중 선택 시간 설정(오전/오후/밤), 약물명 입력
- 로그 페이지(page-status): 복용 이력 조회 (날짜, 시간, 환자명, 약물명 표시, 시간대별 아이콘 구분)
아마존 웹 서비스 (AWS) 아키텍처
완전 서버리스 아키텍처로 수요에 따라 자동 확장, 사용량만큼만 과금.
클라우드 아키텍처 흐름
- AVR-IoT 보드 → AWS IoT Core (MQTT 양방향 통신)
- 웹앱 프론트엔드 → AWS S3 (정적 웹 호스팅)
- 웹앱 백엔드 → API Gateway + Lambda + DynamoDB
- EventBridge (크론 스케줄러) → 복용 시간마다 Lambda 트리거 → IoT Core로 배출 명령 전송
- 배출 완료 확인 메시지 → IoT Core → Rule → Lambda → DynamoDB 로그 저장 + 알림 발송
AWS 상세 설정 가이드
- IoT Core: AVR-IoT 보드 등록(마이크로칩 가이드 참고), 와이파이 자격증명 설정
- DynamoDB:
smartpill-history(복용 로그), smartpill-pills(약물 설정) 테이블 생성, 파티션 키 'id'
- Lambda: 각 함수별 실행 역할에
AmazonDynamoDBFullAccess 정책 연결(프로덕션엔 최소 권한 권장), GitHub 레포 코드 배포
- IoT Core Rule: 토픽
confirmationpill 구독 → smartpill-confirmationpill Lambda 실행
- EventBridge: 오전/오후/밤 3개 크론 규칙 생성(UTC 기준) →
smartpill-dispensepill Lambda 타겟
- API Gateway: HTTP API 생성, 모든 Lambda 통합, 라우트 설정, 배포 후 HTTP 엔드포인트 획득
- S3: 버킷 생성 → 정적 웹사이트 호스팅 활성화(index.html) → Angular 빌드 산출물 업로드
AVR-IoT 보드 펌웨어
마이크로칩 AVR-IoT WA 개발 보드용 펌웨어. 기존 CLI 예제 확장:
- USART1(RX/TX 핀)으로 CLI 이식해 외부 기기(아두이노)와 통신 가능
- 커스텀 명령
pill 추가: 배출 결과 파싱 후 confirmationpill 토픽으로 MQTT 전송
- 커스텀 토픽
dispensepill 구독 및 JSON 파서 구현(receiveddispenseFromCloud() 콜백)
통신 프로토콜
dispensepill (AWS → IoT → 아두이노): EventBridge가 Lambda 트리거 → MQTT로 JSON 전송 → IoT 보드가 USART로 아두이노에 단순화된 명령 전송 (D 약물명 수량 약통번호 무게 ... \n)
confirmationpill (아두이노 → IoT → AWS): 아두이노가 pill 1(성공 시) 전송 → IoT 보드가 이전 intake 시간 참고해 JSON 전송 ({"time":"morning","state":"ok"}) → Lambda가 웹 서비스에 로그 기록
코드 저장소
- 웹 앱 프론트엔드: https://github.com/makers-upv/smartpill-webui
- 백엔드 Lambda 함수: https://github.com/makers-upv/smartpill-lambda
- AVR-IoT 펌웨어: https://github.com/makers-upv/smartpill-avriot
- 아두이노 펌웨어: https://github.com/makers-upv/smartpill-arduinofw
3D 모델 및 회로도
- Thingiverse 저장소: 전체 어셈블리 STEP 파일, 약통 메커니즘, 인클로저 등
- 전자 회로 연결도 제공