솔루션 구동원리

솔루션의 각 구성요소 선정 배경과 연결 방식을 소개합니다.

[ 회로 구조/펌웨어 요소 이해하기 ]

파츠 번호기능 설명

[1] 아두이노 나노

: 펌웨어 업로드를 위한 제어보드

[2] 모터 드라이버

: Locker에 독립적인 전원 공급을 제공하는 드라이버

[3] Pogo 커넥터

: 잠금키와 자물쇠 간 전원 공급과 I2C 통신을 할 수 있는 커넥터

[4] RGB LED

: MCU의 상태를 알려주는 3색 LED

[5] Locker

: 신호에 따라 자물쇠 열림 기능을 하는 모듈

[6] 10KOhm 저항

: I2C 통신을 5V로 유지하기 위해 필요한 저항

[7] Tack 스위치

: 잠금키에 상태를 입력하는 버튼

[8] 지문인식센서

: 지문을 인식하는 센서

[9] 부저

: 소리로 상태를 안내하는 부저

[10] RTC 모듈

: 전원 공급 여부와 관계없이 현재 시간을 안내하는 모듈

[11] 배터리 모듈

: 전원 공급, 충전/안전회로를 탑재한 모듈.

1. MCU의 선정 배경 : Arduino Nano

개발 환경을 선정할 때, 목표 기능들을 모두 기획한 후 MCU를 가장 마지막에 선정하였습니다. 지문인식 센서/RTC 모듈/모터 드라이버 등의 기능들을 기획하였을 때, 통신 방식도 SPI-Serial-I2C 수준에서 관리할 수 있었으며, GPIO가 많이 필요한 상태도 아니었습니다.

이런 배경에서 64pin 기반으로 갈 필요가 없었고, 프로세스가 좋아야 하는 상황도 아니어서 ARM코어 역시 선정 대상이 아니었습니다. 반면, 다른 영역에서 선정 가중치가 높았던 요소가 있었기에 해당 요소를 충족하는 보드인 Arduino Nano를 선정하였습니다.

  1. 사이즈가 작을 것 (자물쇠와 잠금키의 심미성 고려)

  2. EEPROM이 상대적으로 넉넉할 것 (비휘발성 데이터 공간 확보)

  3. Arduino IDE에 잘 붙을 것 (제품의 안정성)

2. 자물쇠 배터리의 필요성에 대한 고찰과 EEPROM의 사용

많은 소형 제품군들이 제품의 전원 활용을 위해 배터리를 사용합니다. 우리 역시, 제품의 제어가 되기 위해서는 반드시 전원이 필요합니다. 그런데, 잠금키와 자물쇠 모두에 배터리가 필요할까요?

우리가 흔히 사용하는 도어락에는 배터리(건전지)가 들어갑니다. 사용자가 언제 버튼을 누를지 모르기 때문에 항상 활성화된 상태로 입력을 기다리고 있습니다. 반면 우리의 자물쇠 시스템에는 잠금 키가 사용될 때마다 지문인식을 위해 전원이 켜진 상태이기 때문에 자물쇠 측에서 상시 대기를 할 필요가 없습니다. 상시 무선통신이 필요하다 하더라도, 잠금키 쪽에서 모듈을 추가하면 됩니다.

이러한 이유로 자물쇠는 연결될 때만 전원이 들어오며, 잠금키 역시 좌측에 연결된 전원 스위치를 통해 전원이 상시로 On/Off 상태가 됩니다. 즉, 잠금을 시도한 정보인 로그 데이터를 축적하기 위해서는 비휘발성 메모리인 EEPROM에 데이터를 쓰는 작업을 해야 합니다. 문제는 EEPROM의 용량이 1024byte인 이유로 한 번의 연결 시도마다 많은 양의 byte를 사용하게 되면 입력 가능한 데이터가 적어집니다. 현재는 약 80번의 자물쇠 접근시도에 대해서만 가능하도록 제한하고 있으나, 이는 일반적인 상황에서도 흔히 일어날 수 있는 접근 시도 수준이므로, 실 서비스 구축시에는 SD카드 사용 또는 EEPROM 용량이 큰 MCU를 사용하는 것을 권장합니다.

* 실제 입력하는 데이터와 byte 계산은 다음 항목인 “통신구조 이해하기”에서 추가 설명

3. RTC(Real Time Clock) 모듈의 채택

앞선 배터리 이슈에서 언급한 바와 같이, 잠금키에는 배터리가 탑재되어 있지만 전원 스위치를 끄게 되면 MCU의 전원이 내려가며 전원을 켤 때마다 데이터가 초기화됩니다. 그럼에도 자체 비휘발성 메모리인 EEPROM을 사용하여 절대 시간을 매번 업데이트 후 저장하는 소프트웨어 RTC 기능이 존재하나, 우리 프로젝트에서는 EEPROM을 로그 데이터 저장에 사용하여야 하며, 용량의 부족함도 겪고 있기 때문에 소프트웨어 RTC를 사용하기 어려운 상태입니다. 이런 이유로 고정밀 RTC이자 비휘발성 기능을 갖춘 DS3231 모듈을 구매하여 I2C로 데이터를 받아와 사용하였습니다.

