[아두이노] 블루투스 모듈 (HC-06)로 블루투스간 통신 구현하기

기본 설명

일반적으로 쓰이는 블루투스 모듈입니다.

블루투스 연결을 통해 아두이노와 아두이노간, 혹은 아두이노와 스마트폰 등의 블루투스 지원 기기간의 근거리 무선 통신을 가능하게 하는 모듈입니다. 기기마다 다소 차이는 있으나 일반적으로 10m 이내의 거리에서 통신이 가능합니다. 그보다 먼 거리의 통신이 필요하다면 HM-10과 같은 BLE모듈을 사용하여야합니다.

아두이노 배선

아두이노블루투스 모듈(HC-06)
5VVCC
GNDGND
D2TXD
D3RXD
배선도

아두이노 블루투스 셋팅 소스 코드와 AT command

블루투스 모듈과 같은 통신 장비들은 주체와 객체의 구분을 위해 마스터와 슬레이브로 나뉩니다. 마스터는 통신에 있어서의 중심적인 역할을 하는 기기이고, 슬레이브는 마스터에 연결되는 주변 기기라고 생각하시면 됩니다. HC-06 모델은 대부분 기본적으로 슬레이브 상태로 지정되어 있습니다. 아두이노간의 통신을 위해선 하나의 장치를 마스터로, 다른 하나는 슬레이브로 지정해야 블루투스 연결이 가능해집니다.

블루투스 모듈의 내부 설정을 바꾸기 위해선 AT Command 라는 명령어를 사용합니다. 우선 AT 명령어를 사용하기 전에 블루투스 모듈이 연결된 아두이노에 다음과 같은 코드를 업로드합니다.

#include <SoftwareSerial.h>

SoftwareSerial BTSerial(2, 3); // 블루투스 모듈과의 통신을 위한 핀 2, 3번 지정

void setup() {
Serial.begin(9600); // 시리얼 모니터 보드레이트 값
BTSerial.begin(9600); // HC-06의 보드레이트 기본값
}

void loop() {
if (BTSerial.available()) { // 블루투스에서 어떤 값을 받으면 시리얼 모니터로 출력
Serial.write(BTSerial.read());
}

if (Serial.available()) { // 시리얼 모니터에서 어떤 값이 입력되면 블루투스로 전송
BTSerial.write(Serial.read());
}
}

코드가 업로드 되면 시리얼 모니터를 엽니다.

먼저 AT 명령어가 원활히 전달되는지 확인하기 위해 “AT” 라고 입력하여 전송합니다. 시리얼 모니터에 OK라고 뜨면 성공입니다. 만약 아무 반응이 없을 경우 line ending 없음, 9600 보드레이트에 맞춰져있는지 확인해야합니다.

블루투스간의 연결을 위해선 모듈의 이름이 동일해야합니다. “AT+NAME(지정하고 싶은 이름)” 을 입력하여 전송합니다. 저는 “BTmodule” 로 설정했습니다. 시리얼 모니터에 “OKsetname” 이라고 뜨면 이름 변경이 완료됩니다.

이름과 마찬가지로 블루투스 모듈에 접근하기 위한 PIN번호를 일치시켜 줍니다. “AT+PIN(지정하고 싶은 비밀번호)”를 입력한 후 전송합니다. 보통 4자리의 번호를 사용합니다. “OKsetPIN” 이라고 뜨면 성공입니다. 위의 과정까지 각각의 마스터, 슬레이브가 될 모듈에 대해 동일하게 수행합니다.

이번엔 블루투스 모듈이 마스터로 동작할지, 슬레이브로 동작할지를 결정합니다. 마스터가 될 메인 모듈의 경우 “AT+ROLE=M”을 입력한 후 전송합니다. “OK+ROLE:M”이라고 나타나게 되면 설정이 완료됩니다. 슬레이브가 될 모듈의 경우 “AT+ROLE=S”를 입력하여 전송합니다. “OK+ROLE:S”라고 나타나게 되면 설정이 완료됩니다.

모든 설정을 마친 후 마스터 모듈이 연결된 아두이노는 AT 명령어 전송을 위해 업로드된 상태로 놔두고, 슬레이브 모듈이 연결된 아두이노엔 다음과 같은 코드를 업로드 합니다.

#include <SoftwareSerial.h>

SoftwareSerial BTSerial(2, 3); // 블루투스 모듈과의 통신을 위한 핀 2, 3번 지정

void setup() {
pinMode(13, OUTPUT); // 13번 핀(아두이노 내장 LED) 출력으로 설정
Serial.begin(9600); // 시리얼 모니터 보드레이트 값
BTSerial.begin(9600); // HC-06의 보드레이트 기본값
}

void loop() {
if (BTSerial.available()) { // 블루투스에서 어떤 값을 받을때
if(BTSerial.read() == ‘0’) digitalWrite(13, LOW); // 0 이면 LED 끔
else digitalWrite(13, HIGH); // 그 외 값이면 LED 켬
}
}

동작 화면과 배선

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다