Wii 리모컨을 ESP32로 인식해 본다(BTstack)

소개



ESP32에는 Bluetooth 기능이 내장되어 있지만 이번에 Bluetooth Classic을 사용하여 Wii 리모컨을 ESP32로 인식해 보겠습니다. Bluetooth 스택으로 BTstack 을 사용합니다.



Wii 리모컨의 프로토콜 분석에 대한 자세한 내용은 Wiimote을 참조하십시오.

개발 환경 준비



ESP32의 개발 환경을 Windows10(64bit)의 Ubuntu에 준비합니다.
⇒ ESP32에서 Hello world! - Ubuntu (Windows Subsystem for Linux)

블루투스 스택(BTstack) 준비


cd ~/
git clone https://github.com/bluekitchen/btstack.git
cd ~/btstack/port/esp32
./integrate_btstack.py

Wii 리모컨 인식



MAC 주소 확인



Android 스마트폰의 앱 등에서 Wii 리모컨의 Bluetooth MAC 주소를 확인합니다.
예를 들어, BT 찾기 주소 표시 + 페어링 for Bluetooth 앱 을 기동해, Wii 리모컨의 A 버튼과 B 버튼을 동시에 눌러, 앱으로 검색하면 「Nintendo RVL-CNT-01」등이라고 표시됩니다.



【추기】 스마트폰이 없는 경우, BTstack에 포함되어 있는 example/gap_inquiry에서도 확인할 수 있습니다.
⇒BTstack example을 사용하여 ESP32에서 Wii 리모컨의 Bluetooth 장치 주소를 얻습니다.

샘플 소스 코드 편집



hid_host_demo라는 샘플을 사용합니다. vi 편집기 등에서 hid_host_demo.c를 다음과 같이 편집합니다.
cd ~/btstack/port/esp32/example/hid_host_demo/main
vi hid_host_demo.c

remote_addr_string의 정의를 스마트폰 앱 등에서 확인한 Wii 리모컨의 MAC 주소로 다시 씁니다.
// MBP 2016
static const char * remote_addr_string = "00-1?-??-??-?2-52";
// iMpulse static const char * remote_addr_string = "64:6E:6C:C1:AA:B5";

packet_handler() 함수에 있는 switch문의 L2CAP_DATA_PACKET에서 항상 수신한 패킷을 덤프 출력하도록 행을 추가합니다.
            break;
        case L2CAP_DATA_PACKET:
            // for now, just dump incoming data
            printf_hexdump(packet, size); // この行を追加

빌드



직렬 포트 설정



menuconfig라는 프로젝트 설정 도구를 시작하고 직렬 포트를 구성합니다.
cd ~/btstack/port/esp32/example/hid_host_demo
make menuconfig



[Serial flasher config] → [Default serial port]에서 ESP32에 연결된 직렬 포트를 설정합니다(예:/dev/ttyS14). 통신 속도나 옵션 지정도 그림과 같이 맞추어 주십시오.
설정 후 로 저장하고 로 종료합니다.

빌드 및 쓰기



다음 명령을 사용하여 빌드 및 쓰기를 수행합니다.
make flash

모니터



다음 명령으로 ESP32와 모니터를 연결합니다.
make monitor

Wii 리모컨 연결



Wii 리모컨의 A 버튼과 B 버튼을 동시에 눌러 하단의 4개의 청색 LED를 점멸 상태로 합니다. 그리고, ESP32를 모니터 접속한 채로, 리셋 버튼 등으로 재기동하면 「HID Connection established」라고 표시되어 접속 상태가 됩니다.
Wii 리모컨의 버튼을 누르거나 놓으면 L2CAP_DATA_PACKET이 발생하여 덤프 출력됩니다. 이제 누른 버튼을 인식할 수 있었습니다.
[00:00:03.231] LOG -- l2cap.c.905: L2CAP_EVENT_CHANNEL_OPENED status 0x0
 addr 00:1?:??:??:?2:52 handle 0x80 psm 0x13 local_cid 0x42 remote_cid 0x53
 local_mtu 48, remote_mtu 185, flush_timeout 0
HID Connection established
A1 30 00 00
A1 30 00 10
A1 30 00 00
A1 30 10 00
A1 30 00 00

결론



Wii 리모컨은 하드 오프 정크 코너에서 이용 가능합니다 (324 엔 정도).
저렴한 Bluetooth 장치인 Wii 리모컨을 ESP32로 인식해 볼 수 있었습니다.

좋은 웹페이지 즐겨찾기