LoginSignup
4
2

More than 5 years have passed since last update.

littleBits MAKEY MAKEYモジュールをNode-REDで読み取る

Posted at

littleBits MAKEY MAKEYモジュールをNode-REDで読み取ることをやってみたくて試してみます。

背景

以前、このような気軽にIoTのプロトタイプを作れるlittleBitsのMAKEY MAKEYモジュールを使ってみたネタを作ったときに思ったのは接続した時点で右キー・左キー・クリック or スペースをキーボードマウスデバイスとして割り当ててくれるため、むしろ割り込みにくく捉えにくい。

たとえば、ブラウザにマウスを載せて、JavaScriptでキーイベントとクリックを取る方法も、その時考えましたが、プレゼン時のちょっとした衝撃でマウスがズレる可能性があって断念した経緯もあります。

image

ということで、さらに何を押されたかを丁寧に伝えるとなると、Arduinoモジュールを噛ませてPCに伝達しないといけないため、ちょっと冗長になるのが、そろそろどうにかしたいと思っておりました。

今回の実験ができると

littleBits MAKEY MAKEYモジュールをNode-REDで読み取る今回の実験ができると、そのあたりの割り込みがしやすくなり、かつ他のネットワークな通信にすぐつなげることができるので、MakeyMakeyのたのしいフィジカルな情報をすぐにコンテンツに反映することができます。

今回の構成

Raspberry Pi3にMAKEY MAKEYモジュールをくっつけた状態で行います。

image_20161201_161545_7.jpg

ライブラリ候補

やってみる

node-red-node-makeymakey

早速インストールしてみました。入力系をいじる場合はrootで動かす必要があるので、suでroot権限で活動します。

sudo su -

フォルダ移動します。

cd ~/.node-red

rootの場合、/root/.node-red ということですね。インストールします。

npm i node-red-node-makeymakey

起動。root権限で行っているのでsudoはいらないかもしれませんが、suしてないときにハマるといけないので、ひとまず。

sudo node-red

無事入りまして、advancedに入りました。

image

実際に置いてみます。

image

設定も特になく書き出してみたところ、そもそも基礎のライブラリである、node-hidまわりで呼べないメソッドでエラーを起こしているので、メンテされていなさがうかがえます :cry:

image

中身をこまごま直してみて解決できそうだったのですが、このままだと「littleBits MAKEYMAKEYモジュールをNode-REDで読み取るためにノードを作り直した話」になるので断念。またの機会に。

node-red-contrib-usbhid

こちらはすんなり入りました。最初方こちらにすればよかった・・・。

node-red-node-makeymakeyと同様にroot作業。

sudo su -

フォルダ移動します。

cd ~/.node-red

インストール。

npm i node-red-contrib-usbhid

起動。

sudo node-red

無事、リストに登場しました。

image

以下のようにフローを設定します。

image

:pencil2: HIDdeviceノードの設定

image

HIDノードはMakeyMakeyIDを指定します。

image

編集ボタンで生成。

image

VIDに0x1b4f、PIDに0x2b75を指定します。

なぜ、この固有IDがわかったのかというとnode-red-node-makeymakeyのソースコードを読んでいたら分かったことなので、バグ取りは決して無駄にならなかったということでしょう。

:pencil2: makeymakey convert functionの設定

image

HIDdeviceノードから来た値に応じてLEFT、RIGHT、CLICK、SPACEを割り当てます。

image

// Bufferを文字列化
var buffer = msg.payload.toString('hex', 0, msg.payload.length);
// 判定
if( buffer == "020000500000000000"){
    msg.payload = "LEFT"
} else if( buffer == "0200002c0000000000"){
    msg.payload = "SPACE"
} else if( buffer == "0200004f0000000000"){
    msg.payload = "RIGHT"
} else if( buffer == "0101000000"){
    msg.payload = "CLICK"
} else {
    // それ以外は後発フローを発生させない
    msg = null;
}
return msg;

実験

debugフローも設置したので実験をしてみます。

image_20161201_165655_30.jpg

MAKEY MAKEYモジュールにワニクリップをつけて操作してみます。いまはレバーをclickにしているますが、実際に操作してみると、

image

うまく取得することができました。spaceにツマミを倒してみても

image

ちゃんと取得することができます!

今回のフロー

今回のフローも置いておきます。

[{"id":"1118ad97.f48bc2","type":"HIDConfig","z":"f8e06b65.260988","vid":"0x1b4f","pid":"0x2b75","name":""},{"id":"c6aec4e6.b7eb28","type":"debug","z":"f8e06b65.260988","name":"","active":true,"console":"false","complete":"false","x":930,"y":444,"wires":[]},{"id":"d31fba38.fe0848","type":"function","z":"f8e06b65.260988","name":"makeymakey convert","func":"// Bufferを文字列化\nvar buffer = msg.payload.toString('hex', 0, msg.payload.length);\n// 判定\nif( buffer == \"020000500000000000\"){\n    msg.payload = \"LEFT\"\n} else if( buffer == \"0200002c0000000000\"){\n    msg.payload = \"SPACE\"\n} else if( buffer == \"0200004f0000000000\"){\n    msg.payload = \"RIGHT\"\n} else if( buffer == \"0101000000\"){\n    msg.payload = \"CLICK\"\n} else {\n    // それ以外は後発フローを発生させない\n    msg = null;\n}\nreturn msg;","outputs":1,"noerr":0,"x":664,"y":503,"wires":[["c6aec4e6.b7eb28"]]},{"id":"2b60d701.d33e58","type":"HIDdevice","z":"f8e06b65.260988","connection":"1118ad97.f48bc2","name":"","x":407,"y":436,"wires":[["d31fba38.fe0848"],[]]}]

参考文献

4
2
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
4
2