3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Digisparkの良さを味わう(ESP32とI2C通信してWiiリモコンを無線マウス化する)

Last updated at Posted at 2019-12-12

はじめに

タイトルは長いですが、要するに以下のようにWiiリモコンをマウスにしちゃったというお話です。

作ったもの.png

PCのBluetoothアプリを使用してWiiリモコンでマウス操作するものはあるようですが、ちょっと好きにはなれません。
・理由1:PCでアプリを走らせるための仕組みが面倒(起動スクリプトや手動起動)
・理由2:別のPCで使う場合、Bluetoothのペアリングが必要で面倒

そこで、以下のDigispark的三段論法?に至ったというわけです。

DigisparkはUSBマウスのように接続してすぐに使える
 ↓
ESP32はWiiリモコンとBluetoothで通信できる
 ↓
DigisparkとESP32がタッグ(I2C)を組めば強い
  
Digispark(とESP32)、すばらしい:clap_tone1:

使用したもの

結線

以下の通りに繋げました。
 

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のみの点灯に変わる(下図参照)
remocon_nontoumei.png

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の説明資料

wiimote_mouse_demo.c(210行目辺り)
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の仕様に従って変えてやれば、いろいろ面白いことができるというわけです(ΦωΦ)フフフ…

参考記事

更新履歴

  • 2019-12-12:新規作成
3
1
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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?