ついにNode.jsでサクッとハードウェアをやれる時代が来た！「obniz」でJavaScript Robotics


こんにちは、ちゃんとくです。

[Node.js Advent Calendar 2018](https://qiita.com/advent-calendar/2018/nodejs) 15日目の記事です。毎度滑り込みですみません。

フロントもサーバサイドもJavaScriptな時代が来ていますが、**ハードウェアもJavaScriptな時代**が来ました。

Wi-Fi通信対応でAPI制御できるマイコンボード、その名も「**obniz**」です！！

## obniz
[![Image from Gyazo](https://i.gyazo.com/8400b00fa577412ea97e72210487d5b2.jpg)](https://plusstyle.jp/shopping/item?id=292)

- 名称: obniz（おぶないず）
- 価格: ¥5,980（公式サイト）
- Wi-Fi/BLE対応
- モータ直差し、過電流保護、全ピンUART対応などいろいろ優しい

SDKはPython、Ruby、モバイル系にも対応しているみたいです。
[![Image from Gyazo](https://i.gyazo.com/fd39113c0878b6d1f8903c4669f62fb0.png)](https://obniz.io/spec)
[obniz公式 - obnizの仕組み](https://obniz.io/spec)

## これまでのJavaScript Roboticsのツラミ
### Johnny-Five（NodeBots）

![Image from Gyazo](https://i.gyazo.com/c70a69becd36a80bb088c8730a720b4b.png)

PC上でNode.jsを実行し、Firmataプロトコル（PC-マイコン間通信）で通信させてArduinoを制御する方法です。

セットアップや制御はわりとサクッとやれるのですが、Firmataプロトコル通信が必要なためスタンドアロンで実行できないのがあまりお手軽じゃないなあと思っていました。（ちゃんとく所感）

### JSボード

[![Image from Gyazo](https://i.gyazo.com/e4b1acfacc880f2cd69a79a3fe947d11.jpg)](https://gyazo.com/e4b1acfacc880f2cd69a79a3fe947d11)

[Tessel2](https://tessel.io/)という海外で人気のJSボードがあるのですが、**技適が通っていないため日本では使えません**。

※技適…日本の電波法。技適の通っていないデバイスを起動すると電波法違反。

その他にもJavaScriptに対応したマイコンボードはいくつか出ているのですが、諸々の制約やつらみがあって日本では流行っていません。（ちゃんとく所感）

## obnizをサクッとNode.jsで動かしてみる
さっそくですがHello,worldしてみます。

### マイコンボードのセットアップ

obnizを使い始めるために必要なことは、**Wi-Fiセットアップのみ**です。PC使うときもスマホ使うときも一緒ですね。

![Image from Gyazo](https://i.gyazo.com/e92d5d7f76d232ff152a4bf6b947b74e.jpg)
obnizにはディスプレイとカーソル操作スイッチがついているので、**obniz単体で設定できるのも胸アツポイント**です。

ちなみにSSIDを日本語にしているので鬼のように文字化けしています。

⇨ 参考: [obniz（Node.js）で画面に日本語を表示する](https:/[![Image from Gyazo](https://i.gyazo.com/e92d5d7f76d232ff152a4bf6b947b74e.jpg)](https://gyazo.com/e92d5d7f76d232ff152a4bf6b947b74e)/qiita.com/hmaruyama/items/54ffe20816e275f55570)

設定すると8桁の識別IDが表示されます。
![Image from Gyazo](https://i.gyazo.com/0646a8e2e1a1bdbb8433eb9f55172333.jpg)

このIDで、どこからでもなんの言語でも、いつでもどこでもHello,worldです。（適当）

### obnizモジュールの導入
Node.jsの操作に慣れている前提で進みます。適当なディレクトリを作成しておきましょう。

まずはみんな大好きnpmでobnizモジュールをサクッとインストール。

```
$ npm init -y
$ npm i obniz
```

### Node.jsでプログラム＆実行
サクサクプログラムします。（[公式ドキュメント（左タブ）](http://obniz.io/program)）

```
'use strict';

const Obniz = require("obniz");

const obniz = new Obniz("XXXX-XXXX"); // 8桁のID
obniz.onconnect = function() {
    obniz.display.print("Hello, world!");
}
```

そして実行するだけ！

```
$ node app.js
```

どや！

![Image from Gyazo](https://i.gyazo.com/4195113aee696158d0a5019928feab14.gif)

思ってたんと違うのが出ました。

ディスプレイの初期表示（QR、IDなど）を消すには`display.clear()`の宣言が必要みたいです。

```
'use strict';

const Obniz = require("obniz");

const obniz = new Obniz("XXXX-XXXX"); // 8桁のID
obniz.onconnect = function() {
    obniz.display.clear();
    obniz.display.print("Hello, world!");
}
```

気を取り直して！

![Image from Gyazo](https://i.gyazo.com/acc34367c559cde1d9f303159ab97380.gif)

わーい！Node.jsで秒速ハローワールドできました！

## ワークショップもやってみました
先日の[NodeFest 2018](https://nodefest.jp/2018/)では、ワークショップの時間をお借りしてobnizでブラウザ制御できるラジコンカーを作ってみました。

[![Image from Gyazo](https://i.gyazo.com/898ae4519f063f15c9b47a86c8096f89.jpg)](https://gyazo.com/898ae4519f063f15c9b47a86c8096f89)

[![Image from Gyazo](https://i.gyazo.com/595676677f6277de856c1973f93545d5.jpg)](https://gyazo.com/595676677f6277de856c1973f93545d5)

[![Image from Gyazo](https://i.gyazo.com/294291170f412ce6a813dc2df77debcd.gif)](https://gyazo.com/294291170f412ce6a813dc2df77debcd)

ホスティングしたり、モバイルバッテリから給電したりすればそのまま超簡単にスタンドアロン稼働です。

普段Arduino系のハンズオンを開催しているとソフトウェアのインストールやUSBドライバ、OSの違いなど色々と苦労があるのですが、obnizでは**サクッとやれすぎて嫉妬しました**。

アンケートも大変満足度が高かったです。この機会に皆でハードウェア！