13
7

More than 5 years have passed since last update.

WiiリモコンをESP32で認識してみる(BTstack)

Last updated at Posted at 2019-06-20

はじめに

ESP32には、Bluetooth機能が内蔵されていますが、今回、そのBluetooth Classicを使って、WiiリモコンをESP32で認識してみます。Bluetoothスタックとして、BTstackを使用します。

remote_img2.jpg

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」などと表示されます。

無題.png

【追記】スマホがない場合、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

無題.png

[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で認識してみることができました。

13
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
7