글 | 허 원 진 아키텍트
라즈베리파이2를 이용해 ‘작은 천사’를 만들어 애인에게 선물하는 과정을 다룬다. 센서 선택, 머신 러닝, 소프트웨어와 하드웨어의 자동화 테스트, 해킹 공격, 프라이버시 문제 등 한 달 동안 작업한 이야기다. 이 작업의 파생 결과로 하루 30분의 자유를 누리게 됐다.
‘천사’ 만들기 준비
작은 천사의 임무는 애인이 귀가하기 전에 등을 켜고 외출하면 침입탐지를 하는 것이다. 그 동안 하드커널 사의 오드로이드 U3를 주로 사용했으나 이번에는 궁금증도 해소할 겸 라즈베리파이2를 사용했다. 라즈베리파이를 구매할 때는 ‘2’인지 꼭 확인하기 바란다. Rev 2가 라즈베리파이2로 검색된다. 라즈베리파이2는 메모리가 1기가바이트다.
우리가 뭔가 만들기 시작하면 아두이노와 같은 MCU는 저항 같은 부품처럼 소모적으로 사용한다. 외국에 주문하면 만원에 4개 정도 구매할 수 있다. 또한 오리지널 보드보다 작동 온도 범위가 우수하기까지하다. 구입할 때는 USB 포트가 있고 3 V와 5 V를 모두 제공하는 보드(보통 센서들은 전원으로 3~5 V를 사용하기 때문에 3 V 또는 5 V만 지원하는 보드는 전압을 바꿔줘야 하는 번거로움이 있다)를 선택하는 것이 좋다.
총 재료비: 8만원
·라즈베리파이2
·WiFi 동글
·MicroSD카드
·1W 파워 LED
·휴대전화 충전용 5V 2A USB 어댑터
·아두이노 마이크로
·적외선 센서(HC-SR501)
·온도/습도 센서(DHT11)
·릴레이 스위치
·글루건
라즈베리파이의 라즈비안 운영체제에는 기본적으로 Java 1.8이 들어 있다. 필자의 IoT 소프트웨어는 자바를 기반으로 하기 때문에, 네트워크 설정과 Jar 파일을 복사하고 라즈베리파이 시작 시 Jar 파일을 실행하도록 /etc/local.rc만 수정하는 것으로 세팅이 끝났다. 추가로 설치해준 라이브러리는 자바에서 시리얼 통신을 하기 위한 javaRXTX이다. 라즈비안 패키지에 있기 때문에 설치 명령으로 쉽게 설치가 가능하다.
apt-get install librxtx-java
최소 설치와 테스트를 끝낸 후에는 이미지를 백업하는 것이 중요하다. 언제든 쉽게 복구할 수 있고 장치를 늘릴 수 있기 때문이다. 실제로 첫 내구 테스트에서 SD카드의 데이터가 손상되어 백업한 이미지로 다시 복구했다. 세팅이 끝난 파이2는 온도/습도 센서와 연결한 아두이노와 연결해 120시간 내구 테스트를 했다. 그동안의 HW 문제를 기록한 데이터를 봤을 때 확률적으로 문제가 발생한다면 120시간 안에 발생할 확률이 제일 높기 때문이다. 이 120시간은 필자의 저작 환경에만 해당한다. 필자의 오류 데이터를 근거로 추정했기 때문이다.
1 W 파워 LED는 발열량이 많기 때문에 알루미늄 방열판을 부착하고 연속으로 1시간 이상을 사용해도 60도를 넘지 않도록 했다. 고출력 LED를 제어하기 위해서는 별도의 전원이 필요하다. 이 LED는 최소 350 mA가 필요하다. 따라서 아두이노의 전류를 쓸 수 없고 별도의 전원 어댑터가 필요하다. 어댑터를 선택할 경우에는 LED의 허용 전압과 어댑터의 전압을 꼭 확인하고 선택해야한다.
테스트 후에 파워 LED의 전원 부분을 글루건으로 한 번 감쌌다(그림 4). 전원선의 장력 분산과 쇼트를 방지하기 위해서다.
적외선 센서와 릴레이 스위치
적외선 센서는 사람을 감지하고, 릴레이 스위치는 파워 LED에 전원을 공급한다. 둘 다 아두이노에 연결한다. 데이터시트는 봤지만 실제와 차이가 있기 때문에 회로를 구성해서 테스트해야 한다. 동작이 감지되면 릴레이 스위치를 켜는 간단한 테스트이다.
int infraredSensorPin = 4;
void setup() {
pinMode(infraredSensorPin,INPUT);
pinMode(3, OUTPUT);
}
void loop() {
if(digitalRead(infraredSensorPin) == LOW){
digitalWrite(3, HIGH);
}else{
digitalWrite(3, LOW);
}
delay(500);
}
두 부품 모두 잘 작동했으나 적외선 센서의 거리가 너무 짧고 각도 또한 너무 좁다. 데이터시트를 잘못 봤다. 위 센서의 각도는 3도 정도에 감지거리는 30 ~ 80 cm이다. 동작을 감지하기에는 너무 부족하다. 120도 정도에 3~5 m 부품으로 다시 검색했다. PIR(Pyroelectric Infrared Ray)로 검색하면 된다. HC-SR501 모듈로 선택했다. 해당 모듈의 특성과 사용법은 아래 링크에 자세히 나와 있다.
http://arduinobasics.blogspot.kr/search/label/HC-SR501
어댑터나 파워 LED의 과부하를 감지할 온도 센서는 DHT11을 선택했다. DHT11은 아두이노 라이브러리와 예제가 있다. 이것을 사용하면 된다. 센서 선이 20m 이하일 경우에는 5 K 저항을 신호선에 사용해야한다. 사용하지 않을 경우 오차가 10% 정도 더 늘어난다.
파워 LED의 전원은 USB 케이블을 이용해서 전원선을 만들어 휴대전화 충전용 2포트 USB 충전기에 연결했다. 연결 후 전압과 전류를 측정해서 안정적으로 사용할 수 있는지 확인했다. 충전 어댑터의 전압은 5.4 V, 전류는 2 A이다. 파워 LED의 작동 전압(최대 4.2 V) 차이 때문에 적절한 저항을 추가했다. 라즈베리파이의 USB 포트를 파워 LED의 전원으로 사용할 경우 부하가 걸리면 라즈베리파이가 리부팅될 수 있다(라즈베리파이2는 최소 600 mA의 전류가 필요하다).
액추에이터의 상태 때문에 프로세서가 영향을 받도록 구성하면 안 된다. USB는 포트 당 500 mA 사용이 가능하고, 라즈베리파이는 700 mA 정도까지 공급이 가능하다. 파워 LED가 사용하는 350 mA를 공급할 수 있는 용량이나 다른 무전원 센서의 확장을 고려해 라즈베리파이의 포트를 전원으로 사용하지 않았다.
전원선은 납땜 후 +와 - 모두 1.5 mm의 열수축 튜브로 감싸고 다시 전열 테이프와
5 mm 열수축 튜브로 감싸 튼튼하게 이었다.
‘천사’ 가르치기
만드는 과정에서 이 부분이 제일 어려웠다. 필자의 IoT 플랫폼은 엔젤리아라는 AI에 의해 운영된다. 모든 센서 데이터를 분석해서 적절한 서비스를 제공하기 때문에 학습이 필요하다. 애인이 귀가하는 이벤트와 침입자가 있는 데이터를 학습해야 하기 때문이다. 물론 학습이 아닌 프로그래밍으로 패턴을 넣어주는 방법도 있으나, 다수의 센서로 확장되고 네트워킹이 될 경우 N개의 센서에서 발생하는 경우의 가짓수를 모두 프로그래밍 할 수 없으니 장기적으로는 학습방법이 좋다. 따라서 아두이노 코드에서는 단순히 센서의 상태를 주기적으로 시리얼로 라즈베리파이에 보내는 코드와 라즈베리파이로부터 받은 명령을 해석하는 통신 코드만 들어있다.
프라이버시
좋은 의도이지만 애인의 좌표가 중앙에 모이면 누군가(필자를 포함해서) 감시를 할 수 있다. 프라이버시 침해를 막기 위한 가장 확실한 방법은 프라이버시 정보 전송을 하지 않는 것이다. 클라우드에 있는 엔젤리아가 학습한 다음에 학습한 내용을 애인의 엔젤리아 에이전트로 전송하면 애인의 좌표를 중앙에 전송할 필요가 없기 때문에 프라이버시 침해를 막을 수 있다.
이 경우 실 데이터를 기반으로 학습을 못하기 때문에 AI에 의한 자동화된 서비스 개선을 할 수 없다. 하지만 이런 기술적 이슈는 필자가 해결해야할 문제이고 프라이버시 문제까지 고려해야 진정한 ‘천사’가 될 수 있다. 암호화 같은 프로세스 또는 프라이버시 정책과 같은 사후적 조치들은 근본적으로 프라이버시 문제를 해결해주지 못한다.
우리가 생각하는 일반적인 사람의 행동 패턴과 실제는 많은 차이가 있다. 때문에 실 데이터로 학습하는 것이 가장 좋다. 그래서 필자의 데이터로 학습을 시켰다. 집을 나가고 들어오는 판단의 중요한 부분이 시간인데, 이 부분은 엔젤리아 모바일 에이전트에서 학습하도록 했다. 필자가 이동을 해서 데이터를 발생시킨 후 엔젤리아가 판단을 하면 틀린 판단과 맞는 판단을 알려준다. 선생님과 비슷하다. 이렇게 학습한 내용을 애인의 에이전트에 전송하고 모바일의 에이전트는 이를 바탕으로 시간이라는 요소를 포함해서 다시 학습한다.
집에 들어오기 학습
일반적인 현관문 등은 움직임을 감지하여 작동한다. 하지만 들어올 때 섬광탄 터지는 식으로 켜지기 때문에 UX가 안 좋다. 이미 켜져 있는 상태에서 들어오는 것이 더 좋은 UX이다. 문을 열기 전에 문틈으로 새어나오는 빛과 문을 열 때 조금씩 커지는 빛으로 빛에 적응하면서 집 안으로 들어올 수 있기 때문이다. 이 UX가 가능하려면 사용자의 집 좌표와 사용자의 좌표를 기준으로 들어오는 것을 학습해야한다. GPS만으로는 안 되고 WiFi 신호로 보정을 같이 한다. 이렇게 2개 이상의 센서를 이용하면 정확도가 높아진다.
필자의 패턴을 기반으로 학습한 것으로 보면, 그림 12에서 보이는 바와 같이 반드시 거치는 최소 동선(파란 부분)이 있다. K Means 방식으로 군집을 분석하면 우리의 동선 중 게이트웨이 같은 장소는 반드시 군집으로 잡힌다. 특성이 비슷한 그룹을 찾을 때 사용하는 알고리즘이다. 분석 자체보다는 분석을 위한 선처리에 많이 쓰이는 알고리즘이다.
이 군집 영역에 들어오거나 나간다면, 집으로 돌아오거나 집에서 나가는 것으로 해석할 수 있다. 이 부분을 통과해서 목적지에 가까워지면 집에 들어갈 확률이 매우 높다. 이 부분을 통과하는 속도를 계산하면 집에 도착하는데 얼마나 시간이 걸릴지 계산할 수 있고, 이 시간에 맞춰 미리 불을 켜둘 수가 있다. 실제 집에 들어가면 움직임이 발생하므로 집근처에 머무는 시간(모바일의 가속도 센서를 이용하면 GPS를 사용할 수 없는 영역에서도 이동 중인 것을 확인할 수 있다)을 계산하여 다시 보정한다.
침입 탐지 학습
엔젤리아가 볼 수 있는 것은 집안의 움직임과 애인의 위치이기 때문에, 이 두 가지 속성을 가지는 데이터로 침입을 학습해야한다. 전문가 시스템적으로 답을 준다면, 주인이 집에 없는데 집에서 움직임이 감지되는 경우이다. 집에 들어오면 GPS는 무용지물이 된다. 이때부터는 WiFi 신호를 이용해서 집에 머무는지 확인한다.
일반적으로 집주인은 현관문을 통해 집밖으로 나가기 때문에 WiFi 신호를 못 잡더라도 현관문의 움직임이 없다면 주인이 집밖을 나간 것이 아니다. 이와 관련된 오인식 문제가 있다. 주인의 모바일 전원이 꺼진 상태에서 방문객이 있다면, 이를 주인이 나간 것으로 인식한다(최종 버전에서는 시간을 벡터에 포함하고 계산하여 보정한다). 입구에 비전 인식을 하는 것이 보정에는 좋으나 프라이버시 문제가 있다.
·
WiFi 끊김, 움직임 감지 = 주인이 나감/모바일 전원이 꺼진 상태에서 방문객의 경우도 마찬가지로 인식
·WiFi 유지, 움직임 감지 = 집근처에 있음
·WiFi 유지 = 집근처에 있음
테스트와 해킹 공격
적외선 센서의 상태와 파워 LED의 작동, 이를 제어하고 모니터링하는 프로세서 등 테스트할 대상이 꽤 복잡하다. 소프트웨어라면 단위 테스트와 지속적 통합으로 품질관리를 할 수 있지만 하드웨어 테스트는 좀 막막했다. 총 3대의 720P급 카메라로 이를 자동으로 확인할 수 있도록 테스트했다.
개선된 코드를 커밋하면 Gitlab CI가 소프트웨어의 단위 테스트와 배포를 하고 3대의 카메라가 정상 작동 유무를 확인한다(그림 16).
파워 LED는 꽤 많은 열이 발생하기 때문에 장시간 켜 둘 경우 위험할 수 있다. 전통적인 네트워크 공격 외에 외부에서 제어 권한을 획득해서 제어가 가능하다고 가정했다. 이 때문에 천사 내부에 Policy를 두어 명령보다는 천사의 판단을 우선했다. 예를 들어 해킹으로 파워 LED를 장시간 켜도록 명령해도 일정 온도가 넘으면 해당 명령을 무시하는 자체 Policy를 우선 적용했다. 작은 천사가 엔젤리아에 접속이 불가능할 경우에는 사용자의 위치를 알 수 없으므로 미리 불을 켜주는 서비스는 할 수 없다. 이 경우에는 단순한 현관문 등처럼 작동한다.
고민되는 하우징
DIY의 가장 큰 고민은 바로 하우징이다. 많은 DIY의 하우징이 기존의 하우징에 열을 가해 구멍을 뚫거나 종이와 같은 가공이 쉬운 소재를 사용한다. 하지만 좋은 UX를 전달하기에는 무리가 있다. 다음의 방법을 고민했다.
·3D 프린트 7만원
·CNC 16만원
·레고 2만원
품질은 CNC가 가장 좋으나, 여러 부품을 고정하는 부위와 확장 커넥터(오디오 패널 같은)까지 고려하니 CAD 도면이 복잡해져서 일단 레고로 하고 차후에 다른 방식으로 하우징하기로 했다. 이미 세계에서 가장 예쁜 비콘을 준다고 해놓고 하우징하다가 반 년째 못준 전례가 있기 때문에, 이 방법이 효과적이라고 생각했다. 레고의 16 × 16판이 하우징을 하기에 편하다. 하지만 USB가 문제다. 일반형 케이블 말고 ㄱ자 케이블이 있다. 이것을 사용하면 16 × 16에 여러 부품을 넣고 쉽게 하우징이 가능하다.
작동과 응용
사실 현관등 하나 켜는 문제를 해결하기 위한 방법으로는 과도하다. 하지만 사용자가 집에 들어오고 나가는 것을 인식할 수 있으므로 여러 서비스 제공이 가능하다.
프라이버시 문제로 애인의 집이 아닌 필자의 작업실에 적용한 모습으로 이야기한다. 집에 도착하는 시간을 예측해 컴퓨터 전원과 그 시간대에 사용하는 소프트웨어를 실행하고, 외출 시 개인 물건(가습기, 노트북, PC 등)을 꺼주는 데모이다. 필자의 도착 예정 시간과 부팅 시간, 프로그램 로딩 시간 등으로 계산하여 집에 도착했을 때 정시에 서비스가 제공되도록 알아서 제어해준다. 이 작은 서비스를 통해 하루 30분 정도의 자유를 누릴 수 있게 됐다.
윈도우즈에서 실행 프로세스 목록은 기본 명령인 tasklist로, 프로세스의 실행 파일 경로는 .Net Framework인 PowerShell로 알 수 있다. 별도로 프로그램을 실행하지 않은 상태(움직이는 물체를 확인하기 위해 텅빈 거리 상태를 학습하는 것과 같은 이치)를 학습한 후에 사용자가 실행한 프로그램을 시간별로 학습한다.
이미 필자의 PC는 클라우드에 의해 사용되는 자원 중 하나이다. 전원관리가 되고 있다. 따라서 필자가 요청한 것은 AI에게 필자의 귀가 시간에 맞춰 PC를 켜달라고 한 것이다. 주전원을 차단한 지 시간이 오래 지났을 경우에는 WOL로 PC를 켤 수 없으므로 전원 릴레이와 WOL을 같이 사용해 전원을 켠다. WOL은 ff바이트와 PC의 멕 주소를 브로드케스팅하면 해당 PC가 부팅되거나 깨어난다(WOL은 표준 기술이다. 대부분의 PC에서 지원한다). 메인보드 BIOS 옵션에 전원 복구 시 부팅하도록 설정할 수 있다(요즘 바이오스에는 비정상 종료되거나 전원 차단이 오래된 경우에 작동하는 옵션만 있는 경우도 있다).
‘작은 천사’를 통해 에어컨디션부터 커피머신까지 집에 돌아올 때 사용자가 원격 또는 직접 제어할 필요 없이 가장 적은 에너지를 이용해 최적의 ‘정시’ 서비스를 제공할 수 있다.
이후 이야기
그녀의 집에 설치를 마쳤다. 몇 가지 개선해야할 UX를 발견했다.
·릴레이 스위치의 딸깍 소리: SSR로 교체하면 쉽게 해결할 수 있다.
·낮에도 켜지는 등: 조도 센서를 더 부착하는 방법과 학습방법이 있다. 인간의 개입 없이 학습할 수 있는 방법을 찾고 있다. 우선은 낮 시간은 안 켜도록 프로그램했다.
·직진성이 강한 LED: LED 빛은 직진성이 강해 눈에 자극이 크다 - 적절한 LED 광확산 캡을 사용하면 조명 효과는 유지하면서 빛의 자극은 줄일 수 있다.
·쇼트 방지와 장력 분산용으로 사용한 글루가 등을 장시간 사용하면 말랑해질 정도가 된다. 고온용 실리콘 혹은 고온용 핫멜트(130도)라는 소재가 있다.
결국은 조명이 가장 큰 서비스이기 때문에 조명에 대한 이해가 가장 중요하다.
<저작권자(c)스마트앤컴퍼니. 무단전재-재배포금지>