Arduino x Node.jsで人感センサを使ってみよう(開発編)
手順1:まずはArduinoの動作確認
まずはArduinoがちゃんと動作するか確認しましょう。あまり聞きませんが、初期不良や運送中に故障してしまっていないかの確認にもなります。
- MacとArduinoをUSB(先ほど購入リストにあげたA-Bタイプ)で接続する
- ArduinoのSDKアプリケーションを起動する
- [ツール]から[シリアルポート]を選択しArduinoとの接続を確認する
という流れを確認しながらやってみましょう。Arduinoを箱から取り出してからの流れなどは、『【Arduino】 Arduinoに入門してみた』というブログ記事が丁寧です。なお、マイコンボードは静電気に弱いものもあるので、冬場は特に静電気に気をつけましょう。
ここまでできたら、試しに以下のプログラム(Arduinoではスケッチと呼んでます)をArduino SDKのエディタ側に書いてみましょう。コピペで大丈夫です。
const int LED = 13; // LEDはデジタルピン13に接続 void setup(){ pinMode(LED, OUTPUT); // デジタルピンを出力に設定 } void loop(){ digitalWrite(LED, HIGH); // LEDを点ける delay(500); // 0.5秒待つ digitalWrite(LED, LOW); // LEDを消す delay(500); // 0.5秒待つ }
エディタ左上の[→]ボタンで、書いたプログラムをArduinoのボードに書き込むことができます。
書き込みが成功すると、Arduinoのロゴ近くのLEDがオレンジに点滅すると思います。これがHello WorldみたいなLチカ(LEDチカチカ)ってやつですね。これで動作確認ができました。
0.5秒ごとに点滅します。
手順2:Firmataの書き込み
とりあえず今は、Node.jsから制御できるようにするための呪文だと思ってもらえれば大丈夫です。
[ファイル]->[スケッチの例]->[Firmara]->[StandardFirmata]を選択します。
そうすると、エディタウインドウが新しく立ち上がります。
立ち上がったStandardFirmataのプログラムを[→]ボタンでボードに書き込みましょう。
これを行うことで、Node.js(johnny-five)からArduinoに直接信号を送ることが可能になります。
「なんだよ、思ったよりArduino使っているじゃん」と突っ込みたい方もいると思いますが、ここまでなので我慢してください(笑)。
手順3:Node.jsからLチカしてみる。
あとはMacのターミナルからの作業です。まずは、任意の場所にmy-sketchフォルダを作ってフォルダ内に移動します。
$ mkdir my-sketch $ cd my-sketch
先ほど準備で説明したjohnny-fiveをインストールしましょう。
$ npm i johnny-five
次に名前はなんでもいいのですが、led.jsという名前でプログラムを作成します。以下を記述(コピペ推奨)しましょう。これはNode.jsのプログラムです。
/*led.js*/ 'use strict' let five = require("johnny-five"); let board = new five.Board(); board.on("ready", () => { let led = new five.Led(13); led.blink(500); });
次世代のJavaScriptの文法である、ES2015が普及してきましたが、まだES5の書き方も現役です。時期的にどちらの書き方で書いた方がいいのか迷ったのですが、今後ES2015が一般的な書き方になっていきますので、ES2015の文法で記述していきます。ちなみに現時点のNode.jsではimport文が実装されていないため、モジュール呼び出し部分だけはrequireで記述しています。
実行してみましょう。
$ node led.js 1449099558606 Device(s) /dev/cu.usbmodem1411 1449099558640 Connected /dev/cu.usbmodem1411 1449099562410 Repl Initialized >>
Firmataを書き込んだ際に、MacとArduinoの接続が確保されているために、Node.jsからの実行ファイルがArduino側に反映される仕組みとなっています。
実行すると、上図のようにNode.jsのプログラム実行をしているにもかかわらず、先ほどのAruduinoプログラムと同じ動作をしてくれます。