はじめに
ESP32には、Bluetooth機能が内蔵されていますが、今回、そのBluetooth Classicを使って、WiiリモコンをESP32で認識してみます。Bluetoothスタックとして、BTstackを使用します。
Wiiリモコンのプロトコル解析については、Wiimoteを参照してください。
開発環境の準備
ESP32の開発環境をWindows10(64bit)のUbuntu上に準備します。
⇒ ESP32 で Hello world! - Ubuntu (Windows Subsystem for Linux)
Bluetoothスタック(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)。通信速度やオプション指定も図のように合わせてください。
設定後、< Save >で保存し、< Exit >で終了します。
ビルドと書き込み
次のコマンドで、ビルドと書き込みを行います。
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で認識してみることができました。