2016년 10월 3일 월요일

아두이노에서 HC-06 다루기

HC-06은 Bluetooth SPP 통신을 위한 장치입니다.
HC-06

HC-06의 Pin은 다음과 같이 구성되어 있습니다.
  • VCC: 전원(+) 핀
  • GND: 접지(-) 핀
  • TX: 데이터 송신 핀
  • RX: 데이터 수신 핀
주의할 점은 HC-06은 2가지 타입이 있는데, 데이터 송수신 핀의 전압에 따라 3.3V와 5V 타입으로 나뉩니다. 자신이 갖고 있는 HC-06 모듈이 어떤 타입인지 잘 알고 있어야 합니다.
HC-06 3.3V 타입

HC-06 5V 타입

아두이노 Uno는 5V로 부품을 제어 하기때문에 HC-06 5V 타입은 그대로 연결해도 되지만, HC-06 3.3v 타입은 전압을 맞춰줘야만 사용할 수 있습니다.
3.3v 전압을 맞추기 위해서 사용하는 회로는 전압 분배(Voltage Divider) 회로입니다.
전압 분배 회로

R1과 R2의 크기를 1:2 비율로 맞춘다면 공식에 의해 5 * (2/3) = 3.33의 계산이 이루어집니다. 따라서, HC-06 3.3v 타입은 전압 분배 회로와 같이 사용해야 합니다.

아두이노 보드는 외부 장치와 통신할 수 있는 UART를 1개만 보유하고 있습니다. 이것은 USB에 연결되어 있어서 PC와 통신할때 사용합니다.
만약, HC-06을 UART에 연결하면 USB통신을 할 수 없습니다.
따라서, HC-06을 연결하여 USB 통신을 포기하던가 아니면 HC-06과의 연결을 선택할 수 있도록 만들어서 USB와 HC-06을 번갈아 사용해야 합니다.

아두이노에는 UART가 부족할 때, UART 기능을 만들 수 있는 유용한 라이브러리가 있습니다.
이것의 이름은 SoftwareSerial이며 이것을 사용하면 UART를 추가할 수 있습니다.
많은 아두이노 HC-06 예제를 보면 SoftwareSerial을 이용해서 통신을 하는 것을 볼 수 있습니다.
실제 UART를 이용한 통신 소스와 SoftwareSerial을 이용한 통신 소스를 비교해보면 그 사용법이 유사한 것을 알 수 있습니다.

<실제 UART 통신 소스>
void setup()
{
    Serial.begin(9600);
}

void loop()
{
    if(Serial.available() > 0)
    {
        char data = Serial.read();
        Serial.write(data);
    }
}


<SoftwareSerial 통신 소스>
#include<SoftwareSerial.h>

SoftwareSerial softSerial(10, 11);

void setup()
{
    softSerial.begin(9600);
}

void loop()
{
    if(softSerial.available() > 0)
    {
        char data = softSerial.read();
        softSerial.write(data);
    }
}

차이점은 Serial과 달리 SoftwareSerial은 TX, RX에 대한 핀 번호가 필요하다는 것입니다. 그 이유는 UART를 사용하는 Serial은 TX, RX 핀 번호가 고정되어 있지만, SoftwareSerial은 아무 핀이나 사용할 수 있기때문에 여러분이 정해줘야 한다는 것입니다.
이 이유로 SoftwareSerial을 통한 HC-06의 아두이노 연결 회로는 다음과 같습니다.
HC-06 3.3v 타입 연결

HC-06 5v 타입 연결

아두이노 보드와 HC-06이 시리얼 통신을 하기 위해서 가장 중요한 것은 통신 속도를 맞추는 것입니다. 시리얼 통신에서 통신 속도는 보레이트(Baudrate)라고 부르며, 아무 숫자나 사용하는 것이 아니고 규격이 정해져있습니다.
  • 4800bps
  • 9600bps
  • 19200bps
  • 38400bps
  • 57600bps
  • 115200bps
