아두이노 블루투스 모듈 사용법 (arduino hm10 module)

시작하며

아두이노와 블루투스 모듈 hm10을 연결해서 사용하는 방법을 알아보겠습니다.
hm10의 모듈에 관한 자세한 정보는 hm10 데이터시트에서 확인할 수 있습니다.

전체적으로 많이 사용하는 hc06과 hm10 중에 hc06는 블루투스 버전이 2버전으로 낮기 때문에 제가 사용할 웹 블루투스 api에서는 사용할 수 없기 때문에 블루투스 ble 및 4버전을 지원하는 hm10을 사용하기로 했습니다.

다른 기술 블로그들이나 테스트하는 영상들을 보면 항상 앱 스토어 및 플레이스토어에서 터미널 앱을 설치해서 사용하는 것을 확인 할 수 있었는데, 이건 실질적으로 앱 혹은 웹 프로젝트를 만드는데 있어서 테스트용도일 뿐이지 의미없는 것이라 생각되었습니다. 그래서 직접 구현해 보도록 하겠습니다.

회로도

아두이노 회로도는 circuito을 통해서 쉽게 연결해볼수 있습니다.

회로도

블루투스 모듈을 보면 VCC, GND, TXD, RXD라고 쓰여있습니다.

  • VCC: 전압을 나타냅니다.
  • GND: 기준전압 입니다. 전기의 기준점이라고 생각하면 됩니다.
  • TXD: 데이터 전송을 위한 포트로 디지털 핀에 연결할 수 있습니다.
  • RXD: 데이터 수신을 위한 포트로 디지털 핀에 연결할 수 있습니다.
  1. 블루투스 모듈의 VCC와 우노의 5V핀과 연결합니다. 전원공급을 하는 것이라고 생각하시면 됩니다.

  2. 블루투스 모듈의 GND와 우노의 GND핀과 연결합니다.

  3. 블루투스 모듈의 TXD와 우노의 디지털2핀과 연결합니다.

  4. 블루투스 모듈의 RXD와 우노의 디지털3핀과 연결합니다.

우노의 디지털핀은 0번-rx, 1번-tx, 2번-rx, 3번-tx…이런 순서로 전송과 수신이라고 생각하고, 모듈과는 반대로 꽂아주어야 합니다.

RX는 수신 TX는 송신일때, 우노와 모듈이 둘다 TX(송신)로 연결하면 수신이 없고, 둘다 RX(수신)으로 연결하면 전송이 없어서 제대로 작동하지 않습니다.

코드 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <SoftwareSerial.h>

// 블루투스 모듈 포트 설정 (HM10)
#define BT_RXD 2
#define BT_TXD 3
SoftwareSerial BTSerial(BT_RXD, BT_TXD);

void setup() {
Serial.begin(9600); // PC에서 모니터링하기 위한 시리얼 통신 시작
BTSerial.begin(9600);
Serial.println("Bluetooth initial");
}

void loop() {
char c;
if (Serial.available()) {
c = Serial.read();
BTSerial.print(c);
}
if (BTSerial.available()) {
c = BTSerial.read();
Serial.print(c);
}
}

공식홈페이지에서 software-serial의 함수들을 확인 할수 있습니다.

1
2
Serial.begin(9600);  // PC에서 모니터링하기 위한 시리얼 통신 시작
BTSerial.begin(9600);

블루투스 통신과 우노의 시리얼 통신 속도를 맞추어 주어야합니다.

1
SoftwareSerial mySerial(rxPin, txPin);

HM10 모듈의 UUID

블루투스의 ble 통신의 경우 service > characteristic의 구조가 있습니다. 자세한 설명은 다른 블로그 포스트에서 설명하겠습니다.
hm10 모듈에서는 블루투스 페어링이후 쓰기 및 읽기에 대한 특성을 제공합니다.
블루투스 모듈의 이름을 알거나 수정하기 위해서는 AT command를 이용하면 수정 가능합니다.

1
2
3
4
5
const uuids = {
serviceUUID = "0000ffe0-0000-1000-8000-00805f9b34fb", // service uuid
readUUID = "0000ffe1-0000-1000-8000-00805f9b34fb", // characteristic uuid
writeUUID = "0000ffe1-0000-1000-8000-00805f9b34fb" // characteristic uuid
}

AT 통신(옵션)

맨 처음 HM10관련 데이터 시트에서도 나와있는 내용입니다
기본 값으로는 블루투스 페어링이 되어있지 않은 상태에서 AT 명령어를 사용할 수 있습니다.
다른 외부 기기와 페어링이 된 상태에서 AT명령어를 사용하기 위해서는 mode를 변경해주어야 합니다.

AT명령어가 되는지 우선 확인을 해보아야합니다.
AT command
AT를 입력했을때 OK라는 글자가 나와야합니다.

OK가 안나올때 체크요소

  • 블루투스 모듈 값을 Serial로 print해주는 코드가 있는지 확인(아래와 같은 코드)
  • 선이 제대로 연결이 되어있는지 확인.
  • 다른 라이브러리와 같이 사용하고 있는지 검토 (다른 라이브러리 예를들어, es522랑 사용할때 print가 안되는 이슈가 있었음)
  • 다른 hm10모듈을 사용해본다.
  • 블루투스 모듈 관련 코드만 남겨서 테스트를 해본다.

OK글자가 나오는 원리는 다음과 같습니다.

1
2
3
4
5
6
7
8
9
char c;
if (Serial.available()) {
c = Serial.read();
BTSerial.print(c);
}
if (BTSerial.available()) {
c = BTSerial.read();
Serial.print(c);
}
  1. 블루투스 모듈의 AT를 터미널창에 입력
  2. Serial.available에서 인식
  3. 시리얼에서 인식한 값을 BTSerial.print(c)을 통해서 블루투스 모듈로 입력
  4. 블루투스 모듈에서 인식한 값을 BTSerial.available 에서 인식
  5. 인식된 값을 시리얼로 출력을 해줍니다.

영문은 전부 대문자여야 합니다.
대부분 현재 상태정보를 확인하기 위해서는 명령어 끝에 ?를 넣습니다.

이름짓기

  • AT+NAME? : 기기 이름이 무엇인지
  • AT+NAMEHM10 : 기기이름을 HM10으로 짓기

이름변경
이름변경결과
이름확인
이름확인결과

모드 변경

  • AT+MODE? : 기기모드 확인
  • AT+MODE1 : 기기모드를 1로 변경
Share