[참고 자료]
https://www.aranacorp.com/en/arduino-and-bluetooth-module-hc-06
1) Bluetooth HC-06 사양
- 2.4GHz 안테나 내장
- EDR 블루투스 2.0 (2Mbps ~ 3Mbps)
- 외부 8Mbit FLASH
- 3.3V ~ 5V 사용 가능 (최대 7V)
- 표준 HCI 포트 (UART)
- 디지털 2.4GHz 무선 송신
- 블루투스 클래스 2 전력 레벨
- 보관 온도 : -40 +85도
- 작동 온도 : -25 +75도
- 외형 : 27x13x2 (mm)
- 패어링 시 기본 암호 : 0000 or 1234
HC-06은 슬레이브 모듈이기 때문에 다른 장치에 연결하는 기능을 수행할 수 없다.
(단, HC-06의 펌웨어가 1.7 버전 이상이면 가능)
다른 장치에 연결하려면 HC-06의 펌웨어 버전이 1.7 이상이거나 'HC-05' 와 같은 마스터 모듈이 필요하다.
일부 HC-06 모듈은 3V3에서 작동하며 핀 Rx에서 5V 전압 레벨을 지원하지 않는다.
이 경우 로직 신호를 변환하기 위해 전압 분배기 브리지가 필요하다.
핀 3과 Rx 사이에 1kΩ 저항, Rx와 GND 사이에 2kΩ 저항
2) 아두이노와 연결
소프트웨어시리얼을 사용하지 않을 경우
3) AT Command
'HC-06' 에 전원이 공급된 상태에서, 페어링되어 있지 않아야 한다
다음 코드를 사용하면 시리얼 모니터를 사용하여 매개변수를 수정할 수 있다.
#include <SoftwareSerial.h>
SoftwareSerial hc06(2, 3);
void setup(){
//Initialize Serial Monitor
Serial.begin(9600);
Serial.println("ENTER AT Commands:");
//Initialize Bluetooth Serial Port
hc06.begin(9600);
}
void loop(){
//Write data from HC06 to Serial Monitor
if (hc06.available()){
Serial.write(hc06.read());
}
//Write from Serial Monitor to HC06
if (Serial.available()){
hc06.write(Serial.read());
}
}
시리얼 통신을 테스트하려면 시리얼 모니터에 AT를 입력하고 전송을 클릭하거나 Enter 키를 누른다.
통신 옵션에서 'Line Ending 없음'과 '올바른 전송 속도'를 선택해야 한다. 모듈은 OK라고 응답해야 한다.
모듈 이름을 수정하려면 'AT+NAMEmodule_name' 을 입력한다. (모듈 이름을 'BTM1' 로 변경하려면 'AT+NAMEBTM1' 을 입력)
모듈은 'OKsetname' 을 응답해야 한다.
모듈 PIN 코드를 수정하려면 'AT+PINxxxx' 를 입력한다. (PIN을 '0000' 으로 변경하려면 'AT+PIN0000' 을 입력)
모듈은 'OKsetPIN' 로 응답해야 한다.
모듈 통신 속도를 수정하려면(필요한 경우에만) AT+BAUDx를 입력한다.
(전송 속도를 9600으로 변경하려면 'AT+BAUD4' 를 입력)
(1200의 경우 1, 2400의 경우 2, 4800의 경우 3, 9600의 경우 4, 19200의 경우 5, 38400의 경우 6, 57600의 경우 7, 115200의 경우 8)
모듈은 'OK9600' 로 응답해야 합니다.
AT+VERSION 이라고 치면, 블루투스의 버젼이 표시된다. (1.7 이상의 경우는 MASTER/SLAVE 가능)
마스터로 설정 AT+ROLE=M
슬레이브로 설정 AT+ROLE=S
변경이 되면, 설정을 적용하기 위해서, 전원을 제거한 후 다시 인가해야 한다.
마스터와 슬레이브를 서로 연결하려면, HC-06의 비밀번호와 통신 속도가 동일해야 한다.
4) Sketch Code
1) 스마트폰과 통신하기
#include <SoftwareSerial.h>
SoftwareSerial hc06(2, 3);
void setup() {
//Initialize Serial Monitor
Serial.begin(9600);
Serial.println("ENTER AT Commands:");
//Initialize Bluetooth Serial Port
hc06.begin(9600);
}
void loop() {
//Write data from HC06 to Serial Monitor
if (hc06.available()) {
Serial.write(hc06.read());
}
//Write from Serial Monitor to HC06
if (Serial.available()) {
hc06.write(Serial.read());
}
}
2) 스마트폰으로 아두이노에 연결된 LED 켜기
#include <SoftwareSerial.h>
int bluetooth_Tx = 2;
int bluetooth_Rx = 3;
int LED = 13;
SoftwareSerial bluetooth (bluetooth_Tx, bluetooth_Rx);
void setup()
{
Serial.begin(9600);
delay(100);
bluetooth.begin(9600);
pinMode(LED, OUTPUT);
}
void loop()
{
char cmd;
if ( bluetooth.available() )
{
cmd = (char)bluetooth.read();
Serial.write(cmd);
if ( cmd == '1' )
{
digitalWrite(LED, HIGH);
delay(1000);
}
if ( cmd == '2' )
{
digitalWrite(LED, LOW);
delay(1000);
}
}
}
3) 아두이노에 연결된 센서값을 스마트폰에서 확인 / 제어
#include <SoftwareSerial.h>
SoftwareSerial hc06(2, 3);
String cmd = "";
float sensor_val = 0;
void setup() {
//Initialize Serial Monitor
Serial.begin(9600);
//Initialize Bluetooth Serial Port
hc06.begin(9600);
}
void loop() {
//Read data from HC06
while (hc06.available() > 0) {
cmd += (char)hc06.read();
}
//Select function with cmd
if (cmd != "") {
Serial.print("Command recieved : ");
Serial.println(cmd);
// We expect ON or OFF from bluetooth
if (cmd == "ON") {
Serial.println("Function is on");
} else if (cmd == "OFF") {
Serial.println("Function is off");
} else {
Serial.println("Function is off by default");
}
cmd = ""; //reset cmd
}
// Simulate sensor measurement
sensor_val = (float)random(256); // random number between 0 and 255
//Write sensor data to HC06
hc06.print(sensor_val);
delay(100);
}
SoftwareSerial hc06(Rx,Tx) 시리얼 포트의 핀을 정의
hc06.begin() baudrate를 정의 (값은 모듈과 같아야 함)
hc06.available() 모듈의 버퍼에서 데이터를 사용할 수 있는지 테스트
hc06.read() 한 번에 한 바이트씩 데이터를 읽음
hc06.print() ASCII 형식으로 문자열 보내기
hc06.write() 데이터를 한 번에 한 바이트씩 보냄
4) Baudrate scanner
통신 전송 속도가 올바르게 설정되면 Bluetooth 모듈이 OK로 응답해야 한다.
이 코드는 모듈이 제대로 작동하는지, 그리고 어떤 전송 속도를 사용하는지 빠르게 알려준다.
#include <SoftwareSerial.h>
SoftwareSerial hc06(2, 3);
void setup() {
//Initialize Serial Monitor
Serial.begin(9600);
// scan
scanBaudrate();
}
void loop() {}
void scanBaudrate() {
unsigned long bauds[12] = {300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 74880, 115200, 230400, 250000};
for (int i = 0; i < 12; i++) {
hc06.begin(bauds[i]);
delay(10);
Serial.print(F("Baudrate "));
Serial.println(bauds[i]);
command("AT", 2000);
}
}
String command(const char *toSend, unsigned long milliseconds) {
String result;
Serial.print("Sending: ");
Serial.println(toSend);
hc06.print(toSend);
unsigned long startTime = millis();
Serial.print(F("Received: "));
while (millis() - startTime < milliseconds) {
if (hc06.available()) {
char c = hc06.read();
Serial.write(c);
result += c; // append to the result string
}
}
Serial.println(); // new line after timeout.
return result;
}