2015년 1월 28일 수요일

HM-10 Bluetooth 모듈을 iBeacon으로 사용하기

Aliexpress등에서 매우 저렴하게 구입할 수 있는 Bluetooth 4.0 Low Energy (BLE) 모듈인 HM-10을 iBeacon으로 사용할 수 있다. 물론 HM-10은 데이터 통신 또는 단독 센서, 디바이스 제어등의 용도로 사용할수도 있지만 여기서는 그것들에 대한 설명은 생략한다. 

HM-10은 TI의 CC2540 또는 CC2541 BLE SoC 기반의 Bluetooth 4.0 모듈이다. 개당 약$6~7 정도의 가격이다. 펌웨어 버젼은 2014년 9월 기준으로 펌웨어 버젼 531이 나와있다.



모듈은 위의 사진에서 볼 수 있는것처럼 매우 작다. 접촉패드 간격은 1.5mm이라 일반 브레드보드나 만능기판등에서 바로 사용하기는 힘들다. 전원에 연결하거나, 모듈을 iBeacon으로 설정하기 위해 PC에 연결된 USB-to-Serial 케이블에 납땜을 할 때 매우 주의해야만 한다. HM-10은 2.0~3.7V에서 동작하고 I/O핀은 3.3V tolerant이다.

Hardware Connections


모듈에 전원을 공급하기 위해 두가닥의 선이 필요하고, USB-to-Serial adapter를 통해 모듈을 설정하기 위해 임시로 3개의 선이 필요하다. 



위의 사진은 모듈이 3개의 NiMH 충전 배터리가 들어있는 배터리 팩(1.2V * 3 = 3.6V) 과 USB-to-Serial adapter에 연결되어 있는걸 보여준다. Arduino를 사용하고 있다면 아마도 이런 류의 adapter를 이미 가지고 있을것이고, 그렇지 않다면 약 $15정도로 구입할 수 있을 것이다. 만일 구입해야 한다면 3.3V/5V 점퍼나 선택 스위치가 있는 것으로 구입하길 권한다. 



HM-10은 평균적으로 약 0.18mA의 전류를 사용한다. 사진의 배터리팩은 약 1800mAh의 용량을 가지고 있으므로 약 10000시간(즉 1년 이상) 지속될 수 있다. 만일 매우 작은 iBeacon을 만든다면 240mAh 용량의 CR2032 코인셀을 사용할 수도 있고, 이 경우 약 55일정도 사용할 수 있다. 



위의 다이어그램은 케이브블을 어떻게 연결해야 하는지 보여준다. 배터리는 모듈의 12(+), 13(-)번 핀에 연결되어 있다. RS232 adapter의 RxD는 1번핀에, TxD는 2번핀에 연결한다. Adapter의 그라운드 핀은 모듈의 14번 핀에 연결한다. 

Using a Terminal Emulator to talk to the HM-10


하드웨어가 준비되었으면 HM-10이 동작하는지 확인할 수 있다. 배터리와 serial adapter가 HM-10에 연결되었으면 adapter의 USB케이블을 PC에 연결한다. 처음으로 adapter를 사용하는 것이면 adapter의 디바이스 드라이버를 설치하도록 요구받을 수도 있다. 대부분의 경우 OS가 자동으로 드라이버를 찾아준다. 

HM-10은 AT 명령셋을 사용하는데 매우 특이한 타이밍을 요구한다. 명령은 CR이나 LF로 끝나는것이 아니고, 명령이 완전히 다 입력된 다음의 매우 짧은 딜레이에 의존한다. 그러므로 arduino 소프트웨어의 시리얼 모니터를 이용하기를 권장한다. 이 글을 읽는 대다수는 arduino IDE가 이미 설치되어 있을것이라고 생각한다.



Tools 메뉴에서 Serial Port를 선택하고 거기에서 자신의 serial adapter에 해당하는 COM 포트를 선택한다. 대부분의 경우 가장 아래쪽의 COM포트이다. 위의 스크린샷에서는 COM3이다. 

