본문 바로가기

프로젝트/Noise Detector (BLE)

[BLE] Noise Detector 개요 / 목차 / 동영상

개요

블록 다이어그램과 핵심 변수/함수를 사용하여 핵심 알고리즘을 표현했습니다. 사실 이번 프로젝트를 만들면서 필기한 분량이 2천원짜리 노트 한권 분량입니다. 프로젝트와 관련된 기초적인 부분과 비슷한 내용을 조금씩 수정하면서 다시 그린 것이 대부분이지만, 대부분의 내용을 삭제하고 매우 핵심적인 부분만 포스팅했습니다. 프로젝트는 전체 시스템, 하위 시스템을 설계할 때마다 블록 다이어그램을 그리고, 그 그림에 따라 코드를 작성하거나 화로를 만들었습니다. 설명에 그려진 그림들은 큰 틀에서 제가 이번 프로젝트를 설계하는 과정과 일치합니다.


회로, BLE(Bluetooth Low Energy) 프로토콜, 자바, 안드로이드에 대한 기초적이 부분까지 설명하기에는 양이 너무 많기 때문에 "CAN 통신" 처럼 자세히 설명하지는 않을 것입니다. 즉, 이번 프로젝트에 대한 포스팅을 이해하기 위한 기초지식은 스스로 학습해야 합니다. 제 블로그의 프로젝트 관련 포스트들은 모두 이용하는 제품이나 서비스에 대한 기본적인 이해를 가정하고 실제 구현을 목표로 하므로 기초적인 부분은 직접 공부해야 합니다.


회로는 수박 겉핧기 식으로 배웠기 때문에 부족한 부분이 많을 것입니다. 펌웨어나 자바도 아직 배울게 많습니다. 부족하거나 잘못된 부분은 메일이나 댓글로 알려주세요. 서로 공부할 수 있는 기회가 되었으면 좋겠습니다.


구성요소

1. 회로

2. 커스텀 BLE 펌웨어(nRF51)

3. 안드로이드 어플리케이션


1. 회로

3.7V 리튬 이온 배터리로 작동합니다. 콘덴서 마이크에 입력된 외부 소음 신호는 연산 증폭기로 보내지며, 증폭기는 이 신호를 증폭하여 nRF51822로 보냅니다.


마이크로 USB가 연결되면 P채널 MOSFET에 의해 충전 모듈 이외의 모든 전원은 차단되며 배터리가 충전됩니다.


저전력을 위해 연산 증폭기의 전원도 P채널 MOSFET에 의해 차단되며, 이것은 마이크로 USB가 아닌 nRF51822의 14번 핀(P0.08)에 의해 제어됩니다.


DIP 타입을 구할 수 없거나 직접 만들기 힘든 부분은 모듈을 사용했습니다.


배터리 충전 모듈은 TP4056을 사용했는데 알리익스프레스에선 DIP 타입 TP4056만 따로 팔지 않더라구요. 대신 회로도는 따로 링크해 두었습니다.


nRF51822도 모듈을 사용했습니다. SMD를 만능기판에 부착할 수도 없고 nRF51822만을 위해 외부 핀만 따로 빼주는 PCB를 만든다고 해도 안테나는 직접 제작할 수 없었기 때문입니다. 회로는 PCA10028 개발 보드의 nRF51422 회로에서 외부 32.768kHz 크리스탈 부분만 제거하면 거의 비슷할 것이라 추측합니다.


2. 커스텀 BLE 펌웨어

BLE 커스텀 서비스를 직접 구현했습니다. 초저전력 무선통시 임베디드 시스템 구현을 목표로 공부했고, 첫 무선통신으로 BLE를 선택했기 때문에 가장 많은 시간과 노력을 투자했습니다. 또한 임베디드 시스템의 특성상 제한된 리소스를 갖고 외부 환경과 밀접하게 연계되기 때문에 회로, 자바, 안드로이드를 공부한 것이지 사실 다른 구성요소들은 펌웨어가 제대로 작동하는지 확인하기 위한 도구에 불과합니다.


구현된 기능은 다음과 같습니다.

(1) 15초마다 배터리 잔량 측정, 4회 평균(1분)을 피어(스마트폰)에 전송

(2) 10ms마다 연사 증폭기의 출력을 ADC, 20회마나 20회 측정된 정보를 피에어 전송

(3) 피어에게 ON/OFF 명령을 받아 연산 증폭기의 전원과 ADC 작동을 관리


위 기능을 구현하기 위해 앱 타이머, GPIO 모듈을 사용했고, 커스텀 서비스와 BLE BSP 모듈을 새로 만들었습니다. 그리고 모든 콜백 함수는 main.c에 구현했습니다.


이렇게 쓰고보니 별게 없네요. 하지만 피어와 nRF51 간 BLE 통신을 통해 안정적으로 데이터, 명령 송수신을 목적으로 하였고, 이를 통해 필요한 기능은 언제든지 더 추가할 수 있다는 것에 의의를 두었습니다.


3. 안드로이드 어플리케이션

하나의 어플리케이션에서 BLE 통신과 그래픽 표현을 관리하기에는 복잡하다고 생각되어, BLE 통신을 관리하는 모듈과 피어(nRF51822)로 부터 전송받은 데이터를 사용자에게 보여주는 그래픽 모듈을 따로 구현했습니다. 객체 지향 프로그래밍이란 그런 목적을 위해 만들어진 것이니까요.


BLE 통신을 관리하는 모듈은 노르딕에서 제공하는 BleProfile 추상 클래스들을 상속하여 구현했습니다. 노르딕에서 핵심적인 기능을 너무 잘 구현해 놓았기 때문에 BLE 연결에는 큰 어려움은 없었지만, 버튼과 화면회전 동작을 BLE 기능과 동기화 시킬 때 약간 힘들었습니다.


그래픽 모듈은 WaveData로 WaveBars, EdgeLine, CriticalLine, Warning 4개의 뷰가 겹쳐져 있는 형태이며 ArrayBundle로 포장된 데이터를 사용자에게 애니메이션으로 보여줍니다. 막대들이 오르내리는 동작은 SurfaceView를 상속한 WaveBars가 스래드에서 구현하며, 나머지 뷰들은 메인 스래드에서 그리기를 수행합니다. 그리고 이 모듈은 Noise Detector 어플리케이션에 내장됩니다.


개발 순서

동영상(주목해야 할 점)

  1. Noise Detector(nRF51822)가 20바이트씩 보내준 ADC 데이터를 Noise Detector 컨트롤러(안드로이드 앱)가 서피스뷰(SurfaceView)를 사용하여 애니메이션으로 보여준다.
  2. 진동 설정
  3. 화면이 회전해도 애니메이션과 진동 설정의 연속성을 잃지 않는다.
  4. 액티비티가 사라져도 Noise Detector 컨트롤러의 서비스(NDSService)는 계속 BLE 데이터를 수신하며 가장 최근에 설정된 CriticalLine 값과 비교하여 경고 진동음을 발생시킨다. 이때는 진동 설정이 꺼져있어도 진동을 발생시킨다.
  5. 사용자가 의도하지 않은 이유로 연결이 끊긴 경우 Noise Detector 컨트롤러는 자동으로 재연결을 시도한다. NDSService 참조