はじめに
タイトルは長いですが、要するに以下のようにWiiリモコンをマウスにしちゃったというお話です。
PCのBluetoothアプリを使用してWiiリモコンでマウス操作するものはあるようですが、ちょっと好きにはなれません。
・理由1:PCでアプリを走らせるための仕組みが面倒(起動スクリプトや手動起動)
・理由2:別のPCで使う場合、Bluetoothのペアリングが必要で面倒
そこで、以下のDigispark的三段論法?に至ったというわけです。
DigisparkはUSBマウスのように接続してすぐに使える
↓
ESP32はWiiリモコンとBluetoothで通信できる
↓
DigisparkとESP32がタッグ(I2C)を組めば強い
Digispark(とESP32)、すばらしい
使用したもの
- ESPr® Developer 32 ※本記事で「ESP32」と呼称
- ESP-IDF (xtensa-esp32-elf at the 1.22.0-80) → Ubuntu18.04上に環境を構築
- Digispark
- Arduino IDE (バージョン1.8.5)
- USBコネクタ(マイクロB)
- Wiiリモコン
結線
以下の通りに繋げました。
USBコネクタ | ESP32 | Digispark | 備考 |
---|---|---|---|
+5V | VIN | 5V | |
GND | GND | GND | |
D+ | NC | D+ | |
D- | NC | D- | |
NC | IO25 | P0(SDA) | ESP32のソフトウェアでプルアップ |
NC | IO26 | P2(SCL) | ESP32のソフトウェアでプルアップ |
※NC:未接続 |
作成手順1:Digisparkのソフトウェアを書き込む
1. Arduino IDEに以下のライブラリを追加する
※: zipファイルを解凍して、その中の「TinyWireS」をArduinoIDEで「スケッチ-> Include Library -> Add ZIP Library...を選択」と選択する
2. Arduinoのスケッチ(githubに置きました)を取得する
3. ArduinoIDEでDigisparkにスケッチを書き込む
作成手順2:WiiリモコンのMACアドレスを取得する
「BTさがしてアドレス表示 + ペアリング for Bluetooth」というAndroidアプリを使ってMACアドレスを取得します。
WiiリモコンのAボタンとBボタンを同時に押し、アプリで検索するだけで取得できます。
jp-96さんの記事を参考にさせていただきました。
作成手順3:ESP32にソフトウェアを書き込む
1. btstackをクローンする
$ git clone https://github.com/bluekitchen/btstack.git
2.btstackのexampleフォルダにコード(githubに置きました)をwiimote_i2c_converter.cとして配置します。
※wiimote_addr_string = "AA-AA-AA-AA-AA-AA" の値は、1つ前の手順で取得したWiiリモコンのMACアドレスに変更してください。
3.ESP32にソフトウェアを書き込む
$ cd port/esp32
$ ./integrate_btstack.py
$ cd example/wiimote_i2c_converter
$ make menuconfig
$ make
$ make flash
※make menuconfigで設定画面が出るので、「Serial flasher config」->「Default serial port」からUSBのシリアルポートを設定する(ttyUSB0とか)
※シリアルポートは「$ ls -l /dev/serial/by-id/」で確認した
使用方法
1. USBケーブルでPCとUSBコネクタ(micro B)を接続する
2. Wiiリモコンの①ボタンと②ボタンを同時に押す(1.の実行後にすぐに行う)
3. WiiリモコンがESP32と接続するとWiiリモコンの右端のLEDのみの点灯に変わる(下図参照)
4. Digisparkが使用可能となると、DigisparkのLEDが消灯→点灯に変わる(恐らく3.の間に点灯していますが・・・)
雑感
Bluetoothの後にI2Cを介しているので(データのハンドリング処理で)操作の応答性が心配でしたが、思ったよりも良さそうです。
ただし、斜めのカーソル移動がしづらいので、その辺りを含めてマウス操作の改善の余地はありそうです。(Digisparkのスケッチの改良)
また、WiiリモコンのLEDや振動機能を使うことができるので、その辺りのアレンジをしてみると面白そうです。(詳細は後述する「おまけ」をご覧ください)
それでは、見ていただいてありがとうございました。
тнайк чoμ_〆(・ω・。)
おまけ
WiiリモコンのLED操作について
WiiリモコンとESP32のBluetooth接続時に4番目のLEDを光らせています。実はここの動作には「Feedback Features」というWiiリモコン動作の仕組み(仕様?)を利用しています。
そして、「Feedback Features」には以下のようなものがあるので、例えば「Bluetooth接続時に振動させる」といったことが容易に行えます。(以下のRummbleを使用する)
・Player LEDs
・Rumble(振動機能)
・Speaker
今回、Bluetooth接続時に実際にLEDを光らせているコードは以下の部分です。接続時に「nitifyConnect 」をtrueにします。そして、起動時のL2CAP_EVENT_CAN_SEND_NOW(キー操作時にも実行する)でLED4を点灯させるデータ(0xA2, 0x11, 0x80)をWiiリモコンに送ります。
参考:Player_LEDsの説明資料
case L2CAP_EVENT_CAN_SEND_NOW:
if(channel == l2cap_wiimote_interrupt_cid){
if(nitifyConnect) {
nitifyConnect = false;
wiimote_data |= WIIMOTE_FEEDBACK_EVENT_LED4; //detect connection
}
uint8_t report[] = { 0xA2, 0x11, wiimote_data };
printf("L2CAP_EVENT_CAN_SEND_NOW: 0x%02x\n", wiimote_data);
l2cap_send(l2cap_wiimote_interrupt_cid, (uint8_t*) report, sizeof(report));
}
break;
例えばこのwiimote_dataをFeedback Featuresの仕様に従って変えてやれば、いろいろ面白いことができるというわけです(ΦωΦ)フフフ…
参考記事
- Digispark(ATTiny85) をI2CのSlaveで使用(TinyWireS)して、RaspberryPi(Master)と通信してみる
- https://qiita.com/mt08/items/46d73c4e1957c1eb55f5
- ESP32にWiiリモコンを接続して十字キーでLチカする
- https://qiita.com/jp-96/items/ff3822ab81f7696172c0
- BTstack Manual(ESP32の箇所)
- http://bluekitchen-gmbh.com/btstack/ports/existing_ports/#sec:esp32Port
更新履歴
- 2019-12-12:新規作成