그 다음에 Tools 메뉴에서 Serial Monitor를 실행한다. 아래 메뉴에서 “9600 Baud”와 “No line ending”을 선택한다. 이제 HM-10과 이야기 할 수 있다. “AT” 뒤에 엔터키를 타이핑 해 본다. HM-10이 “OK”라고 응답해야 한다. HM-10은 출력하는 내용 뒤에 LF로 끝나지 않기 때문에 모든 응답 메시지는 뒤에 계속 추가된다.



다음으로 HM-10의 펌웨어 버젼을 확인한다. “AT+VERR?”를 입력한다. 최근에 HM-10을 구입했으면 버젼은 526 또는 그 이후 버젼일것이다. 그렇다면 아래의 Firmware Update 부분은 건너 뛰고 iBeacon Configuration을 가도 된다.

Firmware update

펌웨어 업데이트가 필요하면, 먼저 JNHuaMao 사이트에서 적합한 버젼을 다운로드 받아야 한다. 자신이 가지고 있는 HM-10 모듈이 어떤 칩(2540인지 2541인지)을 사용하는가를 확인한다.  초기모듈은 CC2540을 사용했고 신형 모듈은 CC2541을 사용한다. (최근에 구입했다면 대부분은 CC2541을 사용했을 것이다.)


위의 링크에서 펌웨어를 다운받으면 된다. 다운받았으면 압축을 해제해준다. 최소 3개의 파일이 있을 것이다. readme.txt 파일에는 업데이트 하는 설명이 들어있다. .bin으로 끝나는 파일이 업데이트 할 실제 펌웨어이다. 그리고 .exe로 끝나는 실행파일은 펌웨어를 업데이트 해 주는 프로그램이다. 

1. Arduino 시리얼 모니터에서 ‘AT+SBLUP’를 입력해 준다. 그러면 ‘OK+SBLUP’라고 응답할 것이다. 이제 HM-10은 펌웨어 업데이트를 할 준비가 된 것이다.
2. 시리얼 모니터를 종료한다.
3. 펌웨어 업데이트 프로그램을 실행한다. 
4. COM 포트에 HM-10이 연결되어 있는 시리얼 포트 번호를 설정한다.
5. ‘…’ 버튼을 클릭해 다운로드 한 .bin 파일을 선택한다.
6. 마지막으로 ‘Load Image’ 버튼을 클릭한다.
7. 펌웨어 업데이트는 몇분이 걸린다. 업데이트 하는 도중에는 중단하면 안된다. 
8. Verification이 끝나면 ‘Download completed successfully’라는 메시지가 나올 것이다.



이제 업데이트가 끝났으니 펌웨어 업데이트 프로그램을 종료하면 된다.

iBeacon Configuration


HM-10을 iBeacon으로 설정하려면 몇가지 명령을 입력해 줘야 한다. Arduino Serial Monitor 프로그램을 사용해 명령을 입력해 준다. 아래 리스트에서 볼드로 되어 있는 부분이 실제 입력해줘야 하는 명령이고 그 뒷부분은 각 명령이 어떤 동작을 하는지에 대한 설명으로 입력하면 안된다. 각 명령은 “OK …”으로 ack 되어야 한다. 

1.  AT+RENEW       Factory default로 복구
2.  AT+RESET       Reboot
3.  AT             OK를 기다림
4.  AT+MARJ0X1234  Major no.를 0x1234로 설정
5.  AT+MINO0XFA01  Minor no.를 0xfa01로 설정
6.  AT+ADVI5       Advertising interval을 5(546.25 ms)로 설정
7.  AT+NAMEDOPEY   HM-10 모듈 이름을 DOPEY로 설정
8.  AT+ADTY3       non-connectable로 설정 (전원 절약)
9.  AT+IBEA1       iBeacon 모드 활성화
10. AT+DELO2       iBeacon broadcast-only로 설정 (전원 절약)
11. AT+PWRM0       Auto-sleep 활성화. 8에서 0.18mA로 전력소비를 줄여줌
12. AT+RESET       Reboot

