지난 번 “Hacksum, Maker(메이커)를 꿈꾸다” 에 이어
진정 Maker(메이커)가 되기까지의 Making Story
제 1장이
지금 시작됩니다.
…
| 7월 20일, 스마트 문지기가 탄생하던 날..
작년의 다짐이 벌써 일년 전 이야기가 되어 가던 날.
홀린 듯 불쑥 떠오른 “Maker” 라는 단어에 인터넷을 황급히 뒤져보았습니다. 으헉~~~~~~!!!
벌써 Maker Faire Seoul 2015 일정과 함께 참가 접수 신청 기간이 시작되었더군요. 에쿠… 늦 . 었 . 다.
“늦었는데 포기할까? 말까? 할까?.. 말까? ”
까마득히 잊은 채로 그냥 지나가 버릴 수도 있었지만 역시 이건 신의 계시(???).. 그래 합시다!!!
원래 공부도 벼락치기가 제 맛이니까~ ㅋㅋㅋ
그렇게 7월 20일, Maker Faire를 위한 아이디어 회의가 시작되었습니다.
일단 질러보기~, 일단 말해보기~ 정신에 입각하여 우선 아이디어 마구마구 투척~
- 스마트 도어락(?)
도어락 버튼에 집안의 가전제품이나 전등을 연결해 놓으면, 패스워드를 입력하는 것과 동시 집안에 필요한 불도 켜지고, 문도 열리는……… - 스마트 물주기(?)
NFC 태그에 식물의 이름과 물주는 주기를 입력해 놓고 화분에 부착한다.
레일을 따라 물 호수가 움직이면서 NFC 태그를 읽어서 원하는 주기와 원하는 양만큼의 물을 주면서 지나가는….. - 모션(Motion) 기반의 테이블 휴지통 (?)
지난 뉴질랜드 화장실에서 본 스마트한 휴지통으로부터 얻은 아이디어..
책상 바로 옆에 악어모양의 스마트 휴지통을 달아 놓고, 사람이 손으로 휴지통 위를 스치 듯 모션을 취하면 뚜껑이 저절로 열리고… 책상 위에 쓰레기를 그대로 쓸어서 휴지통으로 쏘옥~~~~ - 스마트 우산 보관… 까지 …
뭐~ 아이디어들은 충분히 화려하고 좋았지만 (자뻑모드 ^^;;),
이 중 우리의 선택은 바로 홈 네트워크의 새로운 장을 열 “스마트 문지기 – 누구세요??” 입니다 . 이렇게 첫 아이디어가 탄생되었습니다. 이제 등록하러 가야쥐~~
| 8월 14일, 우선 저질러라. 그리고 시작해라~
- Maker Faire 접수를 위한 준비물 :
- 작품을 대표하는 이미지(온라인/오프라인 페어 관련해서 모두 사용됨)
- 참가팀명, 참가자 이름, 간단한 작품 설명
- 그리고, 메이커 정신?? ㅋㅋㅋㅋ
심사를 위한 참가 접수는 비교적 간단한 정보들만으로 무사히 마칠 수 있었습니다. 일주일 정도면 심사 결과가 도착하리라는 예상과 달리, 메일 함은 오늘도 조용~하네요.
설마 첫 번째 심사에서 이대로 좌절일까요?? ㅠ _ㅠ
그렇게 2주간의 긴 시간이 흐른 후, 드디어 참가해도 좋다는 확정메일이 도착했습니다. 야호~~~~!!!!
실제 오프라인 계약에 앞서 온라인 계약서를 작성하고 나면 등록이 모두 완료된다고 합니다.
흠.. “계.약.서”라니.. 덜컹!!
우리엄마가 “아무데나 싸인하지 말랬는데~~” ㅠ _ㅠ
계약서와 함께 Maker 들에게는 무료 초대권 5장이 함께 도착합니다.
올해는 입장료가 4000원이니깐 일단 2만원 확보~~~!!! ^^;;;;;
손에 든 건 이제 딸랑 아이디어 하나뿐~, 이제부터 벼락치기로 구현 시작입니다.
늘 그래 왔듯이 이번에도 무.대.뽀 정신으로~ 일단 고고고~~~
| 8월 19일, 싸워라~ 그럼 기능명세를 얻으리라~ ^^
우선 구글 온라인 공간에 Maker Faire 준비공간을 오픈하고, 드디어 영광스러운 오프라인 첫미팅을 시작합니다.
” 아니아니 내 말 좀 먼저 들어보세요~~~ 아니아니~~ 내 말부터 들어봐~ ”
이것이 바로, 난 . 상 . 토 . 론 !!! 그렇게, 열띤 토론 끝에 드디어 스마트 문지기의 기능명세가 대략 정리되어가네요.
[스마트 문지기 – 기능명세]
기능 4종 세트 = [방범기능] + [실시간 통화] + [부재중 처리] + [실시간 모니터링 및 도어락 제어]
- (방범기능) 내 집 앞은 내가 지킨다!!
- 움직임은 확인 되었으나 초인종은 눌리지 않을 경우 동작
- 문 앞 스냅샷 이미지 찰칵!! (카메라 ON)
- 사용자 폰에 메시지 전달
- 경고메시지 발사 ( 사용자 음성 및 싸이렌 소리 ) (음성파일 재생)
- (부재중 기능) 집에 없어도 이젠 걱정 끝
- 부재중 설정이 ON 되어 있는 경우 동작
- 초인종 눌림
- 부재중 안내 메시지 재생 (“지금은 부재중입니다. 필요한 용무가 있으신 분은 삐~ 소리 후에 1분간 메시지나 전화번호를 남겨주시면 연락 드리겠습니다 삐~~” )
- 사서함 기능 – 음성/영상 녹화 (마이크/카메라 ON) – Timer 1분
- 부재중 안내 메시지 재생 (“메시지가 녹음 되었습니다. 방문해 주셔서 감사합니다~”)
- 사용자 폰에 녹화 영상 메시지
- (실시간통화기능) 집에 없어도 있는 것처럼
- 초인종이 눌렸을 경우 동작(부재중 설정 OFF 시)
- 집주인 스마트 폰으로 통화 연결 시도
- 응답하지 않으면, 위의 부재중 모드로 변환
- 응답하면, 실시간 양방향 영상/음성 통화 시작
- 통화 중 방문자 요청 시, 도어락 원격 오픈 가능.
실시간 모니터링 (기능은 존재하나, 시간부족으로 제어부분 미구현 ㅠ_ㅠ)언제든 실시간 모니터링현관 앞 상황을 스마트 폰을 통해 실시간 스트리밍(영상/음성)
| 8월 26일/9월 2일, 이가 없으면 잇몸으로~ 대안에 대안을 찾아라~
대략 설계를 마치고 본격적인 구현 준비가 시작되었습니다.
전체 구성을 파악해 볼 수 있는 슈도코드 작성부터, 각 기능에 필요한 다양한 라이브러리 테스트로 나름 분주한 시간들이 지나고 있습니다.
- 주요 기능별 제어 항목 :
- 방범 기능
초음파 센서 or 적외선 센서 제어
카메라 제어
사운드 재생(Wav or Mp3) - 부재중 기능
버튼 제어(초인종)
사운드 재생(Wav or Mp3)
카메라 제어(사진, 동영상)
마이크 제어 - 실시간 통화 기능
버튼 제어(초인종)
실시간 스트리밍(음성, 영상)
도어락 제어
- 방범 기능
- 제어 항목별 구현
- 방문자 감지
인체 감지를 위해 적외선 센서를 대부분 사용하나, 전시 모형의 특성과 메이커 페어 데모를 위해 초음파 센서로 결정. - 영상/음성 스트리밍
초기 UV4L-WebRTC를 사용하였으나, 개발상의 문제로 제외.
GStreamer 등의 다양한 스트리밍 프로그램을 테스트 했으나, 영상/음성을 동시에 스트리밍 하려 하다 보니 영상/음성을 동시에 스트리밍 하기에 다양한 문제점이 발견됨. 그리하여 PiCam 으로 결정. - TTS 기능
Espeak 등 다양한 TTS 프로그램을 사용해 보았으나, 퀄리티 문제로 인해 Google TTS 사용
- 방문자 감지
- UV4L core module
- HTTP Streaming Server front-end with on-the-fly Device Control Web Page (No configuration required! screenshot)
- Native WebRTC extension for the HTTP Streaming Server (two-way Audio&Video!)
- Jitsi Meet extension to broadcast live Audio&Video over the Web (no browser required, two-way audio/video)
- UVC driver supporting video devices compliant with the Usb Video Class specifications – XScreen driver, a virtual device capturing a given portion of an X screen
- MJPEGStream driver, create a virtual device from a given Motion JPEG stream, i.e. IP Camera – Raspicam driver for the Dual Raspberry Pi CSI Camera Module (NEW Stereoscopic Vision!, use cases)
음성/영상 스트리밍이 가능하고, 최신 WebRTC 기술도 사용해 볼 수 있을 듯 하여 폭풍 검색 끝에 일단 “UV4L-WebRTC”를 사용해 보기로 했습니다. PC 상에서의 간단한 테스트로는 완벽한 실시간 음성/영상 전달이 가능한 듯 보였고, 우리가 만들려는 의도와 딱 어울리는 라이브러리라 생각했습니다. 하지만, 막상 스마트폰과 연동하는 과정에서 Android WebView를 통해서 연 순간, 좌절~ !!!!
음.성.지.원.이 안.된.다.
분명 크롬(Chrome) 브라우저에서는 실시간 대화가 잘 됐는데.. 이럴 수가~ 혹시, Android WebView 버전 문제일까 해서 버전도 올려보고….ㅠ_ㅠ
불행 중 불행일까 테스트 과정에서 라즈베리파이 카메라 사망!! ㅠ _ㅠ 결국 재구매~
Connecting camera stills port to encoder input port Opening output file test.jpg
Enabling encoder output port
Starting capture 0
mmal: No data received from sensor. Check all connections, including the Sunny one on the camera board
…
지금 상황에서 Android로 WebRTC 자체를 이용해서 실시간 음성통화를 구현하려면 당장 시간과 공부가 너무 부족합니다. ㅠ_ㅠ
일단 영상 스트리밍 서비스와 TTS를 적절하게 믹스해서 양방향 통신을 구현해 보기로 합니다. 방문자가 말하는 음성은 집주인에게 음성 그대로 전달하고, 사용자 폰에서 방문자에게 전달할 메시지는 TTS를 활용해서 실시간 음성/영상 통화로 선회하기로 결정합니다.
특히, TTS(Text-To-Speach)는 무엇보다 한글을 읽어줘야 하는데, 생각보다 한글 TTS 를 지원하는 마땅한 라이브러리를 찾는 것이 쉽지 않더군요. 우선 espeak 라는 라이브러리를 테스트해 보았으나, 이 또한 정식으로 한글을 지원하지 않았고 수동으로 컴파일해야만 합니다. 컴파일 상의 이런저런 문제와 한글이 아닌 영문조차도 사람이 듣기엔 영~ 부자연스러워서 역시 다른 대안을 찾아야만 할 것 같습니다.
다행히, 구글이 제공하는 TTS 서비스를 사용할 수 있었고(정식 지원은 아님), 구글은 역시 한글을 어색함 없이 잘 소화해 냈습니다.. 긴 “삐~~~~” 소리와 짧은 “삐”를 구별해서 말해줄 정도는 아니지만 …
물론, 구글 TTS는 아직 정식으로 서비스하지 않기 때문에 문자를 반복적으로 서버에 요청하게 되는 경우 봇(Bot)으로 오해해서 요청을 차단하는 문제가 여전히 남아있습니다.
| 9월 3일, 사전모임에 다녀오다.
Make Faire 운영진으로부터 참가팀을 위한 사전모임 참석요청 메일이 도착했습니다.
사전모임이 있던 날, 잠깐 머뭇거리는 사이 엄청난 퇴근길 차들과 마주해 버렸네요. ㅠ _ㅠ 필참은 아니라는 말에 귀차니즘이 스믈~스믈~ 발동했지만, 그냥 지각 하더라도 일단 달려서 컴컴한 국립과천과학관 주차장에 도착했습니다. 나중에 기회가 된다면 이 시간 국립과천과학관에 한번 와 보세요. 바로 딱 이렇습니다 ^^;;; 이 시간에 여기서 내가 머 하는 짓인가 싶기도 하고 ㅠ _ㅠ
이미 사전모임은 진행되고 있었고, 연령도 성별도 다양하지만 지극히 평범해 보이는 사람들이 옹기종기 모여 열심히 경청 중이더군요. 사전모임 장소인 무한상상실에 처음 들어선 순간 이런 곳에 이런 공간이 숨어있었구나 라는 감탄과 함께 괜시리 마음이 쿵쾅~ 설렜습니다.
과천과학관에 소재한 무한상상실로서, 디지털 제작 작업을 지원하는 물리적인 공간. 무한상상실은 과학관, 도서관, 주민센터 등 생활 공간에 설치되는 창의적인 공간으로서 국민의 창의성과 상상력이 반영된 아이디어를 발굴하고, 이러한 아이디어를 기반으로 시험 · 제작을 하거나 UCC 제작 · 스토리 창작 등을 할 수 있는 공간.
간단한 일정과 이전 Maker 들의 경험 및 노하우(Knowhow)를 전달받는 짧은 이야기 시간이 진행되었습니다. 사전모임에 직접 참여해보니 이제서야 슬슬 실감이 나기 시작합니다.
그런데….
이 곳에 모인 저 분들, 모두 어떤 의미로 여기에 참여하는 걸까요?
| 9월 9일, 센서들과 주변장치 테스트하기
전체 슈도코드에 생명을 불어넣어 줄 센서들과 주변장치를 달아야 할 시간입니다.
우선 문 앞 초인종은 푸시버튼을 이용하고, LED를 연결해서 센서가 동작하는 시간을 표시하기로 했습니다. 그런데, 푸시버튼을 연결해 LED 켜는 거 말고, GPIO를 통해 푸시버튼이 눌려진 건 어떻게 확인하면 될까요?
gpio.setup(button, GPIO.IN, pull_up_down=GPIO.PUD_UP)
이 때, 다른 기능을 수행하는 동안에도 초인종은 누릴 수 있다는 점을 고려해서, 푸시버튼이 눌리는 것을 GPIO 이벤트를 이용하여 처리하도록 추가했습니다.
GPIO.setup(button, GPIO.IN, pull_up_down=GPIO.PUD_UP)
def my_button_callback(channel):
.... callback function ...
GPIO.add_event_detect(button, GPIO.FALLING, callback=my_button_callback)
GPIO.cleanup()
집 앞에 움직임을 감지하는 용도로는 초음파 센서를 사용하기로 합니다. 물론, 실제 사용에는 사람의 체온을 감지하는 적외선 센서가 더 적합할 수 있으나, 빈번하게 사람이 오고 가는 행사장의 상황을 고려할 때 시연을 위해서는 우선 초음파 센서를 쓰기로 합니다.
초음파센서는 아래와 같이 4개의 pin으로 구성되어 있습니다.
이 중 Trigger 핀에 40khz 펄스를 8번 발생시킨 후, Echo 핀이 High에서 Low 떨어지는 시간을 측정하면 초음파가 이동한 거리를 알 수 있습니다.
거리(distance) = pulse_duration x 17150 (속도 = Distance/Time)
만약, 무언가 중간에 나타나면 원래의 거리보다 짧아지게 되고, 이러한 거리의 변화가 여러 번 반복되면 사람이 있는 것으로 판단할 수 있습니다.
또한, 라즈베리파이에서 기본적으로 지원하는 사운드로는 소리가 너무 작아서 메시지를 제대로 전달할 수 없기 때문에 좀 더 큰 사운드를 얻기 위해 별도의 작은 사운드 카드(DAMOIL 3Dsound2ch-sub USB)를 구매했습니다.
방문자의 부재중 메시지 저장 및 실시간 통화 시 음성 전달을 위해 앙증맞은 소형 마이크도 하나 준비합니다.
이 때, 다음과 같이 설정파일에서 디바이스 우선권을 변경해주면, 새로 장착한 USB 사운드 카드를 디폴트 사운드 디바이스로 사용할 수 있습니다.
“/etc/modprobe.d/alsa.base.conf” 설정파일 변경 :
: options snd-usb-audio index=-2 를 options snd-usb-audio index=0으로 변경.
: options snd_bcm2835 index=1 추가.
어때요, 재미있었나요?
다음 이야기는
Making Story 중 제 2장에서 곧 시작됩니다.
– Coming SoooooooooooooooN –