https://cdn.sparkfun.com/datasheets/Wireless/Bluetooth/RN-HID-User-Guide-v1.0r.pdf

RN-42 HID 사용법은 위 메뉴얼에 나와있는 것을 참고했습니다. 다만 제 펌웨어와 메뉴얼이 조금 달랐고, 메뉴얼에 제대로 설명이 안되어있는 것도 있어 삽질을 좀 했습니다.

 

일단 HID 기능을 실행하려면 아래 명령어를 실행하면 됩니다.

 

S~,6

R,1

 

S~,6이 HID로 바꾸는 명령어, R,1이 재부팅해서 설정을 적용하는 명령어입니다.

 

RN-42에서 호스트(컴퓨터)에 데이터를 보내는 것을 리포트(report)라고 하는데, 리포트를 보내는데는 여러가지 모드(mode)가 있다. 키보드 같은 경우에는 크게 3가지가 있다.

 

1. RAW 모드

가장 기본적인 모드이다. 위의 두 모드는 사실 모듈에 입력받으면 이 RAW모드로 번역한 뒤 컴퓨터에 리포트 하는 것이다. 먼저 모듈에 UART 통신을 이용해 0xFD를 보낸다. 그러면 RAW모드가 시작된다. 그 뒤에 보내고 싶은 데이터를 차례로 보내면 된다.

 

0xFD // RAW 모드 시작

0x09 // 길이 정의 (이 경우 앞으로 9byte의 정보를 더 보내겠다는 뜻이다.)

0x01 // 1번은 키보드 데이터를 보내겠다는 뜻. 

0x00 // modifier - 알트키나, 쉬프트키의 정보는 여기로 보내진다. 00 같은 경우에는 아무것도 눌러져있지 않다는 뜻

0x00 // 그냥 잉여?? 메뉴얼에도 이 바이트의 기능이 설명되어있지 않아서 잘 모름....

 

0x04 // 04는 a 키를 뜻함

0x05 // 05는 b 키를 뜻함

0x28 // 28은 엔터 키를 뜻함

0x00 // 00은 아무 키도 전달 안함

0x00 // 00은 아무 키도 전달 안함

0x00 // 00은 아무 키도 전달 안함

 

FD 09 01 00 00 04 05 28 00 00 00

 

위를 해석해보면, a키, b키, 엔터키가 눌렀다고 호스트에게 데이터를 전송한다는 뜻이다.

만약 위 상황에서 b키를 떼었다고 전송하고 싶다면 어떻게 전송하면 될까?

 

0xFD // RAW 모드 시작

0x09 // 길이 정의 (이 경우 앞으로 9byte의 정보를 더 보내겠다는 뜻이다.)

0x01 // 1번은 키보드 데이터를 보내겠다는 뜻. 

0x00 // modifier - 알트키나, 쉬프트키의 정보는 여기로 보내진다. 00 같은 경우에는 아무것도 눌러져있지 않다는 뜻

0x00 // 그냥 잉여?? 메뉴얼에도 이 바이트의 기능이 설명되어있지 않아서 잘 모름....

 

0x04 // 04는 a 키를 뜻함

0x00 // 00은 아무 키도 전달 안함

0x28 // 28은 엔터 키를 뜻함

0x00 // 00은 아무 키도 전달 안함

0x00 // 00은 아무 키도 전달 안함

0x00 // 00은 아무 키도 전달 안함

 

FD 09 01 00 00 04 00 28 00 00 00

 

보다시피, 원래 0x05이 0x00으로 바뀌었다. 

그러면 0x05가 떼어졌다는 것을 뜻한다.

 

중요한건 정의한 길이에 맞추어 전달하는 것이다. 특히 0x00은 호스트와 접속을 끊는 명령어다. 만약 길이보다 초과해서 0을 보내게 된다면 호스트와 접속이 끊어지는 것이다. 위 예시 같은 경우 길이를 9로 정의했는데, 만약 이를 넘어서서 10개의 바이트를 보내면 전혀 예측하지 못한 상황이 벌어질 수 있다.

 

근데 메뉴얼하고 다른게, 메뉴얼에는 0xE0에서 0xE7까지가 쉬프트,알트,컨트롤,GUI(윈도우키)로 할당이 되어있다. 그런데 RAW모드에서 ScanCode로 보내도 아무 반응이 없었다. 그러니까 modifier 바이트로만 쉬프트,알트,컨트롤키의 정보를 넘기는게 가능하다는 것이다. 엔터키나 백스페이스 등은 가능한데, 왜 이것만 안되는지는 잘 모르겠다. 그런데 납득할만도 한게, modifier byte 놔두고 ScanCode byte로 보내면 데이터가 낭비된다. 그래서 막은것일수도 있다. 근데 왜 메뉴얼에는 할당이 되어있는건지 ;;

 

2. Translation 모드

제일 간단한 모드다. 입력된 ASCII 문자를 그대로 RAW 모드로 알아서 번역해서 보내주는 모드이다. 

모든 ASCII문자를 보내는 것은 아니고, 0x10에서 0x7E 사이의 ASCII 문자를 그대로 알아서 번역해서 보내준다.

 

3. Shorthand 모드

RAW모드의 길이를 줄인 것이다. 물론 이것도 RAW 모드로 번역해서 보내주는거라 실질적으로 보내는 데이터의 크기는 똑같다. 근데 이게 메뉴얼하고 내 RN-42 펌웨어랑 조금 다르게 동작해서 그냥 안씀.

 

 

 

SoftwareSerial 함수의 한계점 때문에, 아두이노에서 사용할때 문제가 발생한다. RN-42의 기본 보드레이트는 115200bps이다. 근데 이게 너무 빨라서, 아두이노에서 RN-42로 데이터를 송신할 때는 문제가 없는데, 수신을 받을 때 제대로 받지 못하는 모습을 보인다. 따라서 만약 RN-42에서 수신을 받을일이 있다면 9600bps등으로 보드레이트를 변경해야 한다. 나같은 경우에는 평소에는 115200을 사용하다, 수신을 받을일이 있다면 임시로 9600bps로 바꿔서 수신한다.