##すごいぜ任天堂
ムービーを見た瞬間、やっぱり打ちのめされた。
NINTENDO LABO
さすが任天堂。
だけど4月20日までとてもまちきれないので、自分で作ってみた。
##どうやって動いているのか
ムービーを見ると、switchのリモコン側に組込まれたIRカメラとダンボールに貼り付けた反射材を使っているらしい。同様のIRカメラはWiiにも搭載されていて、世界中でハックされている。有名なのがジョニー・リー氏。必見!
WiiリモコンはBluetoothとしてPCから認識できるので、こちらを使う方法もあるが、今回はDFRobotで入手できる同等のカメラモジュールを使用します。
##部品その1:IRポジションカメラ
IR Positioning Camera For Arduino
こちらは1m〜3m先に光っている赤外線LEDのXY位置を取得できるカメラで、最大4点の位置が抽出できる。インターフェースはI2Cなので大抵のものに接続できる。ただしアドレスは固定なので複数のカメラを接続出来ないのが残念。
##部品その2:反射シール(失敗)
当初、本家と同じようにカメラ側から赤外線LEDを何灯か点灯して、ダンボールに反射材シールを貼って動きを検出しようとしました。ところがホームセンターで販売しているものが反射率が良くなく、検出がかなり不安定でした。恐らくモーションキャプチャのターゲットに使うような、銀色の反射材が手に入ればうまくいくと思います。
結局、今回はボタン電池と赤外線LEDを動かす対象に固定して、動きを検出する方式に変更しました。
##部品その3:Arduino
僕は大好きArduino。今回はArduinoMicroを使用した。基本的に大抵のArduinoが使えるはず。流行のESP-WROOMモジュールを使ってWifiに情報を流したり、ラズパイをつないでも面白いと思います。
今回Microを使ったのは、ライブラリを使ってMIDIキーボードを作ろうと思いました。
##接続
ArduinoとIRカメラは以下のように接続します。他のボードでもI2Cポートがあれば簡単に接続できると思います。
##Arduinoライブラリ
以下の2点を使用しました。
DFRobotIRPosition
MIDIUSB
##Arduinoスケッチ
こちらにおいておきます。
https://github.com/NaohiroIIDA/IRCameraMidi
ライブラリのサンプルにほぼ書いてありますが、
if (myDFRobotIRPosition.available()) {
for (int i = 0; i < 4; i++) {
positionX[i] = myDFRobotIRPosition.readX(i);
positionY[i] = myDFRobotIRPosition.readY(i);
}
now_ch = map(positionX[0], 0, 650, 35, 85);
if (positionX[0] == 1023) {
now_ch = 0;
}
positionX[i],positionY[i]に赤外線の光点のXY座標が取得できます(見つからない場合は1023が入ります)。
このIRセンサは最大4点の光点を、検出範囲(H:33°/V:23°)の間でで取得することが出来ます。
このデータをmap関数で音程に変換しています。これをMIDIデータとして出力すれば、ダンボールを動かすと楽器のようにコントロールが出来ます。
##実演
(https://youtu.be/CBqcIZDoV9w)
##応用
LeonardやMicroなど32u4を搭載したarduinoでは、USBキーボードやマウスのエミュレートが出来るので、同じ仕組みをつかって入力装置を作るのも面白いと思います。IRセンサはターゲットが赤外線LEDと電池を使って自光する方式だと3m位先でも検出できるので、より広い範囲を見渡す事ができます。
###皆様、よいハッキングを!!