obnizラジコンをnode化する

こちらは[「Obniz Advent Calendar 2018」](https://qiita.com/advent-calendar/2018/obniz) の12月4日の記事になります。

obniz公式サイトにはたくさんのサンプルプログラムや作品が載っています。
例えばobnizのハンズオンでも使われているobnizラジコンは、HTMLとJavaScriptでスマホから簡単にラジコンを操作することが出来ます。
https://obniz.io/explore/42
今回はこのラジコンプログラムをnode化してみたいと思います。

##参考にしたサイト
obniz - Nodejsで使う
https://obniz.io/doc/lessons_nodejs

obniz.js API リファレンス - Messaging
https://obniz.io/doc/sdk/doc/messaging

##作り方
###Messaging API
obnizのMessaging機能を使うとHTTPリクエストをメッセージとして受け取ることが出来るようです。
って、これを使うといいよって教えてもらったんですけどね。
呼び出すときのエンドポイントはこんな感じです。
`GET https://obniz.io/obniz/{obniz_id}/message?data=＊＊＊`

早速作ってみましょう。

###工作タイム
必要な部品は[サンプル作品](https://obniz.io/explore/42)と同じです。

- モーターにジャンパーワイヤーをハンダ付け
ネット注文した品にはコードが付いてなかったので20年ぶりくらいにハンダごてを使いました。
コテを当て過ぎてモーター壊すんじゃないかとビビリながらもなんとか。。

- モーターを張り付ける板の作成
かっこよく3Dプリンタで！と言いたいところですが必要なのは単なる板ですし、
100均ののこぎりと紙やすりで100均の木板を加工してお安く作ります。
4隅を丸くスベスベに整えたのでいい感じになりました。

- モーター(＆タイヤ)とobnizとモバイルバッテリーを板に張り付ける
センスが問われるところです。
セロパンテープやマスキングテープだとちょっと見た目が気になったので両面テープで目立たないように貼り付けました。USBケーブルも細めの方がすっきりするのでしょうが持ってなかったのでそこは良しとしました。

<img width="400" alt="obniz1_1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/147248/0b85e7e6-967b-d92c-e78e-e97c52c81339.jpeg">

<img width="400" alt="obniz1_1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/147248/01193926-67b1-6b00-f335-92b2d6a25b3e.jpeg">

###nodeプログラムの作成
エンドポイントURLに、～/message?data=forwardや～/message?data=backを指定し、引数に応じてモーターを回すようにしました。
こんな感じになります。

```js:app.js
var Obniz = require("obniz");

var obniz = new Obniz("{obniz_id}");
obniz.onconnect = async function () {
    var motorA = obniz.wired("DCMotor",  {forward:0, back:1});
    motorA.power(30);
    var motorB = obniz.wired("DCMotor",  {forward:2, back:3});
    motorB.power(30);

    obniz.display.clear();
    obniz.display.print("motor: stop");

    obniz.onmessage = function(message, from) {
        switch (message) {
            case "stop":
                obniz.display.clear();
                obniz.display.print("motor: stop");
                motorA.stop();
                motorB.stop();
                break;
            case "forward":
                obniz.display.clear();
                obniz.display.print("motor: forward");
                motorA.move(true);
                motorB.move(true);
                break;
            case "back":
                obniz.display.clear();
                obniz.display.print("motor: back");
                motorA.move(false);
                motorB.move(false);
                break;
            case "right":
                obniz.display.clear();
                obniz.display.print("motor: turn right");
                motorA.stop();
                motorB.move(true);
                break;
            case "left":
                obniz.display.clear();
                obniz.display.print("motor: turn left");
                motorA.move(true);
                motorB.stop();
                break;
            default:
                obniz.display.clear();
                obniz.display.print("motor: bad parameter");
                break;
        }
    }
}
```

##動作確認
nodeサーバーを起動します。今回はローカルPC上で起動しました。

```
> node app
```

Webブラウザのアドレスバーやpostmanなどを使ってHTTP GETリクエストを投げてみましょう。
例えば下のようなURLを指定します。

`https://obniz.io/obniz/{obniz_id}/message?data=forward`

`https://obniz.io/obniz/{obniz_id}/message?data=stop`

動きました！
最後の部分をback,right,leftに変えると後退・右回転・左回転します。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">この動画だけだと分かりずらいですがnodeサーバーで動いてます。手持ちスマホで撮影したらブレブレ＆はみ出しまくり。<a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a> <a href="https://t.co/2ioYFGbNyy">pic.twitter.com/2ioYFGbNyy</a></p>&mdash; hayakumi (@hayakumi8893) <a href="https://twitter.com/hayakumi8893/status/1069632966375092224?ref_src=twsrc%5Etfw">2018年12月3日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


##終わりに

案の定プログラムよりも工作時間に大半を費やしました。
node化にあたり、Messaging機能を初めて使いましたが（obnizは私にとって全部初めてみたいなものですが）これを使えばHTTPリクエストを使って外部からobnizラジコンを動かすことが出来ます。
セキュリティのためにアクセストークン使うようにコーディングすべきだったな、というのが反省点です。

ここまで読んでいただきましてありがとうございました。
別エントリーに続きがありますのでよろしければそちらも読んでいただけると嬉しいです。
[M5Stackでobnizラジコンを操作する](https://qiita.com/hayakumi/items/892618114dfa51a28eb8)
[Pepperでobnizラジコンを操作する](https://qiita.com/hayakumi/items/56a3b1ac1a5e06211307)