본문 바로가기

IoT

HC-06 블루투스

728x90

HC-06 블루투스


스펙

동작 전압 : 3.6~6V

통신 방식 : Serial(UART) Interface (AT Command)

프로토콜 : Bluetooth 2.0+ EDR standard

운영주파수 : 2.4Ghz ISM frequency band

전송속도 : 2.1Mbps(Max)/160 kbps(Asynchronous); 1Mbps/1Mbps(Synchronous)



블루투스 

HC-06은 CSR BC417 칩을 기반으로하는 블루투스 모듈입니다

기본적으로 HC-06에 대한 설정과 데이터 전달은 Serial 통신 방식을 취하고 있으며 설정에 관련해서는 AT command를 사용하고 있습니다

AT Command라 함은 과거 1981년 모뎀에 사용된 명령어 세트인 Hayes command set 에서 Command 앞에 AT를 붙여 Command을 주기 때문에 이후 AT Command라 보편적으로 불리우고 있습니다


블루투스 모듈의 경우 일반적으로 마스터 슬레이브 관계를 갖고 있습니다

마스터와 슬레이브는 어떤쪽이 연결을 주도할것인가 따라 구분이 됩니다 연결을 주도하는 것이 마스터라고 보시면 되며

일반적으로 우리가 사용하는 블루투스 헤드셋과 같은 장치가 슬레이브에 해당합니다 이때 연결을 주도하는 스마트폰이나 PC등의 디바이스가 마스터가 됩니다 (주도한다는 뜻은 어떤 블루투스 장비가 있는지 확인하고 선택하여 연결을 위해 핀번호를 입력하는것과 같은 일련의 과정이라고 간단히는 이해하여도 됩니다)

물론 연결이 완료된 상태에서는 슬레이브 마스터 관계없이 양방향 통신이 가능합니다


스펙에 블루투스 버전이 명시되어 있는데 간략하게 버전별 차이점을 아래 차트를 통해 확인해 보겠습니다

 블루투스 버전

 기능

 데이터 전송 속도

 무선 범위

 v1.0

Basic rate

 723.1 Kbps

 10 m

 v2.0 +EDR

Basic Rate
Pairing
EDR - Enhanced Data Rate 

 2.1 Mbps

 10 m

 v2.1 +EDR

Basic rate

SSP - Secure Simple

Improved Pairing

EDR - Enhanced Data Rate

Sniff Subrating (Long Life Battery)

 3 Mbps

 10 m

 v3.0 +HS

Basic Rate

Improved Pairing

EDR

SSP

HS - High Speed Protocol

Intergrated Power Management

 24 Mbps

 10 m

 v4.0 / 4.1 / 4.2

Basic Rate

Improved Pairing

EDR

SSP

HS

LE - Low Energy Protocol

 25 Mbps

 50 m

 v5.0

Basic Rate

Improved Pairing

EDR

SSP

HS

LE

IoT - Internet of Things Protocol

48 Mbps 

 200 m

HC-06의 경우 v2.0의 EDR 지원을 명시하고 있기에 해당하는 물리적 스펙을 갖게 됩니다


예전에 판매되던 HC-06의 모듈의 경우는 Master와 Slave가 고정되어 나왔지만 펌웨어 버전이 올라감에 따라 최근 제품중에는 모듈의 Master 와 Slave를 AT Command 로 세팅할수 있게 되었습니다

기본적으로는 HC-06에서는 "AT+VERSION" 과 같은 형식으로 HC-06에 설정을하거나 설정값을 가져오거나 하는 명령을 사용합니다



AT Command

HC-06은 다음과 같은 AT명령을 갖고 있습니다

AT  : 기본적인 통신 테스트

반환값 : OK

AT+VERSION : 펌웨어 버전 출력

반환값이 1.7 이상일 경우는 일반적으로 슬레이브와 마스터 설정을 할 수 있습니다

AT+ROLE=S   : 슬레이브 동작 모드

반환값 : OK+ROLE:S

AT+ROLE=M  : 마스터 동작 모드

반환값 : OK+ROLE:M

AT+BAUD1   : 전송속도 포함된 숫자에 따라 1:1200, 2:2400, 3:4800, 4:9600, 5:19200, 6:38400, 7:57600, 8:115200 bps

반환값 : OK115200 과 같이 OK뒤에 설정한 buadrate

AT+PN : no parity 설정

AT+PE : even parity 설정

AT+PO : odd parity 설정

AT+NAMEdevicename  : devicename 에 이름 입력시 블루투스 이름으로 설정 

반환값 OKname

AT+PINxxxx : 핀번호 설정

반환값 : OKsetpin



하드웨어 연결

일반적으로 모듈에 각 핀에 대해 명시되어 있습니다 (그렇지 않은 경우는 제조사 정보를 참조하여 주세요)

VCC는 MCU의 5v에  GND는 MCU의 GND에 

RXD와 TXD는 각각 MCU의 디지털 핀에 연결합니다 (아두이노 나노의 경우는 D3핀이 RXD이며 D2핀이 TXD핀이 됩니다)

아래 예제 코드에서는 온도센서까지 연결하여 온도값을 블루투스를 통해 보내도록 구성되어 DHT-11 센서와 같이 연결해보았습니다

