[아두이노] [강좌] 42. 블루투스 통신 (1) - RN42 블루투스 모듈 실습하기
강좌, 오랜만!!
이번 강좌에서는 블루투스를 다뤄보도록 하자. 블루투스란 무엇인가,에 대한 내용은 생략하겠어요. 그건 나보다 네이버님께서 더 자세히 알려줄거임.
블루투스 모듈의 종류 역시 여러가지가 있지만, 내가 가진 블루투스 모듈은 바로 "RN-42" 모듈이다.
RN-42 모듈에도 'Silver'니,N'Gold'니 여러 등급이 있는 것 같던데 차이점은 연결 거리가 긴가(10m), 짧은가(100m)의 차이라고 하대. 본인의 용도에 맞게 선택하면 될 것 같고.
RN-42 모듈 말고도 'HC-03/05/06' 모듈도 많이 사용하는데, 기본적인 방식은 둘 다 시리얼 통신 방식으로 동일하며, 다른 점은 커맨드의 종류 정도? 모듈 설정을 아무것도 안바꾸고 그냥 통신만 주고받을 용도로 사용한다면 RN-42 모듈이나 HC-0x 모듈이나 비슷하다.
아두이노와 블루투스 모듈, 그리고 블루투스를 이용해 아두이노와 통신할 기기가 통신하는 방식을 그림으로 나타내면 다음과 같다.
실제 통신 상대와 블루투스 무선 통신을 하는 것은 블루투스 모듈이고, 아두이노와 블루투스 모듈 간에는 시리얼 통신을 이용하여 데이터를 주고받는다. 시리얼 통신, 기억나지요?
내가 가진 보드는 메가(Mega 2560/ADK) 보드라서 시리얼 포트가 4개이므로, MultiSerialMega 예제를 이용할거다. 우노(Uno) 등의 보드에서는 시리얼 포트가 하나 뿐이므로, 보통 SoftwareSerial 라이브러리를 이용하거나 시리얼 핀을 교차 연결하여 사용한다.
SoftwareSerial 라이브러리를 사용하는 예제는 강좌 마지막의 '*참고'를 참조하도록 하고, 우선은 메가의 MultiSerialMega 예제를 이용하는 방법부터 살펴보자.
먼저 아두이노와 블루투스 모듈을 연결해야겠지. 아래 그림과 같이 연결한다.
유의해야 할 점은, 모듈에 적힌 RX는 블루투스 모듈의 RX(Receive) 핀이므로 아두이노 보드의 TX에 연결해야 하고, 블루투스 모듈의 TX는 아두이노의 RX에 연결해야 한다.
RX, TX, VCC, GND 외에도 RTS, CTS 핀이 있는데, 이 핀들은 시리얼 통신의 하드웨어 흐름 제어를 사용할 경우 쓰이는 핀들이다. 아두이노에서는 하드웨어 흐름 제어를 사용하는 일이 거의 없으므로(한 번도 안써봄), 두 핀은 사용되지 않는다.
연결한 후 스케치 툴의 "파일→예제→04.Communication→MultiSerialMega" 예제를 열어보자.
MultiSerialMega.ino |
void setup() { Serial.begin(115200); Serial1.begin(115200); } void loop() { if (Serial1.available()) { int inByte = Serial1.read(); Serial.write(inByte); } if (Serial.available()) { int inByte = Serial.read(); Serial1.write(inByte); } } |
(+추가 : 소스 설명을 빼먹었;;;
setup() 함수에서는 Serial과 Serial1 객체를 각각 초기화하고 있다. RN-42 모듈의 기본 통신 속도가 115200bps로 설정되어 있으므로 속도를 맞춰준다.
loop() 함수에서는 Serial1 포트로 수신된 데이터가 있다면 그 데이터를 Serial 포트로 송신하고, Serial 포트로 수신된 데이터가 있다면 Serial1 포트로 송신한다. 즉, RN-42 모듈로부터 수신된 데이터를 PC의 시리얼 모니터로 출력할 것이고, 시리얼 모니터의 입력 창을 통해 전송한 데이터를 RN-42 모듈로 다시 전송한다.
)
자, 업로드한 후 시리얼 모니터를 열어보자.
아무것도 안뜨는데?
당연하지. 블루투스는 혼자서만 동작하는 것이 아니다. 통신을 해야지. 그러려면 데이터를 주고 받을 상대가 있어야 한다.
그 전에, 커맨드 명령을 통해 블루투스 모듈의 설정을 확인하거나 변경하는 방법에 대해 알아보자.
RN-42 모듈과 HC-0x 모듈은 서로 명령어가 다르므로, 이 부분은 각자의 데이터 시트나 사용자 매뉴얼 등을 확인해서 알아야 한다. RN-42의 커맨드는 RN-42의 사용자 매뉴얼에 명시되어 있고, 설명도 잘 되어있다(근데 영어야). 사용자 매뉴얼 또는 데이터 시트는 구매처에서 제공하는 링크를 이용하면 됨.
그것도 귀찮은 사람은 아래 링크 이용.
>> RN-42 User Manual
https://www.sparkfun.com/datasheets/Wireless/Bluetooth/rn-bluetooth-um.pdf
RN-42 모듈에는 커맨드 모드(Command Mode)와 데이터 모드(Data Mode)가 있는데, 데이터 모드는 말 그대로 데이터를 주고 받는 모드이고, 커맨드 모드는 명령어를 주고 받는 모드이다. RN-42 모듈의 설정을 변경하거나 확인하기 위해서는 커맨드 모드를 이용해야 하며, 다음은 사용자 매뉴얼 중 커맨드 모드와 데이터 모드에 진입하는 방법에 대해 나타낸 부분.
요약하자면, 처음 전원이 연결됐을 때는 기본으로 데이터 모드이며 시리얼 통신을 통해 RN-42 모듈로 "$$$"를 보내면 커맨드 모드로 진입하고, 커맨드 모드에서 "---<cr>"을 보내면 데이터 모드로 진입한다는 말. 유의해야 할 점은 "$$$"에는 "<cr>"이 없고 "---"에는 "<cr>"이 붙는다는 점.
("<cr>"은 "Carriage Return(캐리지 리턴)"을 뜻하며,N'\n(New line)'과 같은 개행 문자로 '\r'이라 쓴다. 아스키 코드 '13'에 해당한다.)
다음은 사용자 매뉴얼 중 커맨드 모드에서 사용되는 명령어를 나타낸 부분의 일부이다.
이 중에서 몇 개만 골라 테스트해보도록 하자.
MultiSerialMega 예제가 업로드 된 상태에서 시리얼 모니터 창을 열자. 우노의 경우에는 이 강좌 하단의 "*참고"를 참조하여 "SoftwareSerial" 예제를 업로드 한 후 시리얼 모니터 실행.
시리얼 모니터의 입력 창에 "$$$"를 입력한 후 '전송' 버튼을 누르거나 엔터키. 단, 보드 레이트 설정 부분의 왼쪽에 개행 문자 설정에서 "No line ending"을 선택해야 한다. 문자열 마지막에 "NL(New Line)" 또는 "CR(Carriage Return)" 문자를 자동으로 붙일지 말지를 설정하는 부분으로, 만일 "No line ending(아무것도 안붙임)"외의 것을 선택하면 커맨드 모드로 진입하지 않는다. ("$$$" 명령 이후 1초간 아무 문자도 수신되지 않아야 함)
"$$$"를 입력한 후 전송하면 아래와 같이 "CMD"라는 응답이 오는 것을 확인할 수 있다. "CMD"라는 응답이 없을 경우 커맨드 모드로 진입한 것이 아니므로 주의.
그리고 다시 입력 창에 "D" 또는 "d"라고 입력한 후 전송해보자. 단, 이 때는 개행 문자 설정을 "캐리지 리턴" 또는 "Both NL or CR"로 설정해야 한다. "$$$" 외의 모든 커맨드에는 "<cr>" 문자가 붙어야 함.
위와 같은 화면이 보이는가? "D" 또는 "d" 명령어는 RN-42 모듈의 기본 설정을 보여주는 명령어이다. 'BTA'는 RN-42 모듈의 MAC 주소를 표시하는 부분으로, 기기 구분을 위해 사용되며 'BTName'은 다른 기기에서 블루투스 기기를 검색했을 때 MAC 주소와 함께 표시될 이름을 나타낸다.
'Baudrt'는 보드 레이트(Baud Rate)를,N'Mode'는 현재 모드(마스터, 슬레이브 등)를 나타내고,N'PinCod'가 다른 기기에서 연결할 경우 페어링에 사용될 핀 코드를 나타내는 부분이다.
모듈마다 MAC 주소가 모두 다르며 사용자가 변경할 수 없다. 이 외의 'BTName'과 'PinCode',N'Mode' 등은 사용자가 변경하여 사용할 수 있다.
'BTName'을 변경해볼까?
이름을 변경하는 명령어는 "SN,<name>" 또는 "sn,<name>"으로,N'<name>' 부분에 원하는 문자열을 넣으면 된다. 예를 들어 "sn,MyBT" 등.
시리얼 모니터의 입력 창에 "sn,MyBT"를 입력한 후 전송해보자. 'MyBT' 대신에 원하는 아무 이름이나 입력해도 좋다. 단, 한글은 지원되지 않는다.
입력 후 RN-42로부터 "AOK"라는 응답이 오면 정상적으로 변경된 것. 다시 "D" 또는 "d" 명령으로 설정을 확인해보자.
변경된 것이 보이는가? 이제 스마트 폰이나 노트북 등에서 주변 블루투스 기기를 검색하면 "MyBT"라는 기기가 검색될 것이다.
이제 커맨드 모드를 종료하고 데이터 모드로 진입해보자. "---"를 입력 후 전송.
"END"라는 응답이 수신되면 정상적으로 커맨드 모드가 종료되고 데이터 모드로 진입한 것이다.
이런 방식으로 RN-42의 설정을 변경하거나 확인할 수 있으며, 명령어를 이용해서 다른 기기를 검색하고 연결을 요청할 수도 있다. 명령어를 이용해 다른 기기로 연결하는 방법에 대해서는 다다음 강좌에서 설명하도록 하고, 다음 강좌에서는 스마트 폰과 RN-42 모듈을 이용해 아두이노와 스마트 폰을 연결하여 사용하는 방법에 대해 알아보자.
오늘은 여기서 이만. 안녕!!
(+추가
RN-42 모듈에는 LED가 두 개 붙어있는데, 하나는 'Stat' LED, 다른 하나는 'Connect' LED이다. 'Connect' LED는 말 그대로 연결 중인지를 나타내는 LED로, 다른 기기와 연결이 되면 On 상태가 되고, 연결이 끊기면 Off 된다. 'Stat' LED는 총 3가지 모드를 표시하는데, 다음과 같다.
다른 건 잘 모르겠고, 이 것만 기억하면 된다. 커맨드 모드에서는 LED가 빠르게, 데이터 모드에서는 LED가 느리게 깜빡인닷!
혹시 커맨드 모드에서 명령어를 전송했는데 응답이 없다면, LED 상태를 확인해서 현재 모드가 커맨드 모드가 맞는지 확인할 것.
또 하나, 다른 기기에서 연결 요청을 했는데 계속 실패할 경우,N'Connect' LED 상태를 확인하여 RN-42 모듈이 다른 기기와 연결된 상태가 아닌지 확인할 것.