이 중에 골라서 사용해야 하는데, 값이 클수록 고속 통신이기에 주고받을 수 있는 데이터 양이 많아집니다. 문제는 아두이노 보드에서 보레이트는 스케치 작성을 통해 설정할 수 있지만, HC-06은 그렇지 못하다는 것입니다.
HC-06의 보레이트를 변경하기 위해서는 다른 방법을 사용해야 합니다.
HC-06은 통신에 필요한 설정을 위해 AT Command라는 방식을 사용합니다.
이것은 HC-06의 TX, RX선을 사용해서 AT+데이터라는 특별한 형식으로 정보를 보내주면 필요한 설정을 할 수 있는 방식입니다.
AT Command 사용 방법은 인터넷을 통해 쉽게 찾을 수 있는데, 여기서는 자주 사용하는 몇 가지만 소개하겠습니다.
AT CommnadResponseFunction
ATOKHC-06이 연결되었는지 확인
AT+NAMEOOOOKsetname블루투스 장치 검색 시 나타나는 이름 설정
AT+BAUD4OK9600보레이트를 9600bps로 설정
AT+BAUD5OK19200보레이트를 19200bps로 설정
AT+BAUD6OK38400보레이트를 38400bps로 설정
AT+BAUD7OK57600보레이트를 57600bps로 설정
AT+BAUD8OK115200보레이트를 115200bps로 설정

이 명령어를 HC-06에 전달하는 방법은 2가지 입니다.
  • 아두이노 스케치 코드로 전달한다.
  • 아두이노 시리얼 모니터를 이용해서 전달한다.

아두이노 스케치 코드로 전달하는 예는 아래와 같습니다.


void setup()
{
    Serial.begin(9600);
    Serial.write("AT+NAMEmyHC-06"); // Change name to "myHC-06"
}

아두이노 시리얼 모니터는 아두이노 UART를 통해 사용자와 정보를 주고받을 수 있는 유틸리티이며 Arduino IDE에 포함되어있습니다.
시리얼 모니터를 통해 아두이노 보드 상태를 알 수 있다.

시리얼 모니터를 통해 AT Command를 전달하려면 아두이노 스케치가 중간에서 역할을 해줘야 합니다.
다음 스케치 소스는 시리얼 모니터를 통해 HC-06에 AT Command를 전달할 수 있게 해줍니다.

#include<SoftwareSerial.h>

SoftwareSerial softSerial(10, 11);

void setup()
{
    Serial.begin(9600);
    softSerial.begin(9600);
}

void loop()
{
    while(Serial.available() > 0)
    {
        char command = Serial.read();
        softSerial.write(command);
    }

    while(softSerial.available() > 0)
    {
        char response = softSerial.read();
        Serial.write(response);
    }
}


마지막으로 다룰 내용은 고속 통신 방법에 관한 것입니다.
HC-06은 115200bps까지 통신 속도를 올릴 수 있습니다. 물론, 이 통신 속도는 앞에서 언급한 AT Command를 이용해서 설정해야 합니다.
앞에서는 SoftwareSerial을 이용해서 아두이노 보드와 HC-06이 통신하는 방법을 설명했는데, SoftwareSerial은 높은 보레이트에서 안정적이지 않아서 통신이 잘 되지 않습니다. 알려진바로는 9600bps 이상을 넘어가면 통신이 되지 않는다고 합니다.
따라서, SoftwareSerial을 사용할 때는 9600bps로 설정할 것을 권장드립니다.
만약, 그 이상의 보레이트를 원하는 경우는 UART에 연결해서 사용해야 합니다.
하지만, HC-06 3.3v 타입의 경우는 전압 분배 회로를 사용한다해도 UART 연결 시 통신이 잘 되지 않을 수 있습니다.
그 이유는 고속 통신 시에는 정보 손실을 최소화하기 위한 부가 회로들이 필요한데, 전압 분배 회로만으로는 해결되지 않기 때문입니다.
이 문제는 아주 전문적인 내용이기때문에 아두이노에서 해결하는 것은 맞지 않습니다.
따라서, 되도록이면 HC-06 5V 타입을 사용할 것을 권장합니다.



댓글 1개: