아두이노 우노 블루투스 at 무응답 - adu-ino uno beullutuseu at mueungdab

아두이노에서 블루투스의 사용은 필수 아닌 필수가 되는 것 같다.

그중에서 가장 많이들 사용하는 아두이노 블루투스인 HC-06 블루투스 3.0버전을 사용한다.

일단 통신 프로그램에서 최근에 나온 블루투스 4.0의(HM-10과 같은) LE방식의 코딩이 아닌 시리얼 방식의 코딩으로 가능하기 때문에 기본 예제로 쉽게 제어 할 수 있기 때문이다.

아두이노 우노 블루투스 at 무응답 - adu-ino uno beullutuseu at mueungdab

연결 방식은 

VCC는 5v 혹은 3.3v

GND는 GND

TXD는 디지털 2번핀

RXD는 디지털 3번핀

에 연결해주면 된다.

#include <softwareserial.h>

const int nPin_BTTx = 2; //전송

const int nPin_BTRx = 3; //수신



SoftwareSerial BTSerial(nPin_BTTx, nPin_BTRx); // RX, TX



void setup() {

  Serial.begin(9600);

  BTSerial.begin(9600);

  Serial.println("START");    

}

void loop() {

   if (BTSerial.available())

    Serial.write(BTSerial.read());

  if (Serial.available())

    BTSerial.write(Serial.read());

}

RX와 TX는 RX->TX, TX->RX로 연결해줘야 하는데 핀은 그대로 연결하고, SoftwareSerial 을 선언할 때 순서를 바꿔서 사용하면 연결하는 핀과 소스가 헷갈릴 일은 없다.

이렇게 하고 연결테스트는 AT 명령어로 할 수 있다.

그런데 HC-06은 AT명령어는 아무리 해도 안될 때가 있다.

그래서 혹시나 연결이 잘못 됐나? 싶어서 폰으로 블루투스앱 SPP를 이용해서 데이터를 전송해보면 또 통신은 잘한다. ㅡ.ㅡ

이렇게 해보다가 블루투스의 전원을 뺏다가 다시 꽂으면 그때서야 명령어를 먹는다.

안 될때는 연결부터해서 데이터값 테스트를 해보면 될듯 하다. 여튼 희안하다.

그리고 하드웨어의 버전에 따라서 AT 명령어가 바꼈다. 헐~

하드웨어 버전이 뭔지 어떻게 안담!!!

먼저 AT를 쳐서 OK가 뜨지 않을 땐 


줄을 입력하는 방식을 바꿔야 한다.

보통은 line ending 없음으로 선택되어 있으나, 안되면 Both NL & CR로 변경을 해야 한다.

이러한 이유는 역시나 펌웨어의 버전 차이 때문인거 같다.

실제로 AT 명령어를 실행 했을 때 OK 가 뜨고 난 뒤, AT+VERSION으로 명령어를 날리니 3.0버전이라고 나온다.

그러면 기존에 있는 AT 명령어는 다 바뀐단 소리다.

Version : 1.8 의 AT 명령어

AT+NAME -> AT+NAMEMYMOS1 -> "MYMOS1"로 블루투스 이름 변경

AT+PIN    -> AT+PIN1234   -> 1234 로 블루투스 비밀번호 변경 (최대 4자리 숫자까지 가능)

AT+ROLE  -> AT+ROLE=M   -> 블루투스 모듈을 마스터로 변경. 슬레이브는 S

Version : 3.0 의 AT 명령어

AT+NAME -> AT+NAME=MYMOS1 -> "MYMOS1"로 블루투스 이름 변경

AT+PIN    -> AT+PSWD=1234   -> 1234 로 블루투스 비밀번호 변경 (최대 4자리 숫자까지 가능)

AT+ROLE  -> AT+ROLE=1   -> 블루투스 모듈을 마스터로 변경. 슬레이브는 0

아두이노 블루투스 연결은 쉬운듯 어려운듯 하다.

AT명령어만 잘 된다면야 쉽게 쉽게 가는건데 막상 안 먹을 때는 멘붕!

하지만 실제로 통신을 하는건 잘 될 수도 있으므로 어플로 연결이 잘되는지 부터 체크를 하면 될 듯 하다.

RS's Travel & Electronic

시퀀스와 아두이노

HC-06 : 연결안됨과 AT명령어일람

RS 2021. 7. 17. 21:59

시제품 제작일을 하면서 가장 많이 사용한 모듈이 블루투스 모듈 HC-06입니다.