(DHT-11 의 연결은 다음 게시물을 참조하여 주세요  https://embedscope.com/97 )


(클릭하면 확대)



제어

기본적으로 HC-06 모듈의 설정을 하기위한 AT command 사용을 위해서 시리얼 통신방식을 취하고 있기 때문에 MCU의 시리얼 핀에 연결해야 하지만 보통 시리얼 라인은 콘솔 연결을 위하여 사용되기 때문에 소프트웨어 시리얼 통신을 구현하는 방식으로 보통 연결을 하게됩니다

아두이노의 경우는 관련하여 SofrwareSerial 기능을 이미 제공하고 있기에 이를 활용하게 됩니다



아두이노 지원 (ATmega328P)

하기 예제는 온도센서로 부터 받은 온도 값을 HC-06 블루투스모듈을 사용하여 데이터를 전달하는 기능을 제공합니다

샘플코드에 사용되는 온도센서 라이브러리는 https://github.com/adafruit/DHT-sensor-library 를 사용합니다

참고로 adafruit 센서 라이브러리들은 의존적으로 https://github.com/adafruit/Adafruit_Sensor 필요하기에

해당 라이브러리는 사용하시는 IDE 라이브러리에 추가가 필요합니다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include <Arduino.h>
 
// HC-06 블루투스
// TXD : 2 Pin / RXD : 3 Pin
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(23); // (Tx, Rx)
char recv_str[100];
int setupBTconnection();
int sendBTcommand(const char command[]);
int recvMsg(unsigned int timeout);
int recvMsg(unsigned int timeout);
 
// DHT-11 온습도센서
#include <DHT.h>
#define DHTPIN 8    // 연결된 디지털 핀
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);
 
void setup()
{
  Serial.begin(9600); // 시리얼 초기화
  BTSerial.begin(9600); // 블루투스 소프트 시리얼 초기화
  setupBTconnection(); // 블루투스 초기화 설정
  dht.begin(); // 온습도센서 초기화
}
 
void loop()
{
  // 온도센서 값 읽기
  float hum = dht.readHumidity();
  float temp = dht.readTemperature();
  if (isnan(hum) || isnan(temp))
  {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  Serial.print("Temperature: ");
  Serial.print(temp);
  Serial.print(" *C\t");
  Serial.print("Humidity: ");
  Serial.print(hum);
  Serial.println(" % ");
 
  // 블루투스 통해서 온도값 보내기
  char temp_buf[10];
  dtostrf(temp, 70, temp_buf);
  BTSerial.write(temp_buf);
  Serial.println("Send Bluetooth Msg");
  BTSerial.write("\r\n");
 
  delay(5000);
}
 
/* HC-06 블루투스 */
int setupBTconnection()
{
  Serial.print("Setting up Bluetooth\r\n");
  delay(2000); //모듈 시작 대기
 
  // AT Command를 사용하여 통신가능 상태까지 대기
  while (1)
  {
    if (sendBTcommand("AT"== 0)
    {
      if (strcmp((char *)recv_str, (char *)"OK"== 0)
      {
        Serial.println("Bluetooth exists\r\n");
        break;
      }
    }
    delay(500);
  }
 
  // 이름 핀번호 BaudRate 설정
  sendBTcommand("AT+ROLE=S"); // 슬레이브 모드
  sendBTcommand("AT+VERSION"); // 버전 표시
  sendBTcommand("AT+NAMEHC-06"); // 이름 설정
  sendBTcommand("AT+PIN1234"); // 핀번호 설정
  sendBTcommand("AT+BAUD4"); // BaudRate 설정
 
  delay(2000); // 모듈 설정 적용 재시작 대기
 
  // AT Command를 사용하여 통신가능 상태 확인
  if (sendBTcommand("AT"== 0)
  {
    if (strcmp((char *)recv_str, (char *)"OK"== 0)
    {
      Serial.print("Setup complete!\r\n\r\n");
      return 0;
    }
  }
 
  return -1;
}
 
// AT Command 보내기
int sendBTcommand(const char command[])
{
  Serial.print("send: ");
  Serial.print(command);
  Serial.println("");
 
  BTSerial.print(command);
 
  delay(300);
 
  if (recvMsg(800!= 0return -1;
 
  Serial.print("recv: ");
  Serial.print(recv_str);
  Serial.println("");
  return 0;
}
 
// 보낸 AT Command에 대한 반환값 받기
int recvMsg(unsigned int timeout)
{
  unsigned int time = 0;
  unsigned char num;
  unsigned char i;
 
  // 타임 아웃시간 안에 첫번째 Char 값이 읽어지는지 확인
  i = 0;
  while (1)
  {
    delay(50);
    if (BTSerial.available())
    {
      recv_str[i] = char(BTSerial.read());
      i++;
      break;
    }
    time++;
    if (time > (timeout / 50)) return -1;
  }
 
  // 첫번째 char 값 이후 값을 읽기
  while (BTSerial.available() && (i < 100))
  {
    recv_str[i] = char(BTSerial.read());
    i++;
  }
  recv_str[i] = '\0';
  return 0;
}
 
 
cs



실행시 시리얼 출력 상태



블루투스 온도센서 전달값 확인 방법

안드로이드 폰 설정의 블루투스 항목에서 검색되는 HC-06을 선택한뒤 위에서 설정한 핀번호를 입력하여 등록합니다

앱스토어에서 Serial Bluetooth Terminal 앱을 설치한뒤 앱을 실행합니다

앱 우측 상단의 연결 버튼을 클릭하여 연결하면 아래와 같은 온도값이 표시되는것을 확인할 수 있습니다


     


     



  

MBED 지원 (STmicroelectroics NUCLEO-L432KC)




CSR BC417 datasheet



728x90