위의 명령들을 다 입력했다면 HM-10은 아이폰이나 안드로이드에서 iBeacon으로 보여야 한다. 4~5단계에서 적절한 major와 minor no.를 선택할 수 있다. Major no.는 특정 범위(스토어 또는 빌딩)내에서 동일하고, minor no.가 iBeacon을 유일하게 식별한다. 위의 프로시져는 HM-10의 디폴트 UUID(표준 proximity UUID)는 변경하지 않는다. UUID를 변경하고 싶으면 AT+IBE0, AT+IBE1, AT+IBE2, AT+IBE3 명령을 사용할 수 있다. 16버이트 UUID는 4바이트 단위로 나뉘어 각각은 다른 명령으로 바꿀 수 있다. 아래 테이블은 UUID를 4개의 명령으로 각각 어느 부분을 변경할 수 있는지 보여준다. 



Removing the Programming Cable


HM-10이 정상적으로 iBeacon으로 동작하는게 확인되었으면 serial adapter에 납땜질 된 케이블을 제거하고, 전원 케이블만 연결해 놓으면 된다. 



배터리 팩과 모듈을 보호하기 위해 케이스에 집어넣어 준다.



Simple iBeacon Scan

아이폰이나 안드로이드 폰에서 iBeacon 스캔을 할 수 있는 앱을 실행시켜 본 결과이다. 위와 같이 정상 동작하고 있음을 확인할 수 있다. 단 iBeacon과의 거리는 RSSI값을 가지고 계산한 것이기 때문에 상대적인 거리이지 정확한 거리는 아님을 주의해야 한다. 

Using the HM-10 as an iBeacon Proximity Device


다음의 8개 UUID는 Apple AirLocate에 proximity device로 들어있다. AirLocate를 사용하는 iOS app과 호환성을 보장하기 위해 이 값을 사용한다.




Waking Up the HM-10


HM-10이 auto-sleep 모드로 설정되어 있으면 전원이 들어오거나 리부팅 될 때 빨리 sleep모드로 갈 수 있다. AT+PWRM0 명령을 보낸 뒤에 재시작하면 MH-10은 더이상 AT 명령에 응답하지 않는다. 디바이스를 깨우려면 80글자 이상의 랜덤 알파벳을 보내면 된다. 그러면 모듈이 깨어나 OK+WAKE라고 응답한다. 한동안 디바이스에 명령을 내려야 하면 잠들지 않게 하기 위해 먼저 AT+PWRM1 명령을 보내준다. 명령이 끝나면 전력소비를 줄이기 위해 AT+PWRM0을 보내면 된다. 


To be continued....   HM-10 iBeacon 제작

댓글 3개:

  1. 안녕하세요!
    다름이 아니고 문의드릴게 있어서 이렇게 댓글을 달게 되었습니다.
    현재 HM 11을 이용해 스마트폰으로 데이터를 받아오는 방식을 제작중입니다. 폰이랑 페어링이 되었지만 AT 커맨드를 보내는 과정에서 정상적으로 모드가 바뀌지 않습니다.

    이와 관련해서 도움을 구하고자 합니다.
    혹시 가능하시다면 개인적으로 연락을 싶은데.. 메일로 연락을 드리면 되나요?
    일단 제 메일은 darkmoon177@naver.com 입니다.

    답글삭제
  2. 답변보냈습니다 이메일 확인 부탁드리겠습니다

    답글삭제
  3. 안녕하세요 글 잘 봤습니다
    다름이 아니라 'AT+SBLUP'를 입력 한 후에 시리얼모니터를 종료하고
    포트 확인 후에 ...을 이용해 .bin 파일을 업로드하는데
    타겟을 찾을 수 없다고만 나오고 시리얼모니터에는 입력이 아무것도 되지 않습니다.
    해결책 없을까요... 부탁드립니다.
    b197777@daum.net 으로 연락 부탁드립니다.

    답글삭제