중급 예제

약간은 익숙하시거나 익숙해지셨나요? 그렇다면 조금더 깊이 다뤄볼까요?

블루투스 모듈(HC-06)-무선통신

2017-06-20 09:19:24

개요

 

보통 아두이노에서 블루투스 모듈을 사용한다고 하면 스마트폰 어플과 연동하여 무선으로 아두이노를 제어하거나 값을 받아올 때 많이 사용합니다.

이 부분에 있어서는 어플만 존재하면 어렵지 않고, 검색하면 많은 예제들이 존재하기 때문에 쉽게 따라할 수 있는 편입니다.

 

이번에 소개하는 통신은 2개의 블루투스 모듈(HC-06)을 통해 아두이노 간 무선통신을 하는 방법에 대해 알아보겠습니다.

 

 

 

 

동영상

 

 

 

 

 

 

필요한 부품 목록

 

NO 부품명 수량 상세설명
 1 오렌지 보드  
2 블루투스 모듈 2 HC-06
3 점퍼 케이블 8  

 

 

부품명 오렌지 보드 블루투스 모듈 점퍼케이블
파트

 

 

 

 

 

 

하드웨어 making

 

브레드보드

 

※ 아두이노간 통신이기 때문에 아래와 같은 회로 연결이 2개 필요합니다.

 

 

 

 

 

블루투스 모듈 세팅하기

 

블루투스 간 통신을 하기위해서는 HC-06모듈이 2개 필요하지만 버전도 중요합니다. 

이전에는 HC-06의 모듈이 Master와 Slave가 고정되어 나왔지만 버전이 올라감에 따라 모듈의 Master/Slave를 ATcommand로 세팅할 수 있게 되었습니다.

 

블루투스 모듈의 펌웨어를 확인할 수 있는 ATcommand는 AT+VERSION입니다.

 

<AT+VERSION을 입력 시, 위의 시리얼 모니터와 같이 버전이 출력>

 

 

 

 

 

 

버전을 확인하고 모듈의 버전이 v1.7이상이면 블루투스 간 통신을 할 수 있습니다.

버전을 확인 했으면 블루투스 간 통신을 위해 블루투스 모듈의 역할을 지정해주어야 합니다.

블루투스모듈(hc-06)의 기본 세팅은 Slave로 세팅되있기 때문에 블루투스간  1:1통신을 위해서는 하나는 Master, 다른 하나는 Slave가 되어야 합니다.

 

각각의 모듈은 ATcommand를 통해 역할을 지정할 수 있습니다. 명령어는 AT+ROLE=M 또는 S입니다.

 

 

AT+ROLE = M : 블루투스 모듈을 Master로 지정

AT+ROLE = S : 블루투스 모듈을 Slave로 지정

 

 

<AT+ROLE=M 또는 S을 입력 시, 위의 시리얼 모니터와 같이 모듈의 역할을 지정>

 

 

 

 

 

 

※ 블루투스 모듈이 Slave모드일 때는 LED가 빠르게 깜빡거리지만

Master모드로 변경되었을 때는 LED의 깜빡거리는 속도가 느려집니다. 

만약 모드를 변경했을 때 제대로 변경됐는지 확인하려면 LED의 깜빡거리는 속도를 확인하세요.

(모드 변경 후 모듈을 껐다가 다시 켜야 변경사항이 적용됩니다!!!!) 

 

  블루투스 모듈 A 블루투스 모듈 B
버전(Version) v1.7이상 v1.7이상
역할(Role) M(Master) S(Slave)

 

 

소프트웨어 coding

 

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); //블루투스의 Tx, Rx핀을 2번 3번핀으로 설정

void setup() {
  // 시리얼 통신의 속도를 9600으로 설정
  Serial.begin(9600);
  while (!Serial) {
    ; //시리얼통신이 연결되지 않았다면 코드 실행을 멈추고 무한 반복
  }


  Serial.println("Hello World!");

  //블루투스와 아두이노의 통신속도를 9600으로 설정
  mySerial.begin(9600);
}

void loop() { //코드를 무한반복합니다.
  if (mySerial.available()) { //블루투스에서 넘어온 데이터가 있다면
    Serial.write(mySerial.read()); //시리얼모니터에 데이터를 출력
  }
  if (Serial.available()) {    //시리얼모니터에 입력된 데이터가 있다면
    mySerial.write(Serial.read());  //블루투스를 통해 입력된 데이터 전달
  }
}

 

 

 

 

 

 

두 개의 아두이노에 위 코드를 업로드 후 블루투스 모듈을 서로 가까이 대면 스스로 페어링되면서 통신이 됩니다. 

(꼭 가까이 대지 않더라도 마스터 슬레이브가 통신 공간내에 존재하면 서로 연결이 되는 거 같습니다.)

 

페어링이 됐는지 여부 확인은 블루투스 모듈의 LED를 확인하세요!

서로의 LED가 깜빡거리지 않는다면 페어링이 된 상태입니다.

 

<두 블루투스의 LED가 깜빡거리지 않는다면 페어링이 된 상태이다>

 

 

 

 

 

