littleBits MAKEY MAKEYモジュールをあえてNode.jsで受け入れる

littleBits MAKEY MAKEYモジュールをあえてNode.jsで受け入れるメモです。

以前は、自分のスキル的にlittleBits MAKEY MAKEYモジュールから値を取得する場合は、Arduinoモジュールが翻訳するような冗長さがありました。

最近、Node.jsでキーボード入力を受け取る<a href="https://github.com/node-hid/node-hid" target="_blank">node-hid</a>ライブラリを念入りにさわる機会があり「littleBits MAKEY MAKEYモジュールからキー入力＆クリックとそのまま捉えてNode.jsに渡す」ということができるようになりました。

早速、Raspberry Piで実験していきましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/809392da-db90-f008-639b-3713f29b393b.png)

# node-hidインストール

まずキーボード入力を受け入れる<a href="https://github.com/node-hid/node-hid" target="_blank">node-hid</a>をインストールします。

```bash
npm i --save node-hid
```

# MAKEY MAKEYモジュールのvendorIdとproductIdを把握

まず以下のコードを書いて実行することでMAKEY MAKEYモジュールのvendorIdとproductIdを把握します。

```js:devices.js
// デバイスリストを読み込む
var HID = require('node-hid');

console.log(HID.devices());
```

実行してみます。

```bash
node devices.js
```

値が表示されます。今回はlittleBits MAKEY MAKEYモジュールをひとつだけ付けているのでわかりやすいです。

```
[ { vendorId: 6991,
    productId: 11125,
    path: '0001:0004:02',
    release: 256,
    interface: 2 } ]
```

あれ？manufacturer、productの情報がなくてMAKEY MAKEYかわからない・・・？

そうでした、node-hidはsudoで実行するのでした。

```
sudo node devices.js
```

値が表示されます。

```
[ { vendorId: 6991,
    productId: 11125,
    path: '0001:0004:02',
    manufacturer: 'Unknown    ',
    product: 'USB IO Board    ',
    release: 256,
    interface: 2 } ]
```

よし、しっかり出ましたね。

vendorIdが**6991**、productIdが**11125**と把握できました。

# 取得コードを書いてみる

```js:index.js
var HID = require('node-hid');

var device = new HID.HID(6991,11125);

device.on('data', function (data) {
    // dataはBufferデータで来るので文字列化する
    var bufferStr = data.toString('hex', 0, data.length);
    // 値を判定
    var action;
    if( bufferStr == '020000500000000000'){
        action = 'LEFT'
    } else if( bufferStr == '0200002c0000000000'){
        action = 'SPACE'
    } else if( bufferStr == '0200004f0000000000'){
        action = 'RIGHT'
    } else if( bufferStr == '0101000000'){
        action = 'CLICK'
    } else {
        action = 'NONE';
    }
    // NONE以外出力
    if( action != 'NONE'){
        console.log('action : ' + action);
    }

});

device.on('error', function () {
    console.log('error');
});
```

# 実験

まずsudoで起動します。

```bash
sudo node index.js
```

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/2d849e94-1d17-dd5a-b6f8-331564137d46.png)

RIGHTとCLICKを反応してみます。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/cd4b3ac9-3da2-e84d-16a7-237e8551586a.png)

無事反応しました！

CLICKをSPACEへツマミを変更してみます。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/8dc461aa-6881-4e94-8105-d2b74513991e.png)

こちらもちゃんと反応させることができました。

# 余談：どのようにデータが来ているか

上記のif判定を作る前にどういう反応をするか試していたときにどのようにデータが来ているかの情報を少々。

以下のようにコードを書いて右キー、左キー、スペース、クリックと反応させます。（コードは抜粋です）

```js
device.on('data', function (data) {
    // 素の入力データ
    console.log(data);
    // dataはBufferデータで来るので文字列化する
    var bufferStr = data.toString('hex', 0, data.length);
    console.log(bufferStr);
```

すると、Bufferデータで来るので、Bufferを文字列に変換しつつ、どう判定させるかを探りました。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/80f52570-2724-7daa-b501-a749d42e8423.png)

このあたりはだいぶ地味な作業です。

littleBits MAKEY MAKEYモジュールをあえてNode.jsで受け入れる、できあがりました。

# 次回は

<a href="http://qiita.com/advent-calendar/2016/littlebits" target="_blank">littleBits Advent Calendar 2016</a>、明日の担当は、@mfunakiさんのICタグに関する記事です！

littleBitsとICタグ。どう連携するのか楽しみです！よろしくお願いします。