Hardware | bluetooth 모듈 HC-06 / HC-05 사용해 보기 - 2

|

일전에 구입해 놓은 bluetooth 모듈인, HC-06, HC-05, SPP-C 사용기 2탄 입니다.

첫번째 포스트는 아래 링크를 참고해 보세요.


* Hardware | bluetooth 모듈 HC-06 / HC-05 사용해 보기 - 1

- https://chocoball.tistory.com/entry/Hardware-bluetooth-HC06-HC05-1


오늘은 master/slave 두 가지 모드를 지원하는 HC-05 에 대해 알아봅니다.




1. Firmware


Wi-Fi 모듈처럼 자체 firmware 를 가지고 있습니다.

Firmware 를 최신버전으로 update 하고 싶었으나, 인터넷에서 찾기는 어렵네요.


HC-05 는 Bluetooth 계열에서는 고가면서 다기능인 RN42 로 업그레이드가 가능하다고 하지만,

저의 PCB 는 불가능한 제품임을 알게 되었습니다.


* Fake HC-05/HC-06 modules with BlueCore3 chips relabeled as BC417

https://github.com/lorf/csr-spi-ftdi/issues/25



언뜻 튜닝 요소가 많아 보이지만, 요즘 나오는 제품들은 튜닝이 불가능 한것 같습니다.




2. USB 시리얼 연결


궂이 arduino 를 통해서 연결할 필요는 없고, 직접 serial 통신으로 연결합니다.


  HC-05 | FTDI
----------------
   RX   |  TX
   TX   |  RX
----------------
        | POWER
----------------
   GND  |  GND
   VCC  |  3.3V
----------------


Arduino 를 거치지 않더라도 Arduino IDE 를 사용할 수 있습니다.

FTDI 가 연결 된 Port 만 정확하게 선택하면 Serial Monitor 를 이용하여 AT 명령어를 확인해 볼 수 있습니다.



HC-05 가 사용하는 전류량이 많은지라, arduino 나 FTDI 에서 전력을 공급하면 불안정한 모습을 보입니다.

Bluetooth 모듈도 Wi-Fi 모듈과 동일하게, 외부 전원을 이용하는 편이 좋습니다.



실제 연결은 다음과 같습니다.





3. AT mode


HC-05 가 동작하는 mode 는 두 가지가 있습니다. 하나는 보통 mode 이고, 다른 하나는 AT mode.

Normal mode 는 LED 깜빡임이 빠르고, AT mode 는 깜빡임이 느려서 그 구분을 할 수 있습니다.


참고로 설정을 변경할 수 있는 모드가 AT mode 이고, 기본 모드가 아닙니다.


* Normal mode



* AT mode



AT mode 로 들어가는 방법은 두 가지가 있습니다.



EN pin 을 high 로 (전원 연결)

EN pin 에 대해 전원을 연결한 상태로 키면 AT mode 로 진입하게 됩니다.

어떤 제품은 그냥 켰다가, 한번만이라도 EN 에 전원을 인가해 주면 AT mode 로 접근한다 하는데, 제꺼는 처음부터 high 로 놓지 않으면 AT mode 로 진입할 수 없었습니다.


Button 를 누른 상태에서 켜기

위의 화살표 버튼을 누른 상태에서 전원을 인가하면, AT mode 로 동작합니다.

그 뒤에 손을 놔도 그대로 AT mode 를 유지합니다.





4. Command list


HC-06 과 비슷하지만 다른 부분들도 있습니다.

주로 사용하는 command 를 가지고 간단한 설명을 남겨 놓습니다.



AT+VERSION?

firmware 버전에 대해 확인합니다.

비교적 요즈음 구매해서 그런지 "VERSION:3.0-20170601" 라고 뜨네요.


AT+STATE?

커멘드 입력시의 상태를 표시해 줍니다.

"INITIALIZED" ---- initialized status
"READY" ---- ready status
"PAIRABLE" ---- pairable status
"PAIRED" ---- paired status
"INQUIRING" ---- inquiring status 
"CONNECTING" ---- connecting status
"CONNECTED" ---- connected status
"DISCONNECTED" ---- disconnected status
"NUKNOW" ---- unknown status


AT+ROLE?

Master 인지 Slave 인지 확인할 수 있습니다. Master 이면 1, Slave 면 0 입니다.