4. 모터 드라이버 사용의 배경

우리 주변의 모터를 살펴보면, 모터가 직접 MCU와 연결되어 사용하는 경우는 없다고 해도 무방할 정도입니다. 중간에서 Phase(상)을 만들어주거나, 전압을 맞춰주거나, H-bridge 기능을 수행하거나, PWM을 구동으로 변환하여 주거나 등의 많은 이유로 모터를 제어하는 드라이버를 패키지로 사용합니다. 그런데, 우리의 솔루션에는 모터가 들어가지 않는데도 왜 모터 드라이버를 사용해야 할까요?

우리가 모터 드라이버를 사용한 이유는 앞선 ‘제어’관점의 이유가 아니라, 단순히 전원 공급의 독립성을 위한 것입니다. 모터를 아두이노에 직접 연결하게 되면, 아두이노 5V핀 또는 Digital Pin에서 직접 공급 가능한 전류가 매우 낮으므로, 모터가 500mA 이상 전류를 아두이노를 통해 끌어오게 되면 아두이노가 사용하고 있던 전원도 함께 낮아져 MCU전원이 내려가는 상황이 발생합니다. 이런 상황을 막기 위해서는 아두이노에 공급되는 대전원을 아두이노에 거치지 않고 드라이버로 직접 연결해주어야 합니다. 이렇게 되면 아두이노는 모터의 동작 여부와 관계없이 항상 전원이 공급되고, 보다 안정적인 동작을 할 수 있습니다.

위의 상황 같은 경우 원래 사용하여야 하는 칩은 솔레노이드/전등에 사용하는 MOSFET 칩이지만, 모듈화하여 판매 중인 모터 드라이버를 대신 구매하여 채택하였으므로 상용화 제품 제작 시에는 단가와 효율성을 고려하여 FET을 선택하는 것을 추천합니다.

5. 지문인식 센서 활용

지문을 인식하는 방식에는 크게 3가지 방법이 있습니다. 광학식 지문인식은 지문의 굴곡이 돋보이도록 사진을 찍어 해당 지문을 인식하는 방식입니다. 광학식이라는 단어에서 알 수 있듯이, 지문 사진으로도 인식을 할 수 있기 때문에 보안시설에서는 사용의 어려움이 따릅니다.

정전용량식의 경우, 지문의 굴곡에 따라 센서 평면 전극의 정전 용량이 변하는 것을 감지하는 방식입니다. 가장 정밀하게 지문을 찾아내는 방식이나, 전극별로 정전용량을 감지하는 회로가 탑재되어 있어야 하는 이유로 저렴한 시스템이나 빠르게 감지해야 하는 상황에서는 경쟁력이 낮습니다.

초음파 인식의 방식은 지문의 굴곡에 따라 변하는 초음파 수신량을 비교하는 것입니다. 센서와 직접 접촉하지 않아도 된다는 장점을 가지고 있으며 이러한 특징을 잘 살려 모바일 디스플레이 안쪽에 배치시켜 사용합니다.

앞선 비교를 통해 적합한 방식을 선정하자면, 높은 정확도와 인식률을 가진 정전용량식 지문인식 방법을 쓰는 것이 올바르나, 다음과 같은 이유로 불가피하게 광학식 지문인식을 채택하여 사용 중입니다. 추후 상용화를 고려한다면, 정전용량식 지문인식으로 변경할 것을 권장합니다.

  1. MVP에 빠르게 도달하기 위해 모듈단위로 구매할 수 있어야 함 (회로구성 불가)

  2. 개발 사례와 라이브러리가 갖춰져 있어야 함

  3. 비용이 저렴해야 함

[ 통신 구조 이해하기 ]

1. EEPROM 저장 및 데이터 형태

아두이노 나노의 EEPROM은 1024byte로, Address 1~1024까지 1byte 단위로 지정 저장/업데이트/Clear가 가능합니다. 자물쇠의 EEPROM에는 자물쇠의 ID, 생성일자, 생성인 정보가 고정 주소(초기 세팅 시 Address 1~11에 정보 보관)에 들어가 있으며 잠금키가 자물쇠로 정보 Request를 보내면 해당 정보를 회신합니다. 고정 주소 이외의 업데이트 주소(Address 12~1023)에는, 11byte 단위로 사용 로그가 저장됩니다. 자물쇠와 도어 키 EEPROM 주소에 저장되는 내용은 다음과 같습니다. (자물쇠와 도어키의 형식 동일)

EEPROM 주소주소 탑재 내용

