내용이 길어서 결과만 보고싶은 사람을 위한 결과물 미리보기
원래 목적인 던져서 알람 끄는 방법
충격 감지 스트레스 테스트 해본 결과.
반갑다.
지금은 권고사직 당했지만 출근하기위해 일어나는게 정말 짜증났던 일이 많았던거 같아.
알람이 울릴때 일어나기 너무 힘들고, 기분좋은 알람으로 설정해도 들으면 짜증만 나고
사실 지금도 알람울릴때 일어나려고하면 못일어나기도 하고..
그래서 생각난게 일어나기 위하여 몸을 격하게 움직이는 행동을 유도시켜서 일어나게 하는거야.
덤으로 짜증나는 알람듣고 화난 기분 푸는 것도 같이하는거고.
그러기 위해서 대충 눈앞에있는 친근한 무언가 + 때려도 기분좋을듯한 아이템을 찾았어.
이렇게 실직자 등록하는동안 심심해서 프로젝트를 진행하게 된게 캬루 알람 인형이야.
난 절대로 캬루를 싫어하지 않아! 우연히 캬루가 이 주제랑 어울려서 적용했을 뿐이야. 믿어줘!
만들어 지는 과정에 대한 목차는 다음과 같아.
1. 계획
2. 준비
3. 소프트웨어 제작
4. 하드웨어 제작
5. 실사용 후기
1. 계획
먼저, 처음 제작은 콧코로 인형으로 하려다가 캬루 인형으로 전환하게 된 이유를 하나 설명해줘야 할 듯 싶어.
캬루는 배신자니까. 모든게 납득 될 꺼야.
그러므로 캬루인형에 알람 시스템을 구축한다음에 시간맞춰 울리게되면 던져서 알람을 끄는거야. 이러면 잠깨기 좀 수월하겠지???
그런데 캬루 인형 하나로 무엇을 하기는 어렵다고 보는게 맞아. 좀더 구체적으로 어떻게 해야할지 정해볼거야.
캬루 인형은 생각보다 크지 않아.
무언가를 넣을 수 있는 공간은 100mm x 100mm x 100mm 정도로 되어 있었어.
여기에 인형 하나로 알람을 위한 모든걸 구현하기란 쉽지 않음을 짐작 할 수 있어.
그러므로 스마트폰을 이용한 무선 통신방식으로 진행할까 하고있어.
2. 준비
캬루인형과 무선통신 하기 위해서는 와이파이, 지그비, 블루투스, BLE 를 후보로 놔뒀는데 와이파이와 지그비는 예전 회사에서도 잘 다루지 않았던 물건이고 블루투스(클래식)은 써보면 배터리 소모량이 생각보다 큰편이야.
그래서 BLE (bluetooth low energy, 저전력 블루투스) 를 캬루에 심어야해.
다행히 아두이노중에 나노 라인업에 33 BLE 라는 제품이 있어. 이 제품에는 BLE 외에 IMU, 기압, 온도, 습도 센서 등의 다양한 센서가 모여있고 크기도 40mm x 20mm로 적당해.
인형 내부에서 보이스가 나오도록 해야하니까 음악 재생 모듈과 스피커도 필요해져.
여기서는 dplayer mini 를 사용할거야. sd 카드를 이용한 mp3재생 및 스피커 연결이 포인트야.
스피커는 1W 의 초소형 스피커를 사용하여 동작 시킬예정이야.
둘이 합해서 사이즈는 20mm x 20mm 정도로 작은 편이야.
알람이 울릴경우 던져서 멈추기로 했으니까 충격 감지 센서가 필요해.
SW-18010P 라는 진동 센서모듈을 이용할거야.
이 모듈은 안에 있는 스프링이 충격을 감지하는 방식을 사용하고 있어.
사이즈는 35mm x 15mm 로 괜찮은 것 같아.
앗.. 지금은 3500mAh 배터리로 교체했어
안정성과 크기를 고려하여 리튬폴리머 배터리를 사용하기로 했어.
그리고 5V 승압변환모듈도 같이 구매했어. 리튬폴리머 배터리는 3.7V 정도의 출력만 나오기 때문에 5V로 승압해서 출력해야 할 이유가 있어.
계획에는 없던 물건인데 아두이노 배터리 측정에 문제가 생겨서 사게된 모듈이야. DM452 라는 모듈이고 배터리 전압을 아두이노로 표시해줘.
어플은 항상 해오던거니 준비과정에 크게 안적어도 될 듯 싶다.
3. 소프트웨어 제작.
1) 모듈 기능 구현
먼저 음악재생용 dplayer mini를 확인해볼거야.
rx / tx 연결시에는 크로스 연결해야 한다는 점 잊지마.
코드는 제조 회사에서 기본적인 예제를 주긴하는데 33 BLE의 RX / TX 소켓에 꽃으니 동작이 잘 안되는 현상이 있어서 다른 라이브러리를 이용했어.
여기서는 음악재생, 음악중지, 저전력(버그로 안됨), 등의 기능을 이용 할 수 있어.
SD카드에 0001, 0002, 0003 ..... 의 형식으로 넣은다음에 play() 함수를 이용하여 재생 시킬 수 있어.
1W 초소형 스피커 치고는 성능이 매우 잘 나옴을 확인 할 수 있어.
캬루 보이스는 저번 외국인분에게 받은 프로그램을 바탕으로 구현했어. 캬루 말투를 상상하면서 만들긴했는데 전 혀 똑같지 않다는게 포인트야 ㅠㅠ
충격 감지센서는 아날로그핀에 꽃아서 사용 할 수 있어.
이 제품은 충격 값을 1023 - 0 수치로 보여주기 때문에 세부설정이 용이한 장점이 있어.
영상찍은 당일 패킷작업 도와주던 지인이 놀러와서 음악틀어놨던거 잊고 찍었나봐.. 음악들리는거 양해부탁할게.
충격 발생 시 LED 가 점등됨을 확인 할 수 있어.
아두이노는 스마트폰과 BLE 통신을 하기 위해 패킷 통신 방법을 사용 할 예정이야.
그리고 회사에서 자주 사용하던 패킷 통신 양식을 사용 할 거야.
시작 / ID / 패킷값 / 패킷값 / 사이즈 / 끝 순으로 보낼거야.
이후 스마트폰 (혹은 아두이노) 에서 시작값과 끝값을 찾은뒤 사이즈가 보낸 패킷길이와 맞는지 점검하고 패킷값에 따른 설정 완료하고 답장 패킷 전송을 목표로 하고 있어.
약속대로 지우진 않았다???
지인이 나랑 친해서 스프레드 시트에 장난 쳐 놓고 지우지 못하도록 해놨더라.. 아...
기능 구현을 위한 패킷은 지인을 동원해서 정리를 해놨어.
보답으로 일본여행 갔을때 원하던 물건 다 사줬으니 할 일 다해줬어.
패킷 전송의 분류는 기능상 다음과 같이 분류되어 있어.
1. 처음 연결 시 패킷
- 배터리와 현재 설정된 시간 정보를 공유한다.
2. 배터리 잔량 전송 패킷
- 배터리 잔량 정보를 정기적으로 공유한다.
3. 알람(타이머) 설정 패킷
- 설정된 시간 값과 동작해야할 타이머 카운트를 공유한다.
4. 알람(타이머) 중단 패킷
- 타이머를 중단 시킨다.
5, 설정 불러오기 패킷
- 설정 데이터(사운드, 알람 반복, 음악 리스트, 충격 감도)를 공유한다.
6. 설정 저장하기 패킷
- 설정 데이터(사운드, 알람 반복, 음악 리스트, 충격 감도)를 공유한다.
7. (알람이 울릴 때) 울리는 알람 전송 패킷
- 알람이 울리는 상태에서 스마트폰과 연결 시 알림이 울리고 있음을 공유한다.
8. (알람이 울릴 때) 알람 중지 패킷
- 스마트폰에서 알람 중지 패킷을 전송 할 경우 처리한다.
9. (알람이 울릴 때) 알람 충격 발생
- 알람이 울리는 상황에서 충격 발생 시 스마트폰에 중지됨을 공유한다.
패킷에 대한 상세 내용을 전부 적고 싶은데 너무 많은 내용이 적힐 듯 싶어서 패킷 정리해놨든 스프레드 시트를 공유할게.
여기에 정리 다 해놨어.
https://docs.google.com/spreadsheets/d/1zqOIscimEf2tIPX3FKa5HgBziu-IAGmjvsWRCMEdhH8/edit?usp=sharing
캬루 인형 열심히 패는 패킷 데이터
시트1
초기 연결 패킷(아두이노 -> 안드로이드)
1차 전송,2차 전송
패킷0,패킷1,패킷2,패킷3,패킷4,패킷5,패킷6,패킷0,패킷1,패킷2,패킷3,패킷4,패킷5,패킷6,패킷7,패킷8
시작,ID,값1,값2,값3,사이즈 체크,끝,시작,ID,값1,값2,값3,값4,알람울림,사이즈 체크,끝
A(0x41),F(0x46),배터리100,배터리10,배터리1,7,A(0x5A),A(0x41),G(0x47),10시간,1시간,10분,1분,b/i/e,9,A(0x5A)
초기 연결 결과 패킷(안드로이드 -> 아두이노),데이터 순서,참고사항
패킷0,패...
docs.google.com
마지막으로 알람 카운트를 위한 타이머 인터럽트 구현이야.
타이머 인터럽트를 간단하게 설명하자면, 소스코드로 돌고있는 부분이 아닌 내부 기능를 이용하여 일정 시간마다 태클 걸고 무엇을 하라고 지시 할 수 있어.
아두이노는 소스 사용시 딜레이를 자주 사용하게되어 시간 측정이 많이 꼬이는 편 인데 타이머 인터럽트를 이용하여 카운트를 정확하게 지시 할 수 있어.
(타이머 인터럽트 동작 사진)
이와 같이 1초마다 카운트가 잘 작동함을 알 수 있어.
이제 센서 동작을 위한 코드 작업은 끝났어. 이걸 하나로 합치는 작업을 하면 되는데 이 부분은 어플리케이션 개발과 같이 보여줄게.
2) 아두이노 소스코드 통합 및 어플리케이션 개발
이제부터 나오는 사진은 흰색바탕 : 아두이노, 검은바탕 : 어플리케이션 이야.
어플리케이션의 경우 컨트롤러의 기능만 필요하단 점을 강조할게.
그러므로 메인 액티비티 + 세팅 액티비티 + 블루투스 검색용 액티비티 + 알람 설정 액티비티 로 구현될 예정이야.
메인 액티비티에서는 블루투스 연결 진입, 알람 설정 진입, 세팅 메뉴 진입, 캬루 를 구현 할 거야.
블루투스 연결 과정은 이전 작업에서도 보여준 클래식 연결과 크게 다르지 않긴 한데 중요포인트 하나만 짚고 넘어갈게.
UUID 설정을 클래식에서는 하나만 대충 설정해도 알아서 연결 잡아주는 반면, BLE 는 아두이노 설정 UUID 와 앱 설정 UUID 가 일치해야하고 서비스, TX, RX, 클라이언트 UUID 까지 다 일치해야 연결된단점 참고 부탁할게.
여기서마저 아두이노 TX = 앱 RX 방식은 여전해.
추가로 블루투스 검색을 하게되면 해당 블루투스 리스트 + 수신감도를 확인 할 수 있도록 해놨어.
아두이노 측에서는 블루투스가 연결 이벤트 발생 시 초기연결 패킷 전송을 하도록 해놨어.
초기 연결에서 가져오는 데이터는 알람동작여부, 알람시간 정도야.
캬루만 갖다놓고 있기에는 심심하니까 저번처럼 gif 를 이용하여 눈깜빡이거나 말하는것처럼 꾸미기, 대화 자막등을 구현할거야.
캬루 대화 ui는 이렇게 구상하기로 했어
버튼은 세팅 진입 버튼을 제외하면 하나의 버튼을 이용하여 구현할거야.
캬루 연결 버튼 -> 알람 설정 버튼 -> 알람 중지 버튼 -> 알람 종료 버튼 의 순서로 나타나게 할 거야.
다음과 같이 하나의 버튼에서 구현할 수 있어.
알람과 세팅은 프래그먼트를 이용하여 이동하는 방식을 사용하기로 했어.
추가로 싸구려틱한 애니메이션도 넣어놨어. 난 디자인쪽 하나도몰라서 이게 최대한 잘 구현한거야 ㅠㅠ
알람은 timepicker 를 이용하여 다이얼을 돌리는 방식을 이용할거야.
! 내용 수정 !
초로 단위변환 시도하니 카운트 들어갈때 배터리 소모량이 너무커져서 분단위로 변경.
원하는 시간을 설정하고나서 시, 분을 분으로 단위변환 한 다음에 다음 공식을 이용해서 카운트로 바꿀거야.
시간 계산식
설정된 시간이 현재 시간보다가 작을 경우
(설정된시간) + 24시간 - 현재시간 = 알람시간.
설정된 시간이 현재 시간보다가 클 경우
설정된시간 - 현재시간.
이렇게하면 카운트 해야할 변수가 나오고 이걸 아두이노에서 수신받아서 타이머 인터럽트 동작에 사용하면 끝이야.
세팅메뉴는 누르면 캬루 인형에 사전 설정된 세팅값을 먼저 불러오도록 되어 있어.
만약 캬루 인형에서 저장된 값이 없다면 기본값(자동 알람 X, 볼륨 15, 캬루보이스 알람, 센서 감도 2레벨) 을 전송하도록 할거야.
자동 알람은 해당 알람이 꺼진 경우 1440분(24시간)을 다시 타이머 인터럽트에 적용시키는 방식을 이용 할 거야.
자동 알람을 취소 할 때 까지 이 기능은 계속해서 돌아갈거야.
볼륨 설정의 경우 dfplayer mini 의 볼륨설정 부분에서 0 - 30 의 범위로 설정해달라는 정보가 있었어.
그러므로 seekbar 기능을 통하여 0 - 30 까지 드래그로 설정 할 수 있도록 해놨어.
알람 음악의 경우 spinner를 통해서 음악 리스트중 하나를 선택 할 수 있게 해놨어.
1. 캬루 보이스 사용한 알람
2. lost princess (karyl solo)
3. absolute secret
총 3가지의 알람 음악을 사용 할 거야.
충격 감지 센서는 위에서도 설명 했지만 1023 - 0 의 충격 범위를 감지하도록 되어 있어.
seekbar 의 감도 범위는 1 - 10 인데, 이 값이 아두이노로 넘어가서 x50 한 뒤 감도를 적용하도록 할 거야.
실 적용 감도는 50 - 500 란 이야기야. 기본 값은 2(100) 이고 10(500) 정도면 살짝 들기만해도 감지 될 수 있으니 엄청 민감한 수준이야.
자동 연결 관련은 어플리케이션 내부에서 처리되는 기능이야.
블루투스에 연결되면 현재 연결되었던 캬루 인형의 블루투스 데이터를 SharedPreferences로 저장하게 되는데, 자동연결까지 켜게 되면 어플 시작할때 과정을 생략하고 바로 연결 시도부터 하도록 해줘.
저장된 연결 초기화를 누르면 기존에 저장된 블루투스 연결 데이터는 삭제되도록 해놨어.
기타 기능으로는 배터리 잔량 감지 기능을 넣어놨어.
과방전 주의!
리튬폴리머 배터리는 4.2v 상태가 완충, 3.2v 상태가 방전위험 상태니까 이 사이값을 이용하여 퍼센티지로 환산 시키면 될거야.
문제점은 배터리는 아두이노 33 BLE 기본 배터리 측정 기능 덕분에 아날로그A0에 다이렉트로 연결하면 되지만.. Vin 혹은 A0 에 배터리를 연결 할 경우 5V 핀이 출력 안되는 문제가 있어.
그리고 5V가 기본적으로 비활성화인데 하드웨어 제작 부분에서 활성화 방법을 적어놓을게.
(전압 측정 센서가 fritzing에 없어서 아무거나 사용했음 양해 부탁해.)
그러므로 전압 측정 모듈을 배터리에 연결하고 배터리 입력은 5핀 USB 를 잘라서 넣도록 할거야. 여기는 5V 출력이 가능해. 배터리 측정 센서를 배터리 부분에 연결하는걸로 대체 하도록 할거야.
4. 하드웨어 제작
모든 센서를 아두이노와 연결 할 거야.
dfplayer mini는 rx ->tx, tx->rx, gnd, 5V 에 연결할거야.
여기서 중요한점! 아두이노 나노 33 ble 는 기본 출력이 3.3v로 되어있어. dfplayer의 데이터시트를 보니 3.3v가 지원한다 되어있는데 실제로 써보니 3.3v사용시 전압부족으로 노이즈가 생기는 문제가 있어.
아두이노 뒷부분을 보면 vsub 부분에 납땜할수있는 부분이있어. 여기를 납땜해주면 5v 핀이 활성화 가능하니 연결하고 5v 핀으로 연결해주자.
잘못해서 나처럼 터트리지말고
충격 감지 센서는 gnd, 3.3v, 아날로그A2 핀에 연결하기로 했어.
최대한 공간을 덜 사용하도록 하다보니 합쳐놓은게 외형이 별로 안좋긴한데.. 3일테스트 해보니 별 문제 없더라.
이걸 (55mm x 35mm x 20mm) x2 의 엔클로저 박스에 넣고 하나로합친다음
중학교 기술가정시간에 익혀놨던 서툰 바느질로 마무리를 해놓으면
캬루 알람 인형은 완성이야.
뒷부분에 흰색 5핀 usb 케이블은 충전용도고 검은색 케이블은 pc 연결 및 아두이노 연결용이라 생각하면 될거야.
이렇게 완성했으니 실제 사용이 잘 되나 확인해봐야지!
어플리케이션에서 캬루에게 명령을 내릴 수 있는 기능만 모아놓은 영상이야.
이건 계획대로 알람이 울릴때 던지면 꺼지는 영상이야.
던졌을때 그냥 알람이 꺼지면 심심하니까 캬루 비명소리를 첨가했어.
혹시 모르니 스트레스 테스트를 한번 해보는게 맞다고 생각했어.
야구배트같은 강력한 충격에도 정상적으로 동작하는지 확인 해본 영상이야.
배트의 충격에도 부품이 손상가지 않고 정상적으로 종료됨을 알 수 있어.
테스트 하다보니 이게 떠오르더라
결론은 캬루 인형을 던져보니 생각보다 체력을 쓰게되어서 잠깨는데 문제가 없다고 판단했어.
심지어 던져서 알람 안멈추면 던진곳까지 가서 또 꺼야하거나 스마트폰 켜고 꺼야하니 아주 좋아.
해당 작업에 대한 소스코드는 이전에 작업했던 코드를 참고해서 제작했어. 깃허브를 이용해서 공유 해 놓을게. 혹시 관심있거나 다른 인형에 이식해보고싶다면 한번 참고해봐.
출처: 프린세스커넥트 리다이브 갤러리
[원본 보기]
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.