AT+ADDR?

주소 정보를 반환해 줍니다.


AT+NAME?

기기 이름을 설정하거나 알려 줍니다.


AT+PSWD?

비밀번호를 확인할 수 있습니다.


AT+UART?

Serial connect 시에 사용될 속도를 설정/확인 할 수 있습니다.



AT+CMODE?

지정된 기기와 연결 시킬 것인지, 여러 기기와 통신하게 할 지를 정할 수 있습니다.

0 이면, 지정된 기기와의 연결만 가능하고, 1 이면 다른 여러 기기와 연결시킬 수 있는 mode 입니다.


AT+BIND?

연결할 상대 기기 주소 지정.


AT+POLAR?

PIO8 / PIO9 연결 상태에 따른 LED 표시 상태를 정의한다 합니다. 무슨 이야기 인지 하나도 모르겠습니다.


AT+IPSCAN?

IP 스캔할 인터벌과 타이밍을 설정합니다.


AT+SENM?

Safe / Encryption mode 라고 합니다.


AT+ADCN?

인증을 통해 pairing 된 기기의 수를 알려 줍니다.


AT+MRAD?

가장 최근에 인증을 통해 연결된 기기를 보여줍니다.


AT+MPIO?

Multiple port output 이라고 합니다. 무슨 소리인지 모르겠습니다.


AT+CLASS?

디바이스 타이프를 보여 줍니다.


AT+IAC?

Access code 에 GIAC type (General Inquire Access Code : default 는 0x9e8b33) 을 사용.


AT+INQM?

RSSI 모드로 몇 개의 device를 최장 몇 초동안 받아들일지의 설정.


잘 쓰이지 않을 보안과 deep한 설정은 잘 모르겠네요. 기준이 되는 문서를 첨부합니다.

추가로, firmware version 에 따라 명령어가 조금씩 다를 수 있습니다.


HC-0305_serial_module_AT_commamd_set_201104_revised.pdf




5. Slave 모드로 Windows 10 과 연결해 보기


HC-06 을 가지고 놀 때도 했지만, HC-05 이니 한번 더 동일한 방법으로 Windows 10 와 연결 해 봅니다.



인식 후, 연결을 위해 암호를 입력합니다.



특별한 문제 없이 연결 되었습니다.



장치 관리자에서 확인해 보면, Bluetooth 장치에 정상적으로 등록 되었네요.



Putty 로 연결해 보기 위해 COM port 를 확인해 봅니다.



Putty 의 Serial 로 연결해 봅니다.



Putty 에서 키보드로 입력하면, Putty 상에서는 보이지 않지만, Arduino IDE 의 Serial Monitor 에서는 전송된 글씨가 보입니다.



Slave 모드로 Windows 10 에 연결에 문제가 없네요.




6. Master 모드로 Slave 연동 - firmware 설정


마지막으로, HC-05 (Master) 와 HC-06 (Slave) 를 연결하여 통신이 가능한지 확인해 봤습니다.

참고한 사이트와 너tube 정보는 다음과 같아요.


* How to Configure HC-05 Bluetooth Module As Master and Slave Via AT Command

https://www.instructables.com/id/How-to-Configure-HC-05-Bluetooth-Module-As-Master-/


* Communication between Master HC-05 and Slave HC-05
    - https://www.youtube.com/watch?v=mY803K-5WxE



구성품은 arduino / 스위치 / LED 각각 두 개씩 필요하고, Master/Slave 가 될, HC-05 / HC-06 이 필요합니다.


HC-06 Slave 설정

우선 HC-06 Slave 에서 다음과 같이 설정합니다.


- AT+ROLE=0 : Slave 설정

- AT+ADDR? : Master 에 등록하기 위해 address 를 알아 냄

- AT+UART=38400,0,0 : Serial 통신 속도를 38400 으로 맞춤



통신속도를 맞추면, Serial Monitor 의 속도도 새로운 값 - 38400 에 맟줘 줘야 확인이 가능 합니다.



HC-05 Master 설정

그 다음으로, HC-05 Master 는 다음과 같이 설정합니다.


- AT+ROLE=1 : Master 설정

- AT+CMODE=1 : pairing 할 기기를 검색하지 않고, 지정하여 등록. 등록은 아래의 BIND 명령어로 설정.