1

[초기 세팅값] 자물쇠 / 도어키 ID (1~254)

2

[초기 세팅값] 생성 사용자 ID (1~254)

3~11(8byte)

[초기 세팅값] 생성 일자/시간 String (ex) 21.10.19 14:20

12

[1번 사용로그] 접근키 ID (1~99)

13

[1번 사용로그] 접근지문(1~254)

14~21 (8byte)

[1번 사용로그] 연결 일자/시간 String (ex) 21.10.20 11:17

22

[1번 사용로그] 상태 확인 (1~254)

23~33 (11byte)

[2번 사용로그] 패키지

34~44 (11byte)

[3번 사용로그] 패키지

...

... 사용 로그 저장 반복

~1023

마지막 주소

2. 키와 커넥터의 데이터 통신 선정 배경 : I2C

키는 커넥터와 I2C 통신을 이용하여 데이터를 주고받습니다. 본 솔루션에서 채택할 수 있는 통신 규약은 아두이노 Nano 보드에서 제공하는 SPI/Serial/I2C 방식이 있습니다. 실제 통신 모듈은 속도/데이터 송수신 방식/모듈의 수 등의 요인에 따라 장-단점이 존재하므로 고려해야 할 사항이 많지만, 다음과 같은 한계점이 존재하여 손쉽게 I2C를 선택하였습니다.

  1. 지문인식센서와 RTC모듈이 SPI를 지원하지 않음

  2. Serial 활용 시 아두이노 상의 라이브러리(Software Serial)가 핀을 2개씩 점유 함

  3. I2C 기능 활용 사례와 높은 안정성

** 비교/이미지 참조 https://www.rfwireless-world.com/Terminology/UART-vs-SPI-vs-I2C.html

3. 잠금키-자물쇠-PC 간의 통신 흐름

잠금키가 자물쇠와 연결된 후 잠금키의 버튼을 누르면, 자물쇠로 I2C 통신이 가능한 대상이 있는지 I2C 주소(ID)를 1번부터 254번까지 스캔합니다. 만약 자물쇠의 ID가 34번으로 설정되어 있다면 스캔의 결괏값으로 34를 자물쇠로부터 회신 받게 됩니다. 회신된 ID가 정상 범주 내에 존재한다면, 해당 자물쇠의 주솟값으로 자물쇠 정보를 요청합니다. (I2C 송신 값 'I')

송신 데이터(잠금키->자물쇠)회신 데이터(자물쇠->잠금키)

'I' (Infomation)

Address 1~11 정보

'T' (Test)

'Test'

'O' (Open)

접근자의 11byte 정보

잠금키에서 자물쇠의 정보를 받은 후, 지문인식을 시작합니다. 이렇게 얻은 정보는 다음과 같은 흐름을 걸쳐 정상여부를 판단합니다.

  1. 잠금키의 ID에 어떤 지문이 허용되는지 확인

  2. 해당 허용 지문이 언제까지 유효한지 절대시간 확인

  3. 인식된 지문이 해당 권한을 소유한 지문과 일치하는지 확인

세 가지 항목이 모두 일치하면, 잠금키에서 자물쇠로 열림정보(I2C 송신값 ‘O')를 보내면서, 잠금키와 자물쇠 각각의 EEPROM에 접근자의 정보(11byte)를 메모리에 저장합니다. 자물쇠는 데이터를 수신/처리했음을 안내하는 의미로, 11byte 정보를 잠금키에 회신합니다.

[ 기술 스택/백엔드 데이터 구성]

1. 프로젝트 기술 스택

2. 백엔드 데이터 구성

MVP 4단계 기반의 WEB(Flutter) Firestore와 연동하여 언제든지 데이터를 주고받을 수 있습니다. 다음은 프로젝트의 필드 이미지입니다.

구성 방안 : 컬렉션(Key, Lock, User) -> 객체 ID(K1, K2, K3... ) -> 상세 데이터

구성 요소별 상세 데이터

  • creation_time : 키가 생성된 날짜 및 시간

  • creator : 키를 생성한 유저의 ID

  • description : 키의 상세 설명

  • key_group : 키를 가지고 있는 그룹

  • last_update : 마지막으로 데이터를 업데이트 한 날짜 및 시간

  • Log : 키를 사용한 로그 값(Log n의 형태로 데이터가 쌓임)

    - status : 장치의 결과

    - used_lock : 키에 사용된 자물쇠의 ID

    - used_time : 키가 사용된 시간

    - used_user : 키를 사용한 유저의 ID

Next. 빌드하기

솔루션을 구동시키기 위해, 제품을 제작하고 펌웨어 구동 환경을 구축합니다.

  • 하드웨어 제작에 소요된 부품과 구매처

  • 3D프린팅 구성요소 파일과 회로도

  • 펌웨어 구동환경 다운로드, 세팅 방법

Last updated