COM212에 해당하는 아두이노에서 Hi~ bluetooth!를 입력 후 전송하면 COM211에 해당하는 아두이노에 전달됩니다.

<Hi~ bluetooth!를 입력>

 

 

 

 

<반대쪽 아두이노 시리얼 모니터에 출력>

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

블루투스 모듈(HC-06), 아두이노, 오렌지보드

조강다 2017-12-07 10:34:52

안녕하세요 이와 관련해서 블루투스간어 센서값도 송수신이 가능하게하고 싶습니다.

보드(Uno)에서는 MPU 6050을 통해서 자이로센서값을 시리얼 모니터 상으로 출력 및 확인이 가능하며,

이 값이 2개 입니다. gx, gy. 그렇기 때문에 다른쪽 보드인 (leonardo)에서 이 값을 받아들여 출력 및 확인이 가능했으면 싶은데.


1번 질문. 행렬으로 통신이 가능한게 맞나요?? 혹시 다른 방법이 존재하는 것인가요??

2번 질문.

마스터 쪽(Uno) 코드를
int kal[2] = {kalAngleX, kalAngleY};

BTSerial.write(kal[0]);
BTSerial.write(kal[1]);

로 두고 업로드를 하면 시리얼 모니터 상에서 kal[0], kal[1] 이 확인이 가능합니다.

슬레이브(Leonardo) 쪽 코드를
int a[2] = {0,0};

a[0] = Serial1.read();
a[1] = Serial1.read();
Serial.Write(a[0]);
Serial.Write(a[1]);

이렇게 확인을 했는데. Leonardo에서는 a[0], a[1] 값을 받아들이지 못하는 것 같습니다.

혹시 슬레이브 쪽 코드가 잘못 된것인가요??

빡구 2018-04-08 21:34:07

안녕하세요 페어링까지는 성공적으로 했는데 연결을 끊는거는 못하는건가요? 업로드안하고 아두이노를 껏다 새로켜도 자동적으로 페어링이 되네요.. 혹시 끊는방법이 따로 있나요?

magooon 2018-10-09 22:48:41

안녕하세요. 덕분에 블루투스 실습을 쉽게 했네요 :) 한가지 여줘보고 싶은게 있는데요.. 시리얼 모니터에 글을 적보 보내면 띄어 쓰기나 줄바꿈이 되지 않습니다.. 자동 스크롤, 새줄 등 다양한 옵션을 선택해보아도 띄어쓰지/줄바꿈이 안됩니다. 혹시 어떤 문제인지 아시는지 여줘봅니다. 감사합니다.

kocoafab 2019-01-29 17:14:46

@조강다
시리얼 통신 경우 한번에 1byte씩만 데이터를 전달합니다. 그렇기 때문에 여러 문자데이터를 전달시 데이터를 모두 전달 후에 수신하는 쪽에서 데이터를 분리하는 작업을 해주셔야 합니다.

@ 빡구
HC-06에서는 따로 연결을 끊는 명령어가 없기 때문에 AT Command로 PIN 번호를 바꿔주거나 통신속도를 서로 다르게 해야 연결이 끊깁니다.

@ Magoon
시리얼 모니터에서 데이터를 한줄 내릴려면 Serial.println이라는 명령이 들어가야합니다. 그렇기 떄문에 데이터가 전달될 때 데이터의 끝이 어딘지 알아야 그 데이터가 들어오고 나서 println 명령어를 사용할 수 있습니다.
데이터를 전달시 끝문자를 정해서 보내시고, 수신하시는 쪽에서 끝문자가 들어왔을 때에 println 명령어가 출력되게 해보세요.

현미니 2019-02-15 10:49:39

블루투스의 통신 범위는 어디까지 되나요?

복뎅맘 2019-02-23 16:21:11

안녕하십니까? 블루투스와 BLE보드로 제공해 주신 코드를 다운로드 하였습니다. 물론 BLE 보드 이므로
SoftwareSerial mySerial(4, 5); 로 수정을 한 후 다운로드 하였습니다.
시리얼 통신으로 AT 명령어 입력 응답 없음.
AT+VERSION 명령어 입력 응답 없음.
AT+ROLE=M 명령어 입력 응답 없음.
하지만 구글 APK로 제공해 주신 앱을 휴대폰에 설치 후 F라고 SEND를 하면 시리얼 통신 상에 F라고 표시. 핸드폰에서 통신을 하면 문제가 없는데 시리얼에서 명령을 치면 동작을 하지 않습니다.
오렌지 보드 BLE를 마스터로 변경을 해야합니다만. 어떻게 가능한지 확인 부탁 드립니다.

kocoafab 2019-03-13 17:35:51

@복뎅맘
오렌지 BLE보드는 AT명령어가 다릅니다. 추가로 오렌지 BLE보드는 prepheral 모드만 지원하기 때문에 마스터 / 슬레이브 설정이 되지 않습니다.

자세한 내용은 제품 - BLE 보드탭에서 확인해주세요.