業務系JavaプログラマがJavaScript Roboticsに入門してみた話

# このページについて
初めてのIoTプログラミングのとっつきでJavaScript Roboticsをやってみた感想を書くページです。
（IoTって書きましたが、実際にはネットワークにつなげていないので、
その前段のセンサからデータを取る部分の感想です。）

# お断り
タイトルに業務系Javaプログラマと書きましたが、
ここに書くことは現在働いているSIerの業務で必要になったとか、そういう類のものではありません。
本人的にも、ここに書く内容が現在勤めているSIerで将来的に業務で役に立つなんてことは、今のところは微塵も思っていないです。

# このページの対象者
IoTって何から手をつけたらよいか分からないプログラマの皆様（自分もそうだった）
※JavaScript書けなくても大丈夫です。僕も大して書けませんから！

# 筆者のスキル
・Javaできる（Oracleのスペシャリストで分かれているものはほぼ全て網羅的にできる）
・C言語一応できる
・組込み系のプログラミングはμITron上に書いたプログラムを焼き付けてロボットカーの制御を少々行った程度（なので割り込みとか基本的なことはギリギリわかる）
・お仕事でハードウェア制御するようなコードを書いたことはない
・JavaScript初心者（言語の方言がわかる程度でどういう構成で書くべきかとかなどは分からないヒヨッコ）

# JavaScript Roboticsとは
（認識違うかもしれないので、間違っていたらツッコミお願いします）
ハードウェアの制御をJavaScriptで行うこと全般を指します。
こう書いてしまうと、どんなハードウェアもJavaScriptで動かせるのか！？
と思われそうですが、そんなことはなくJavaScriptに対応したハードウェアのみです。
とはいえ、ハードウェアをJavaScriptで制御するという点については、全世界で大流行中なので、JavaScript対応ハードウェアはどんどん出てくると思います。

# JavaScript Roboticsするには
Johnny-FiveというJavaScriptフレームワークを使って実装します。
（他にもあるかもしれないですが、調べた感じはこれくらいしか出てこなかったです、そしてこのページはJohnny-Fiveを扱います。）

こういうフレームワークを使わなくても、JavaScriptでハードウェア制御はできますが、その場合は自分でC言語の関数呼んだりなんだりすることになるため、超苦痛な未来しか待っていません。

# Johnny-Fiveとは
https://www.npmjs.com/package/johnny-five

Firmataプロトコルを使ってマイコン制御を行える素敵フレームワークです。
Firmataプロトコルというのは、PC-マイコン間でデータのやり取りをする決め事みたいです。
ここでいうPCはArduinoだったりラズパイだったりします。

このJohnny-Fiveってやつが提供するJSライブラリを駆使してプログラミングしてあげると、
Firmataプロトコルでマイコンに繋げた温度などセンサーなど色々なデバイスからデータが取れたり制御できたりするんですね。超便利。

このJohnny-Five、ピュアなJavaScriptではなく、Node.jsで書かれています。
Node.jsでハードウェア制御をすることを「NodeBots」と呼んでいてシリコンバレーを中心に勢力を拡大中みたいです。
（2016/7月には日本にもNodeBots Dayが上陸したみたいです）

対応しているマイコンボードは上記リンクを辿ると書いてあります。
今現在（2016/8/20)の対応のものを書いておくと、以下のものです。
Arduino (all models), Electric Imp, Beagle Bone, Intel Galileo & Edison, Linino One, Pinoccio, pcDuino3, Raspberry Pi, Particle/Spark Core & Photon, Tessel 2, TI Launchpad and more!

なんかモデルレベルで書いてあるものもあるので、ボードを買うときはJohnny-Fiveで制御するつもりなら、Johnny-Fiveに対応しているかどうかを確認した方が良さそうですね。

# NodeBotsって？
http://nodebots.io/

Node.jsを使ってハードウェアを制御する仕組みですが、
もともとはハードウェア勢がWebに歩み寄る形で生まれたけど、Web勢がハードウェアにも歩み寄っているということで一大ムーブメントを巻き起こしているみたいです。（逆だっけ？）
ハードとソフトって相容れないような感じを受けてましたが、Johnny-Fiveの出現でお互いに歩み寄りを見せているみたいです。

なので、NodeBotsやってみようと思いました。
（しれっと動機を入れてみた笑）