- AT+BIND=98D3,41,F93341 : 패어링 할 Slave 기기를 지정. (위에서 Slave 의 ADDR 로 확인한 주소 정보)

- AT+UART=38400,0,0 : Serial 통신 속도를 38400 으로 맞춤



최종적으로 BIND 정보를 확인하여, Slave 어드레스가 잘 등록되어 있으면 OK 입니다.





6. Master 모드로 Slave 연동 - arduino 와 연결


Pin 연결은 다음과 같습니다.

HC-05 와 HC-06 의 연결은 Master/Slave 로 기능은 다르나, 연결 방법은 동일합니다.


 HC-05/06 | Arduino Nano
-------------------------
    TXD   |      D10
    RXD   |      D11
-------------------------
          |     POWER
-------------------------
    VCC   |      3.3V
    GND   |      GND
-------------------------
  SWITCH  |      D2
 LED+220Ω|      D8
-------------------------


회로도를 Fritzing 으로 그려 봤습니다.

최근에 업데이트 된 0.9.4 로 그렸는데, 그림 export 에 버그가 있네요. (점프선에 점선)



실제 구현한 사진 입니다.



주의할 점으로는, Wi-Fi 모듈 연결 시험 했을때와 동일하게, Bluetooth 모듈도 추가 전원으로 연결해야 원활한 확인이 가능 합니다.

Arduino 로부터 빼서 사용하는 전원은 충분치 못하여 불안정한 동작을 보입니다.



위의 사진 오른쪽 밑에 있는 것이 추가 전원입니다.

Arduino 에 써넣을 sketch 는 다음과 같습니다.


Master Source


//this is master

#include "SoftwareSerial.h"

SoftwareSerial BTSerial(10, 11);
int state = 0;
const int ledPin = 8;
const int buttonPin = 2;
int buttonState = 1;

void setup() {
  BTSerial.begin(38400);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  pinMode(buttonPin, INPUT);
  digitalWrite(buttonPin, HIGH);
}

void loop() {
 if(BTSerial.available() > 0) { 
    // Checks whether data is comming from the serial port
    state = BTSerial.read(); // Reads the data from the serial port
 }
 
 // Controlling the LED
 buttonState = digitalRead(buttonPin);
 
 if (buttonState == LOW) {
  BTSerial.write('1');
 } else {
  BTSerial.write('0');
 }
 
 if (state == '1') {
  digitalWrite(ledPin, HIGH); // LED ON
  state = 0;
 } else if (state == '0') {
  digitalWrite(ledPin, LOW); // LED ON
  state = 0;
 }
}


Slave Source


//this is slave

#include "SoftwareSerial.h"

SoftwareSerial BTSerial(10, 11);
int state = 0;
const int led = 8;
const int button = 2;
int buttonstate = 1;

void setup() {
  BTSerial.begin(38400);
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
  pinMode(button, INPUT);
  digitalWrite(button, HIGH);
}

void loop() {
 if(BTSerial.available() > 0) { 
    // Checks whether data is comming from the serial port
    state = BTSerial.read(); // Reads the data from the serial port
 }
 
 // Reading the button
 buttonstate = digitalRead(button);
 
 if (buttonstate == LOW) {
   BTSerial.write('1'); // Sends '1' to the master to turn on LED
 } else {
   BTSerial.write('0');
 }  

  if (state == '1') {
  digitalWrite(led, HIGH); // LED ON
  state = 0;
 } else if (state == '0') {
  digitalWrite(led, LOW); // LED ON
  state = 0;
 }
}


여기까지 오면 모든 준비는 다 되었습니다.




7. Master 모드로 Slave 연동 - 확인


HC-05 (Master) 와 HC-06 (Slave) 끼리의 연동 통신을 위해 서로 LED 가 깜빡거리다 연결 됩니다.


Arduino 소스 및 회로에서 구성한 대로,

Master 의 스위치를 누르면, Slave 쪽의 LED 가 켜지고, Slave 의 스위치를 누르면, Master 쪽의 LED 가 점등하는 것을 알 수 있습니다.



문제 없이 서로 통신하고 있다는 것을 LED 점등으로 확인 할 수 있습니다.




8. SPP-C 연동


다음 편에서는 SPP-C 확인을 해보도록 하겠습니다.




And