"호호s - 자전거용 스마트 잠금장치"의 두 판 사이의 차이
MIE capstone
(새 문서: <div>__TOC__</div> ==프로젝트 명== 자전거용 스마트 잠금장치 ==팀 소개== 서울시립대학교 기계정보공학과 2012430007 박대호(팀장) 서울시립대...) |
|||
4번째 줄: | 4번째 줄: | ||
==팀 소개== | ==팀 소개== | ||
− | 서울시립대학교 기계정보공학과 | + | 서울시립대학교 기계정보공학과 20124300** 박*호(팀장) |
− | 서울시립대학교 기계정보공학과 | + | 서울시립대학교 기계정보공학과 20124300** 김*우 |
− | 서울시립대학교 기계정보공학과 | + | 서울시립대학교 기계정보공학과 20124300** 송*원 |
− | 서울시립대학교 기계정보공학과 | + | 서울시립대학교 기계정보공학과 20124300** 이*희 |
==프로젝트 개요== | ==프로젝트 개요== |
2017년 8월 2일 (수) 22:44 판
프로젝트 명
자전거용 스마트 잠금장치
팀 소개
서울시립대학교 기계정보공학과 20124300** 박*호(팀장)
서울시립대학교 기계정보공학과 20124300** 김*우
서울시립대학교 기계정보공학과 20124300** 송*원
서울시립대학교 기계정보공학과 20124300** 이*희
프로젝트 개요
프로젝트 요약
- 열쇠나 비밀번호가 필요 없는 자전거용 자물쇠를 제작한다. 자물쇠는 카드나 스마트폰을 가져다 대는 방식으로 잠기고 열린다. 또한, 도난 방지 알림을 통해 도난을 방지할 수 있다. 자물쇠는 수갑의 형태로 자전거 프레임에 장착된 채로 바퀴를 프레임과 묶어주는 역할을 한다.
프로젝트 배경
- 2016년, 세계 경제 포럼인 다보스 포럼에서는 제 4차 산업혁명이 우리가 사는 모습을 바꿀 것이라고 예측했으며 Embedded System은 그 핵심이라고 할 수 있다. 그리하여 일상생활에서 자주 사용하는 작고 간단한 구조의 물건 중, 컴퓨터를 이용하여 다양하게 활용할 수 있는 것을 찾아보았다. 그 결과 최종적으로 자전거 자물쇠에 Embedded System을 적용해보자는 결론을 내렸다.
자전거는 학생이나 직장인들에게 좋은 이동수단이다. 출퇴근 시간의 복잡한 교통을 피하거나 교통비를 줄이고 부족한 운동량을 채우는 목적으로도 많이 사용된다. 서울시나 대전시는 무인 자전거 대여시스템을 운영하여 자전거 사용을 간접적으로 유도하고 있다. 하지만 자전거의 이용이 많아지는 만큼 도난사고도 빈번히 발생한다. 따라서 자전거 이용의 불편함을 해소하고 도난을 방지할 수 있는 자물쇠를 직접 만들어 자전거를 편리하고 안전하게 이용하고자 한다. 그 과정에서 근거리 통신기술의 하나인 NFC를 이용하여 프로그래밍을 해보면서 NFC를 이해하는 좋은 경험 또한 얻을 수 있을 것이다.
프로젝트 목적
- NFC 기술을 활용하여 쉽고 빠르게 개폐 할 수 있는 자물쇠를 만든다. 도난을 감지하여 사용자에게 알릴 수 있도록 한다.
프로젝트 기대효과
- 기본적으로 이 자물쇠는 열쇠를 소지하고 다니거나 비밀번호를 기억하는 것을 스마트폰을 가져다 대는 것으로, 주렁주렁 매달고 다녀야 하는 형태를 프레임에 고정된 형태로 대체한다. 이는 자전거의 소유자가 자물쇠를 열지 못하는 상황을 방지하고 자물쇠를 가지고 다니는 행위 자체의 불편함을 줄여준다. 또한 이를 응용한다면 사용자가 원거리에서 스마트폰과 자물쇠를 연동하여 알림을 받거나 배터리의 잔량을 확인할 수도 있을 것이다.
이미 외국에서 본 프로젝트와 같은 형태의 블루투스를 이용한 자물쇠가 판매되고 있지만 이는 한화로 10만원을 상회하는 비싼 금액으로 쉽게 구매하기는 어렵다는 단점이 있다. 하지만 이번 프로젝트를 통해 그보다 훨씬 저렴한 가격으로 기능을 충실히 수행하는 자물쇠를 제작한다면 가격부담을 줄일 수 있다. 또한 블루투스를 사용하는 경우 스마트 폰으로 pairing 하여 조작하는 방식이 귀찮을 수 있고 pairing 하지 않고 가까이 다가갔을 때 잠금이 자동 잠금/해제되는 방식은 사용자가 원하지 않은 때에 작동될 수 있다는 단점을 가지고 있다. 따라서 이를 NFC를 이용하여 약간의 불편함은 감수하고 잠금과 해제를 확실하게 실행하는 방향으로 기존의 제품과 차별화를 할 수 있다.
프로젝트 기간
2017. 03. 03 ~ 2017. 06. 16
프로젝트 제안
개발 목표
NFC를 이용한 RFID 식별과 모터 제어
- NFC를 이용하여 자물쇠에 특정한 ID를 등록하고, 등록된 기기나 카드만 자물쇠를 작동시킬 수 있도록 함. 등록된 RFID가 자물쇠에 접촉되면 모터를 제어하여 바퀴를 수갑으로 채우는 모양으로 고정함.
가속도센서, 자이로센서를 통한 충격과 의도하지 않은 이동 감지 및 소리알림
- 가속도센서(혹은 자이로센서)를 사용하여 자물쇠를 훼손하려는 시도(절단, 파괴)를 감지한다. 또한, 자물쇠를 훼손하지 않고 그대로 이동시키는 것 역시 감지하고 절도 상황인지 판단한다. 절도 시도가 감지되면 스피커에서 큰 소리를 내어 주변 사람들에게 절도 상황을 인지시킨다.
시나리오
개발 일정
추진 체계
팀원 명 | 역 할 |
---|---|
박대호 | 팀장, 전력제어 파트, 스텝모터 구동 |
김현우 | NFC 태그 파트, 소프트웨어 통합 |
송지원 | 도난 감지 알고리즘 설계 및 코딩 |
이용희 | 회의록 및 기타 문서 작성, 자물쇠 하드웨어 제작 |
프로젝트 설계
설계 사양
결과물 요구사항
번 호 | 자전거용 스마트 잠금장치 필요사항 (D) | 산출 값 | 목표치 | 중요도 |
---|---|---|---|---|
1 | 도난을 정확히 감지 하는가 | 알림횟수 / 실험횟수 | 95% 이상 | 상 |
2 | 배터리를 장시간 사용할 수 있는가 | 사용시간(20000mh) | 168시간 이상 | 상 |
3 | 사용자를 등록할 수 있는가 | - | - | 상 |
4 | 잠금장치 메커니즘이 의도대로 작동하는가 | - | - | 상 |
5 | 사용자를 정확히 인식 하는가 | 인식성공 / 시도횟수 | 95% 이상 | 상 |
6 | 자전거 운행에 방해되지 않는가 | - | - | 중 |
번 호 | 자전거용 스마트 잠금장치 희망사항 (W) | 산출 값 | 목표치 | 중요도 |
---|---|---|---|---|
1 | 예외상황을 필터링하는 알고리즘을 구현 하였는가 | - | - | 상 |
2 | 메커니즘이 간단한가 | linkage/actuator 수 | 4/1 | 상 |
3 | 사용자 정보의 자체 보안요소가 있는가 | - | - | 중 |
4 | 자체 충전이 가능한가 | - | - | 중 |
5 | 알림이 직관적인가 | - | - | 하 |
목적계통도
- 편리성
- - 기존의 자전거 자물쇠의 경우 사용자가 자물쇠를 풀어서 고리를 바퀴에 감아서 잠그는 번거로운 일을 매번 해야 했다. 특히 겨울철에는 유연해야 하는 자물쇠 고리가 얼어버리는 일도 발생한다. 이에 비하여 디지털 통신을 이용하여 자전거 잠금을 개폐하는 것은 자물쇠를 사용하는 과정을 획기적으로 단순화시킨다.
- 정확성
- - 디지털 정보로 사용자를 판단하는 장치의 특성상 장치가 사용자를 정확히 인식할 수 있어야한다. 사용자가 단 한 번의 동작으로 장치를 작동시키지 못한다면 기존의 번거로운 동작들을 최소화한다는 장점이 퇴색될 것이다.
- - 충격은 센서를 통해 감지되고 프로세서는 도난상황이 발생했다고 판단한다. 그러나 모든 충격이 도난상황에서 발생하는 것은 아니다. 따라서 잠금장치는 감지된 충격이 의도적인 충격인지 정확하게 판단하고 예외상황에서의 충격에는 반응하지 않아야 한다.
- 보안성
- - 이름에서 확인할 수 있듯이 보안성은 자전거용 스마트 잠금장치에서 매우 중요한 요소이다. 여기서 디지털 통신을 통한 사용자 인식은 가장 기본적인 보안역할을 수행하게 된다. 자물쇠는 사용자가 자전거의 주인인지 아닌지를 잘 판별하고 이에 따라 잠금장치를 구동시킬 수 있어야 한다.
- - 잠금장치는 외력에 의해서 열려서는 안 되며 오직 사용자 인식에 의한 내부 구동만으로 잠금장치의 개폐가 수행되어야 한다. 이를 위한 잠금 장치의 메커니즘을 설계하는 것이 중요하다.
- - 도난 감지 시스템은 자전거의 도난 및 훼손을 예방하는데 핵심적인 역할을 수행한다. 충격 발생 시 예외상황에서는 반응하지 않는 것도 중요하지만 그 것을 위해서는 충격의 유무부터 판단해야한다. 또한, 잠금 장치를 파괴하지 않고 행해지는 도난도 인지할 수 있어야한다.
- 심미성
- - 잠금장치를 설치 시 외관상 자전거와 어울려야 한다. 따라서 잠금장치의 적절한 위치와 크기를 결정하는 것이 중요하다. 또 이러한 제약 조건상에서 구동할 수 있는 잠금장치 메커니즘을 설계하는 것이 중요하다.
- 경제성
- - 잠금장치의 내부 메카니즘에 필요한 파트와 액추에이터가 많다면 잠금장치를 제작하는 비용이 증가할 것이다. 따라서 필요한 파트수가 적으면서도 동력전달을 효율적으로 해야 하는 것 역시 고려해야한다.
- - 아날로그 자물쇠를 디지털 기기로 대체함에 있어서 전력문제는 생각보다 크게 다가올 수 있다. 이동수단이라는 특성상 자전거에 장착될 장치는 전원으로 배터리를 사용할 수밖에 없다. 따라서 전력소모를 줄이거나 배터리가 자전거 운행하며 자체적으로 충전되는 등의 방법으로 배터리 유지시간을 확보하는 것은 중요한 문제이다.
- 편리성
설계안
종합구성도
설계 내용
- 사용자 인식(NFC VS Bluetooth)
- 사용자 인식(NFC VS Bluetooth)
- - NFC는 근거리 10cm 통신거리로 매우 간단한 인터페이스이다.
- - NFC는 짧은 통신거리로 인하여 보안성이 매우 높다.
- - 블루투스는 통신거리가 10m이상으로 NFC에 비해 긴 편이지만, 그로인해 사용자 인식 정보를 감청당할 가능성이 있다.
- - 블루투스 사용을 위해서는 블루투스 장치끼리 pairing을 해야 한다는 번거로움이 있다.
- 도난감지 시스템(속도/자이로센서 VS 충격센서)
- 도난감지 시스템(속도/자이로센서 VS 충격센서)
- - 속도/자이로센서는 가속도와 자이로 모두 측정하며, 알고리즘을 통해 그 값으로 도난상황을 판단할 수 있다.
- - 충격센서는 충격의 유무만을 판단한다. 0과 1의 출력값으로 예외상황을 필터링 하기 힘들다.
- 전력 제어(Raspberry Pi zero VS Sleepy Pi)
- 전력 제어(Raspberry Pi zero VS Sleepy Pi)
- - Pi zero는 라즈베리파이중 전력소모가 가장 낮은 Pi이다.
- - Sleepy Pi는 타이머와 이벤트를 사용하여 필요할 때만 파이를 사용하게 해준다.
- - 이를 이용해 오랫동안 사용할 수 있으나 미 사용시 라즈베리파이의 전원을 차단하고 다시 사용할 때 부팅시간이 걸리는 단점이 있다.
- 메커니즘 구조(자체 제작 VS 특허만료된 수갑자물쇠)
- 메커니즘 구조(자체 제작 VS 특허만료된 수갑자물쇠)
- - 직접 설계한 웜과 웜기어를 사용한 메커니즘을 이용한다. 핵심 파트수가 줄어들 뿐더라 전체크기도 작게 만들 수 있다.
- - 특허가 만료된 수갑 자물쇠의 경우 잠금의 핵심 파트가 원의 내부에 있기 때문에 자전거 자물쇠에 적합하지 않다.
프로젝트 결과
기구부 구현
Modeling
-
- 잠금장치 메커니즘을 이루는 구조는 크게 웜과 웜 기어로 구성되어있다.
- 모터는 웜과 연결되어 회전할 경우 웜이 웜기어로 동력을 전달한다.
- 웜 기어는 케이스의 홈을 따라 이동하며 잠금이 이루어진다.
- 웜과 웜 기어는 역전이 가능하지 않으므로 고리가 동력을 전달받지 않는 경우 고정되게 된다.
- 웜이 반대로 회전할 경우 케이스의 홈을 따라 잠금고리가 이동하게 되고 고리가 열리게 된다.
- 결과물은 3D 프린터를 이용하여 FDM방식으로 ABS를 사용하여 출력하였다.
- 사용 프린터 : Cubicon Style (FDM방식)
Worm & WormGear
- 자물쇠의 핵심 파트
- 역전은 불가능하다는 특징을 살렸다.
- 웜은 모터와 직접 연결되어 돌아간다.
- 웜기어는 웜으로부터 동력을 받은 뒤 CaseTop의 지지부분과 Case세트의 홈을 따라 이동한다.
- 웜기어가 끝까지 돌아갈 경우 웜기어 내부의 홈 끝에 걸려 고정된다.
- 자물쇠의 핵심 파트
- - Value -
- 웜 줄수 : 2
- 기어 잇수 : 31
- 축방향 모듈 : 2mm
- 압력각 : 20°
- 틈새비율 : 0.25
- 웜 피치원지름 : 18mm
- 웜기어 피치원지름 : 96mm
- 웜기어 축각 : 80°
- 웜기어 폭 : 10mm
- 웜 줄수 : 2
MotorHolder & WormHolder
- 모터와 웜을 고정하는 파트
- CaseTop, PiCase와 홈으로 연결된다.
- 내부의 큰 홀에서 웜이 회전한다.
- 모터와 웜을 고정하는 파트
CaseTop & CaseBottom
- CaseTop
- 직접 자전거에 달리는 케이스 파트
- CaseBottom, Motor&WormHolder과 홈으로 연결된다.
- WormGear가 원하는 운동을 할 수 있도록 지지 해 주는 역할을 한다.
- MotorHolder와 함께 모터를 고정시킨다.
- CaseTop
- CaseBottom
- CaseTop과 한 세트인 케이스 파트
- WormGear가 원하는 운동을 할 수 있도록 지지 해 주고, 밖으로 나가지 않도록 CaseTop을 막아주는 역할을 한다.
- CaseBottom
PiCase & PiCaseRoof
- PiCase
- 직접 자전거에 달리는 케이스 파트
- CaseBottom, Motor&WormHolder과 홈으로 연결된다.
- WormGear가 원하는 운동을 할 수 있도록 지지 해 주는 역할을 한다.
- MotorHolder와 함께 모터를 고정시킨다.
- PiCase
- PiCaseRoof
- PiCase를 덮는 파트
- PiCase와 홈으로 연결된다.
- Pi의 전원을 공급하는 부분이 뚫려 있다.
- PiCaseRoof
제어부 구현
전력 제어
- 슬리핑 파이는 라즈베리파이의 전원을 완전히 차단하여 전력을 관리하는 것으로 확인되었다. 따라서 라즈베리파이 제로라는 저전력 파이를 구매했다. 기존 라즈베리파이3 대비 아이들 상태에서 전력소모가 절반 이하로 떨어진 것으로 확인 되었고 모든 센서를 연결하여 전력을 측정해본 결과 5V, 130mA로 확인되었다. 이는 3.6V 20,000mAh 보조베터리 기준으로 약 4.4일(5V 95% 변환효율 기준 13,680, 24시간 구동 기준) 정도 유지가 된다는 것이다. 사실 파이 제로만의 전력소비량이 100mAh정도여서 라즈베리파이만으로 전력량을 줄이는 데에는 한계가 있었다. 프로젝트 진행 여건상 전력소비량이 더욱 낮은 아두이노로 진행하기에는 한계가 있었고 추후 창의공학설계경진대회에 출품하게 된다면 아두이노로 변경하여 출품할 계획이다.
스텝 모터 제어
- 스텝모터의 경우 여러 종류가 있는데 토크가 비교적 높은 2상 바이폴라 방식을 사용하였다.
- 2상 바이폴라 방식은 항상 2개의 상에 직류를 흐르게 하는 방식이며 토크가 높은 특성을 가지고 있으며 제동 효과도 가지고 있다.
회로도
도난감지 소프트웨어 구현
- - 소프트웨어는 기본적으로 C언어로 작성되었다. 프로그램은 두 개의 Thread로 나뉘어서 작동한다. 이 중 도난감지를 담당하는 Thread의 경우 가속도/자이로 센서(mpu-6050)를 사용하여 x,y,z의 3축에 대한 센서 자체의 가속도, 각속도 값을 읽어온다. 읽어온 데이터는 칼만 필터를 거쳐 보정된 후 충격을 판별하는 것에 사용되고, 충격이 감지될 때 까지 새로운 데이터를 계속해서 읽는다. 충격이 감지되면 자전거가 넘어진 상황인지 판별하기 위해 현재 센서의 회전각을 상보필터를 이용하여 구해낸다. 회전각을 이용해 자전거가 넘어진 상황이 아니라고 판단되면 메인 Thread에 전역 변수를 변경하는 방법으로 도난상황을 알린다.
- - 가속도/자이로 센서는 WiringPi 라이브러리를 이용하여 Pi와 I2C 통신을 한다. 센서의 데이터는 강한 충격을 감지하는 데에 사용됨으로 정밀한 값이 필요하기보단 측정 가능한 범위가 넓을 필요가 있다. 따라서 레지스터 값을 약간 수정하여 데이터의 민감도를 수정하였다.(자이로 센서 : default ±250°/s -> ±1000°/s, 가속도 센서 : default ±2g -> ±8g)
- - 센서를 통해 얻은 데이터는 칼만 필터를 거치게 된다. 칼만 필터는 센서가 데이터를 센싱하는 과정에서 발생할 수 있는 노이즈를 제거하는 알고리즘이다. 칼만 필터는 다음 상태를 예상한 값을 실제 측정값과 비교하여 이전에 얻은 데이터를 교정하는 과정을 거쳐 최종 데이터를 산출한다. 이러한 과정은 실제 값을 신뢰하지 않기 때문에 노이즈가 없는 정확한 데이터를 정확하지 않은 데이터로 교정할 수 있다는 큰 단점이 있지만 대부분의 경우에 적당한 결과를 산출할 수 있다는 점에서 많이 사용되고 있다.
- - 충격 판별은 미리 설정한 값과 데이터를 비교하는 방식으로 수행된다. 각속도의 경우 센서가 안정적인 상태라면 그 값이 모두 0에 가까운 값이므로 특정 각속도의 절댓값이 미리 정한 값보다 크다면 충격이라고 감지한다. 시행착오 결과 각속도 값이 ///////////////////360°/s/////////////// 이상이면 충격이라고 인식하도록 설정하였다. 둘 이상의 축에 대한 각속도 값이 변하는 상황은 자전거의 구조상 발생하기 힘드므로 고려하지 않았다.
- - 가속도의 경우 센서가 안정적인 상태를 유지하더라도 중력에 의한 가속도 값이 항상 존재하고, 그 방향은 센서의 회전각에 따라 다르기 때문에 특정한 크기의 절댓값을 설정하는 것만으로는 충격을 감지하는 것에 무리가 있다. 따라서 가속도 값은 직전의 데이터와 현재의 데이터를 비교하여 그 차이를 모니터링 하는 방법으로 충격을 감지하도록 하였다. 시행착오를 거친 결과 그 차이가 ///////////////4m/s2////////// 보다 클 경우 충격이라고 인식하도록 하였다. 이 경우 충격뿐만이 아니고 자전거를 이동시키는 상황역시 감지할 수 있기 때문에 자물쇠가 잠겨있는 채로 자전거를 들고 가는 것 까지 잡아낼 수 있다.
- - 회전각의 계산은 atan과 중력방향 가속도를 이용하는 방법과 각속도 값을 적분하는 방법으로 수행한다. 방향이 일정한 중력에 의한 가속도를 이용하여 센서가 어떻게 회전해있는지를 계산하는 것이다. 하지만 가속도를 경우 센서가 힘을 받아 이동하는 중에는 계산한 값이 현재 회전각과는 전혀 상관없는 값이다. 또한, 각속도를 이용하는 경우는 회전각의 변화만을 계산할 수 있기 때문에 정지 상태에서의 회전각을 알 수 없다. 따라서 이 두 값을 모두 이용하여 하나의 보정된 회전각 값을 도출하는 방법이 필요하고, 이 프로젝트에 사용한 방법이 상보필터이다. 상보필터는 각속도에 시간 간격을 곱한 값, 가속도로 계산한 각도, 이전 시간의 각도를 모두 이용하여 하나의 보정된 회전각을 산출해낼 수 있는 필터이다. 결과적으로 센서가 정지해있든, 움직이는 상태이든 적당한 회전각 값을 얻을 수 있다.
- - 적당한 회전각을 얻었으면 이를 가지고 자전거가 넘어진 것인지 판별한다. 만약 자전거가 넘어지는 상황인 경우 충격감지는 자전거가 넘어지기 시작하는 순간에 감지된다. 따라서 회전각으로 넘어짐을 판별하기 위해서는 약간의 시간이 필요하다. 따라서 충격이 감지된 순간부터 200개의 데이터를 추가로 센싱하고 회전각의 변화량을 누적한다.(안정된 상태에서의 회전각이 0이 아닐 수 있으므로 회전각의 변화량을 사용한다.) 그 후 시행착오를 통하여 얻은 ///////////////45°////////////보다 회전각 변화량이 작으면 도난이 발생한 상황이라고 인지하고 전역변수를 수정하여 main thread에 알린다.
- - 전체 루프는 지정한 주기마다 실행된다. 현재 시간의 ms단위 값을 이전 시간과 비교하여 그 차이가 지정한 주기보다 짧다면 지정한 주기만큼의 시간이 흐를 때 까지 기다린 후 다시 루프를 시작한다. 만약 그 차이가 지정한 주기보다 길면 그 다음 주기까지 기다린 후 루프를 실행한다. 루프가 실행되지 못한 만큼 데이터를 이전 값으로 로깅 하여 데이터 사이의 시간간격이 일정하도록 한다.
- - 필요에 따라 센싱한 데이터를 텍스트 파일에 로그하여 그래프를 그릴수 있도록 한다. 그래프는 gnuplot이라는 패키지를 사용하여 그려보았으며 충격 혹은 넘어짐을 판별하기 위한 비교 값을 산정할 때 유용하게 사용하였다.
시스템 소프트웨어 구현
0libnfc 및 libfreefare 오프소스 라이브러리 사용
- 본 프로젝트는 libnfc 및 libfreefare라는 오프소스 라이브러리의 토대 위에서 시작되었다. NFC 라는 생소한 프로토콜을 사용하기 위해 당장 소프트웨어를 설계하고 작성하기 앞서 NFC 프로토콜을 공부하고, 제공되는 예제코드를 분석하였으며, 본 프로젝트의 소스 코드 역시 예제 코드를 조금씩 수정하고 다듬어가면서 완전히 새롭게 태어났다. 소스코드에 포함된 거의 모든 함수와 프로시져는 새롭게 작성된 것이지만 제공된 라이브러리로부터 다음 사항에 있어 크게 도움을 받을 수 있었다.
- (1) NFC 저수준의 프로토콜 스택을 구현해 놓은 API를 사용하여 NFC 프로토콜의 깊은 이해 없이도 프로젝트를 진행할 수 있었다. API는 예제코드에서 사용된 함수와 다음의 사이트에서 도움 받았다.(http://www.libnfc.org/api/index.html)
- (2) libnfc 및 libfreefare 라이브러리를 사용하는 소스 코드를 컴파일하는데에는 복잡한 옵션이 필요하다. 우리는 라이브러리에서 제공되는 Makefile를 수정하여 사용하였다.
사용자 인식 모듈
- 사용자 인식 모듈은 NFC 태그를 이용하여 사용자를 인식하는 핵심적인 모듈이다. 사용자 인식 모듈은 크게 두 개의 함수로 구성되며 각 함수는 또 여러 개의 서버함수로 구성된다.
- (1) MifareTag *get_only_one_tag (nfc_device *device)
- 이 함수는 이름에서도 알 수 있다 시피 오직 한 개의 태그만 인식할 수 있게 해주는 일종의 필터 역할을 수행한다. 여러 개의 태그가 동시에 인식된다면 이 함수에서 실패하고 한 개의 태그만 인식될 때가지 반복해서 이 함수를 호출하게 된다. 이 함수의 입력 인자는 시스템에 연결된 NFC 디바이스이며, 출력 값은 디바이스가 인식한 태그에 대한 정보이다. 이 함수는 사실 libfreefare에서 제공하는 freefare_tag_new 함수의 wrapping 함수라 할 수 있으며 하는 역할은 거의 비슷하다.
- 이 함수는 직접적으로 사용자 인식을 수행해주는 함수이다. 입력 인자는 get_only_one_tag로부터 받은 태그 정보이고, 출력 값은 태그의 UID와 그 UID가 실제로 매치되는 UID인지 알려주는 매치정보로 구성된 구조체의 포인터이다. 이 함수를 도식화 하면 다음과 같이 구성된다.
- 이 함수는 내부에 read_uid와 compare_uid라는 서비함수로 구성되는데 read_uid함수는 tag정보로부터 uid값을 읽어내며, compare_uid함수는 해당하는 UID가 파일로 관리되는 UID LIST에 존재하는지 확인하여 매치정보를 알려주게 된다.
- (2) tagUid* user_recognition(MifareTag *tag)
- 이 함수는 직접적으로 사용자 인식을 수행해주는 함수이다. 입력 인자는 get_only_one_tag로부터 받은 태그 정보이고, 출력 값은 태그의 UID와 그 UID가 실제로 매치되는 UID인지 알려주는 매치정보로 구성된 구조체의 포인터이다. 이 함수를 도식화 하면 다음과 같이 구성된다.
- 이 함수는 내부에 read_uid와 compare_uid라는 서비함수로 구성되는데 read_uid함수는 tag정보로부터 uid값을 읽어내며, compare_uid함수는 해당하는 UID가 파일로 관리되는 UID LIST에 존재하는지 확인하여 매치정보를 알려주게 된다.
UID 관리 모듈
- UID는 앞서 말했다시피 파일로 관리된다. 이는 배터리 소진 등의 이유로 시스탬이 꺼지는 경우에도 사용자의 UID를 보관하기 위함이다. 하지만 프로세스가 UID에 대한 정보를 관리하기 위해서는 이 정보를 파일로부터 읽어들여 프로세스가 관리하기 편한 자료구조로 관리할 필요가 있다. UID는 새로운 사용자 등록 및 삭제에 따라 삽입, 삭제가 가능해야 하고, 또한 사용자 인식을 위하여 탐색 또한 수월하게 지원하는 자료구조로 표현할 필요가 있다. 등록될 UID 수가 많지 않을 것으로 예상하지만 그 개수에 제한을 두진 않았기 때문에 우리는 UID를 연결 리스트로 관리하기로 하였다. 연결리스트의 경우 탐색의 경우 데이터의 크기에 비례하는 선형 탐색시간을 가지고, 삽입ㆍ삭제가 비교적 용의하다.
- 따라서 시스템은 UID를 파일에 <>로 감싸인 형태로 보관하고, 프로세스는 이를 파싱하여 UID로 구성된 연결 리스트를 구성하다.
STATE DIAGRAM
- 시스템을 구동하는 프로세스는 사실상 아래 표현된 상태 다이어그램 자체라고 말할 수 있다. 시스템은 두 개의 스레드로 구성되는데 main 스레드는 아래 표현된 상태 다이어그램을 수행하게 되고, 다른 하나의 스레드는 도난 감지 역할을 수행하게 된다. 즉, 도난 상태로 상태 천이를 일으키는 이벤트는 도난 감지 스레드가 만들어 주는 것이다.
- 상태 다이어그램을 간단히 설명하자면 시스템은 처음에 IDLE 상태에서 시작한다. IDLE 상태만이 다른 상태로 전환될 수 있다. 이때 사용자가 NFC 태그를 통해서 인식되게 되면 MOTOR CONTROL 상태로 전환되고 잠금 장지 개폐가 수행된다. 만약 태그를 인식시킬 때 스위치를 동시에 누르고 있으면 REGISTER 상태로 전환되고, 새로운 NFC 태그를 등록하거나 삭제할 수 있게 된다. IDLE 상태를 제외한 모든 상태는 해당 상태의 태스크를 완료하거나 실패하면 IDLE 상태로 회귀하여 다른 이벤트를 기다린다. IDLE 상태에서 도난 감지가 일어나면 도난 상태로 전환되며, 부저를 통해 경보음을 알림으로써 도난 예방을 수행한다. 이 때 사용자가 NFC 태그로 인식해 주면 다시 IDLE 상태로 전환된다.
IDLE STATE
- 앞서 설명했듯이 IDLE 상태는 사용자의 인식을 기다리면서 특정 이벤트에 따라서 다른 상태로 전환을 수행한다. 이를 아래 그림으로 도식화 하였다.
- IDLE 상태에서는 사용자 인식 모듈의 함수들을 적극적으로 활용한다. 처음에는 하나만의 태그를 인식하기를 기다리면서 도난 감지 스레드에 의하여 warning 변수가 set되었는지 검사한다. 만약 set되었다면 도난감지 상황이 발생한 것이므로 도난(ALARM) 상태로 변경을 수행한다. 도난 상황이 아닌 상태로 하나의 태그가 인식되면 등록된 사용자 인지 확인 후에 적절한 상태로 전환해 준다.
MOTOR CONTROL STATE
- IDLE상태에서 사용자 인식이 일어나게 되면 MOTOR CONTROL 상태가 된다. 이 상태에서 모터는 현재 잠금 장치의 상태를 확인 한 후, 잠금 장치의 개폐를 수행하게 된다. 잠금 장치의 개폐는 스탭 모터가 정해진 각도를 회전하므로써 가능하다.
REGISTER STATE
- IDLE 상태에서 스위치를 누른 상태로 사용자 인식을 하게 되면 REGISTER 상태가 된다. REGISTER 상태는 사용자 인식 모듈과 UID 관리 모듈을 모두 적극 활용하게 된다. 이 상태의 동작을 도식으로 나타내면 다음과 같다.
- 아래의 UID 등록과 삭제 함수에서 연결 리스트의 조작이 길어나게 된다. 예를 들어 UID 등록의 경우 파일에서 연결리스트 생성, 노드 생성, 노드 삽입, 연결리스트를 파일로 저장 등의 순서로 프로시져가 진행된다.
ALARM STATE
- 도난 감지 스레드가 도난 감지를 하게되면 공유변수 warning을 1로 set하고 IDLE 상태에 있던 메인 스레드는 이를 감지하고 st를 ALARM으로 설정한다. 이 후에 ALARM 상태 함수가 실행되어 사용자 인식이 일어날 때가지 무한히 실행된다. 이 상태에서는 부저를 울리며 주변에 경고음을 낸다. 라즈베리파이에서는 PWM 사용에 어려움이 있어 본 프로그램에서는 delay함수로 인위적인 사각파을 생성해주었다.
제약사항
메카니즘
- 강도 면이나 마찰면에 있어서 더 좋은 재료(금속)가 존재하지만, 프로젝트간 직접 파트를 만들 수 있는 가능한 방법이 3D프린팅이라는 방법으로 한정된다.
- 모터나 NFC기판 뿐만아니라 여러 부속품까지 포함하여 제품의 내부에 넣기에 크기가 지나치게 커질 수 있다. 꼭 필요하고 중요한 부품을 선별하여 내장한다.
- 3D프린팅은 필라멘트를 녹여 적층하는 FDM 방식이라는 점에 있어서 곡면을 만들기가 쉽지 않고, 또한 각이 있는 구조가 더 튼튼한 경우가 많다. 따라서 필수적인 부분을 제외하고는 강도나 프린팅 퀄리티를 위하여 곡면보다는 각이 진 디자인을 우선한다.
도난방지 알고리즘
- 우선 충격감지 알고리즘 자체에 허점이 많다. 충격 상황에서는 가속도/각속도 값이 변화함이 자명하지만 가속도/각속도 값이 변한다고 해서 모두 자물쇠에 충격이 가해지는 상황이지는 않다. 이를 해결하기 위해서 많은 예외상황을 추가해야 하지만 사실상 예외 상황과 충격 상황의 데이터 변화 특징을 그래프와 데이터 값을 육안으로 도출하는 것이 불가능에 가까웠다. 또한, 상보필터와 칼만필터를 분석하는 것에 소요된 시간이 상당하여 다른 예외상황을 생각하기도 힘들었다.
최종 프로젝트 결과물
다음으로 작동 시나리오별 동영상을 보시겠습니다.
동영상은 왼쪽부터 Motor Control State, Register State, Alarm State 입니다.
파일:Motor control.mp4 | 파일:Register.mp4 | 파일:Alarm.mp4 |
프로젝트 평가
팀원 역할 분담 및 평가
팀원 | 역할 | 완성도 |
---|---|---|
박대호 | 팀장, 전력측정 및 관리, 스텝모터 구동, 하드웨어 설치, 자제 주문 | 상 |
김현우 | NFC 태그 연구 및 코딩, 소프트웨어 통합, 에러 디버깅 | 상 |
송지원 | 도난 감지 알고리즘 설계, 부저 코딩, 센서값 저장 및 그래프화 | 상 |
이용희 | 회의록 및 기타 문서 작성, 자물쇠 하드웨어 모델링, 하드웨어 3D 프린팅 | 상 |
결과물 평가
평가 항목 | 세부 항목(희망사항-w) | 평가 방법 | 중요도 | 개별 평가 | 전체 평가 |
---|---|---|---|---|---|
NFC | 사용자를 등록 할 수 있는가 | - | 상 | 성공 | 상중 |
사용자를 정확히 인식하는가 | 인식 성공 / 시도 횟수 | 상 | 19 / 20 | ||
사용자 정보의 자체 보안요소가 있는가(w) | NFC 인식 | 중 | 실패 | ||
충분히 빠르게 인식하는가 | NFC 응답 시간 20회 반복측정 | 상 | 1s | ||
도난 감지 시스템 | 도난을 정확히 감지하는가 | 알람횟수 / 실험 횟수 | 상 | 35 / 50 | 중상 |
알람이 직관적인가(w) | - | 하 | 실패 | ||
예외상황을 필터링하는 알고리즘을 구현하였는가(w) | - | 상 | 성공 | ||
모터 및 메커니즘 작동 | 잠금장치 메커니즘이 의도대로 작동하는가 | - | 상 | 성공 | 상 |
메커니즘이 간단한가(w) | linkage / actuator 수 | 상 | 2/1 | ||
자전거 운행에 방해되지 않는가 | - | 중 | 성공 | ||
전력 제어 | 베터리를 장시간 사용할 수 있는가 | 사용시간(20000mAh)기준 | 상 | 성공 | 상중 |
자체 충전이 가능한가(w) | - | 중 | 실패 |
느낀점
이번 프로젝트를 통해 프로젝트의 시작부터 끝까지 모두 경험해 볼 수 있었던 것같다. 처음 기획당시만 해도 단순히 아이디어에 불과했던 생각들이 친구들과 함께 협력하여 점차 완성품으로 되어가는 과정을 경험하는 것은 굉장히 값진 경험이었다. 이번 프로젝트는 사실 나에게 굉장히 도전적인 일이었다. 오픈소스를 분석하고 이해하고 활용하는 경험을 꼭 하고 싶었던 나에게 이번 프로젝트에서 libnfc라는 오픈소스를 분석하고 공부해서 나만의 프로그램을 만든 경험은 나에게 큰 자신감을 심어주었다. 또한 아사나라는 협력 프로그램을 사용하여 일을 체계적으로 분업하고 계획하여 진행하여 나가는 점도 굉장히 뜻 깊었다. 이번 프로젝트 동안 같이 했던 친구들에게 정말 고생 많았다고 얘기해주고 싶다.