아두이노 우노 블루투스 at 무응답 - adu-ino uno beullutuseu at mueungdab

이번 포스팅부터 HC-06을 제가 사용하면서 알게 된 몇몇 노하우들을 게시하고자 합니다.

제원이나 연결법등의 이야기는 생략하겠습니다.

그런 내용은 다른 분들 블로그에 많이 있거든요.

생략한다고는 했지만 그래도 일단 짚어야 될게 두 가지 있는데, 

이번 포스팅에서 이야기하고자 합니다.

먼저 아두이노에 연결해서 AT 테스트를 해도 반응이 없을 때입니다.

보통 이걸 사용할 때 SoftwareSerial 객체를 만들어서 사용하실 텐데,

객체 생성자 SoftwareSerial (TX , RX) 인자를 전달할 때

첫 번째 인자 TX는 HC-06의 TX핀과 연결된 아두이노의 핀 번호입니다.

두 번째 인자 RX는 HC-06의 RX핀과 연결된 아두이노의 핀 번호입니다.

시리얼 통신은 TX-RX, RX-TX로 연결해야 된다라는 상식은 그냥 잊고, 위에서 말한 대로만 연결했다면 일단 선 연결이 잘못돼서 안 되는 건 절대 아닙니다.

거꾸로 되어 있으면 생성자 인자를 거꾸로 바꾸세요. 핀을 바꾸는 것보다 간단하죠.

메가같이 시리얼 포트가 여러 개 준비돼 있는 보드를 쓰실 땐 핀을 잘못 연결할 일은 없겠죠?

두 번째로 시리얼 창을 확인하셔야 됩니다.

보통은 9600 보드 레이트는 건드리지 않으셨을 테고요.. 그 옆에다 문제인데,

HC-06의 펌웨어 버전이 2.0 이하라면 line ending 없음으로 해야 시리얼 창에 응답이 뜹니다.

HC-06의 펌웨어 버전이 3.0이라면 Both NL & CR로 해야 시리얼 창에 응답이 뜹니다.

버전을 알 수 없는 경우는 일단 선 연결이 제대로 됐는지 체크하고 

시리얼 창의 조건을 두 가지 다 시험해 보세요.

둘 중의 하나는 반응이 올 겁니다.

둘 다 해봤는데 안된다고요?

일단 전원 제거하고 아두이노 IDE를 끈 다음에, IDE를 다시 실행하고 아두이노에 전원을 넣고 시리얼 창을 띄워서 다시 확인해보세요.

그래도 안된다면 불량일 확률이 높습니다.

과감히 쓰레기통에 집어던지세요. 여러분의 시간은 돈 4~6천원보다 소중합니다.

다음은 AT명령어입니다.

펌웨어 2.0 이전과 3.0에서의 AT명령어는 다른 부분이 있습니다.

펌웨어 2.0이전 펌웨어 3.0
AT : 응답 체크
Send : AT
Receive : OK
 
AT+BUAD : 보드레이팅을 바꿉니다.
Send : AT+BUAD4
Receive : OK9600
 
11200
22400
34800
49600
519200
638400
757600
8115200
 
AT+VERSION : 버전을 체크합니다.
Send : AT+VERSION
Receive : OKlinvorV1.8
 
AT+NAME : 블루투스 이름을 바꿉니다.
Send : AT+NAMEhc06
Receive :OKsetname
 
AT+PIN : Pin번호를 바꿉니다.
Send : AT+PIN1234
Receive : OKsetPIN
 
AT+ROLE : 모드를 바꿉니다.
Send : AT+ROLE=S (or AT+ROLE=M)
Receive : OK+ROLE:S (or OK+ROLE:M)
AT : 응답 체크
Send : AT
Receive : OK
 
AT+UART : 보드레이팅을 바꿉니다.
Send : AT+BUAD=9600,0,0
Receive : OK
 
9600 can be replaced by
9600
1200
2400
4800
9600
19200
38400
57600
115200
 
AT+NAME : 블루투스 이름을 바꿉니다.
Send : AT+NAME:hc06
Receive : OK
 
AT+PSWD : Pin번호를 바꿉니다.
Send : AT+PSWD:“1111”
Receive : OK
 
AT+ORGL : 공장초기화를 실행합니다.
   생산되어서 출하됬을때 당시의 상태로 되돌리는겁니다.
Send : AT+ORGL
Receive :OK
 
AT+ROLE : 모드를 바꿉니다.
Send : AT+ROLE=0 (or AT+ROLE=1)
Receive : Unknown
0(Slave), 1(Master)