# 初めてのJavaScript Robotics
## 突付く前にやったこと
今となっては正直やらなくても良い感がありますが、最低限やろうと思ってやったことを紹介。
* JavaScriptの本を一周
[確かな力が身につくJavaScript「超」入門 (確かな力が身につく「超」入門シリーズ)](https://www.amazon.co.jp/%E7%A2%BA%E3%81%8B%E3%81%AA%E5%8A%9B%E3%81%8C%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8FJavaScript%E3%80%8C%E8%B6%85%E3%80%8D%E5%85%A5%E9%96%80-%E7%A2%BA%E3%81%8B%E3%81%AA%E5%8A%9B%E3%81%8C%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8F%E3%80%8C%E8%B6%85%E3%80%8D%E5%85%A5%E9%96%80%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E7%8B%A9%E9%87%8E-%E7%A5%90%E6%9D%B1/dp/4797383585?SubscriptionId=AKIAI7KBSJBCHLGER5FQ&tag=samurai4809-22&linkCode=xm2&camp=2025&creative=165953&creativeASIN=4797383585)
* Node.jsをひとしきり

## 言語は頭に入ったし、そんじゃやるぞ！だが、困ったこと
何買って良いか分からなかったです。
ハードやったことない人間にとっては何を買ったら良いのか本当に判らないんですよ。
有識者に聞いて買いに行ってもこれで良いんだっけ？？みたいな感じになって買えなかったり、
海外から輸入しようとしても技適マーク取ってないジャーン！とかあったり。
ハードウェアめんどくさい・・・という挫折ポイントです。
だが、そんなハード分からない初心者に救世主が現れました。

## 何買って良いか問題の終焉
FacebookのIoTLTページフォローしてたら、以下の記事が流れてきたわけです。

[史上初!? NodeBotsの日本向けキットを作成しました！](https://dotstud.io/blog/nodebots-kit-guide-vol1/)

中身見たら、技適マークとかそういったことをすべてクリアしているだけでなく、
NodeBots Workshop(チュートリアルみたいなものを自分でAPIリファレンス見ながら実装するやつ)という教育プログラムを実際にArduinoで動かすための機器一式をパッキングして売ってくれるという素敵な記事。
書いたプログラムが自分の手元のハードで動かせるの素敵！ということで即決でポチり。

情報収集にSNS使うのは必須だと感じました。
そういう情報をくれる人や組織と繋がるのに勉強会重要というのも感じました。

## NodeBotsに入門した話
### インストール
とりあえず、LIGさんのブログ通りにセットアップ。
* [Webな人でもハードウェア制御が簡単に！Node.jsでJavaScript Roboticsを楽しもう](http://liginc.co.jp/283711)
※僕はArduinoIDEの所を読み飛ばしてしまったので、WorkshopのQ2をハードに乗っけるときにハマりましたので、リンクの中身も含めて全て目を通しましょう。
（具体的にはArduinoIDE（お手元のPCからマイコンを制御できるIDE）経由で、ArduinoにStandard Firmataっていうスケッチを書いてなくてプログラム焼いても動かなくてハマった。。）
* インストールが終わるとnodebot-workshopというコマンドが一時的に叩けるようになります。（macの場合（たぶんLinuxも同じ）、Windowsは判らない）
ターミナルを落とした後で再度ターミナルを立ち上げた場合、コマンドにパスが通っておらず叩けなくったため、「.bash_profile」か「profiled.d」にnodebot-workshopがインストールされたディレクトリを登録するスクリプトを入れ込んでおくことをお勧めします。

### 問題を解く
ターミナルからnodebot-workshopコマンドを叩くと以下のものが標準出力で出てきます。
![nodebot-workshop_top.png](https://qiita-image-store.s3.amazonaws.com/0/56851/4e7cc5ca-50bd-9c41-de66-93113dfe8174.png)
ここから解きたい問題を選択してエンターを押せば問題が出てくるため、それをエディタで実装します。

試しにLチカ（LEDを点灯させる問題）を選ぶと以下のような感じでズラズラと問題が出力されます。

```lang:Lチカ
# NodeBot Workshop  
   
 ## Lチカ (9問中1問目)  
   
 # ようこそ nodebot-workshop へ  
   
  このワークショップではjohnny-fiveのAPIを学んでいきます。  
   
  johnny-fiveはArduinoや他のプロトタイピングボードを制御するためのAPIです。  
  このワークショップではArduinoなどは用意しなくても大丈夫です。  
   
  出題される問題にチャレンジしてみましょう。  
   
  実行可能なjohnny-fiveのコードを記述していってください  
   
  それぞれの回答はnodeプログラムとして実行可能となります。  
  ハードウェアを持っている人はArduinoに配線をつないだり、USB接続したりして回  
  答コードがどのように動作するか確認してみましょう。  
   
 ─────────────────────────────────────────────────────────────────────────────  
   
 # Lチカ  
   
  Lチカをしてみましょう。  
  13pinにLEDを一つ接続し、毎秒ごとに点滅させましょう。  
   
   » boardがready状態になったらLedインスタンスを作成しましょう。                 
   » Ledインスタンス作成の初期化の際には接続するpinの番号を記述しましょう。      
   » Ledにはstrobeメソッドがあり、ミリ秒間隔で実行できます。                     
   
 ## まずは以下の手順が必要になります  
   
   » mkdir mysolutionsなど任意のディレクトリを作成します。                       
   » cd mysolutionsで作成したディレクトリに移動しましょう。                      
   » johnny-fiveをnpmから取得します。 npm install johnny-five                    
   » 01-blink-blink.jsなど、回答を記述するファイルを作成しましょう。             
   
  全ての回答には以下の記述が必要になります。  
   
   » johnny-fiveモジュールのrequire                                              
   » new Boardインスタンスの作成                                                 
   » boardの ready イベントのコールバック                                        
   » 回答はこのコールバックの中で行います                                        
   
       var five = require('johnny-five')  
       var board = new five.Board()  
       board.on('ready', function () {  
       
         //回答をここに記述  
       
       })  
   
 ## 回路図  
   
                 330     LED  
      Pin 13 o--/\/\/---->|------o GND  
   
 ## コンポーネント  
   
   » LED -                                                                            
     [http://node-ardx.org/electronics-primer#led](http://node-ardx.org/elec     
     tronics-primer#led)                                                         
   
   > 電流が流れると発光します。一方向のみです。  
   
 ## ドキュメント  
   
   » Board -                                                                            
     [https://github.com/rwaldron/johnny-five/wiki/Board](https://github.com     
     /rwaldron/johnny-five/wiki/Board)                                           
   » Led -                                                                            
     [https://github.com/rwaldron/johnny-five/wiki/Led#api](https://github.c     
     om/rwaldron/johnny-five/wiki/Led#api)                                       
   » nodebot-workshopについて -                                                                            
     [http://liginc.co.jp/283711](http://liginc.co.jp/283711)                    
   
 ─────────────────────────────────────────────────────────────────────────────  
   
   » この説明をもう一度表示する: nodebot-workshop print                          
   » 作成したアプリをテスト環境で実行する: nodebot-workshop run program.js       
   » 作成したアプリが正しいか検証する: nodebot-workshop verify program.js        
   » 出力結果が見づらい場合には --no-color をつけてみてください:                                                                            
     nodebot-workshop verify program.js --no-color                               
   » ヘルプを表示する: nodebot-workshop help       
```

Lチカの項に書いてある通りにプログラムを書いて、以下のコマンドを叩けば答え合わせができます。

```lang:コマンド
nodebot-workshop verify [プログラムを書いたファイル名]
```

問題を読んでも何していいか判らないので、ドキュメントの項のURLを読みます。
ここにAPIが乗っているので見ながら書けば判ると思います。

本当に困った時は、nodebot-workshopをインストールしたディレクトリの配下に「exercises」というディレクトリがあるので、そこを掘れば答えが分かります。
（が、できるだけ見ないで解いた方が楽しいですよ）

僕が書いたソースコードは[GitHub](https://github.com/sh-ogawa/nodebot-workshop)上に上げました。
中身を見ていただくとわかりますが、かな〜り直感的なプログラミングが可能だということが判ります。

ソフト側の人間には、Nodebots Workshopのようにこうやって書いてください、と書いてあればソフトは書けて正解も容易いと思います。
が、問題はハード側です。

ここに挙げたくらいの回路図なら、Arduinoにその番号が書いてあるので、そこに配線して動かせますが、
根本的に回路が読めないです。
ので、ソフトだけの入門ならおそらく5〜7時間くらいみっちりやれば全問終わると思います。
が、ハードまで組もうとすると２〜3日かかります。（ハード初心者の場合）

### 所感
* ラズパイ見てると最初のセットアップが面倒くさい印象を持つが、Arduinoはそういうの必要ないので初めてやってみる人、とりあえずハード使いたい人には丁度いい。
* ハードウェア制御って聞くと組込み知識が〜とかよく聞くけど、そんなものは必要ない。
* 本当にハードウェアを簡単に制御できるし、
回路をちゃんと組めば、ハードウェア上でちゃんと動くの楽しい！
* 逆にハードとソフトの間で矛盾（配線したピンの場所とソフトで指定したピンの場所が違うとか）があると思ったように動かない、っていうのも楽しいです。
* 子供の自由研究に丁度いいと思います笑<BR>
特に理科のオームの法則うんたらのところは、なんで抵抗が必要なのか判りますし、自分でハードウェアの配線もしてプログラムも焼いてなので、きっと良い教材になりますよ笑

# Nodebots Workshopに必要な環境ソフト
* Python3.xが必要（ver.2以下だとdnodeサーバが立ち上がらない）
* zip圧縮、解凍するためのソフトが必要（普段業務で使っているPCなら問題にならないはず） 

# 今困っていること
Nodebots Workshopの問８ロボットアームが動かない。
（正確にはverifyで動くテストコードがうまく動いていないっぽい、がどこで実装されているのか分からない、教えてもらえれば検証して、問題があれば直してプルリクします。）

# Nodebots課題
多分Nodebots界隈ではなくNode.js界隈の問題。
Node.jsのバージョンアップが速すぎて周辺プロダクトが付いていけていない場合があるように感じる。
Web系って最新バージョンにし続けるっていうのがイメージでありますが、
これをフレームワークありきなJavaScript Roboticsでも同じようにやると血を見るかもしれない。

# 今後やること
センサから取れるデータをクラウド連携して、機械学習やらデータの可視化する。（ここまでやってIoTですね。）
※SIer側がやるであろうことをやる予定

# 今回の環境
* OS : Mac OS X(10.11.6)
* Node.js : 6.4.0
* Johnny-Five : 0.9.62
* nodebot-workshop : 3.1.4 
* Python : 3.5.2