Raspberry Pi のGPIOに色々なデバイスを接続しIoTを試しています。Node.jsとJohnny-fiveを使えばRaspberry PiでIoTを容易に実現できます。しかし,GPIOを使った入出力制御にはroot権限が必要でNode.js動作環境のセットアップに工夫が必要です。このページは,その工夫の備忘書きです。
1.概要
- RASBIAN JESSIE には node v0.10.29 が収容されていますが,現行のものと比べてかなり古いバージョンなのでアンインストールしv5.4.0をインストールします。
- nvm(node version manager)を使うとnodeのインストールとバージョンコントロールを極めて簡単に行うことができます。
- しかし,nvmの一般的方法でインストールしたnodeは複数ユーザで使う考慮がされてません。
- sudo node としてroot権限でnodeを動かそうとしても node: command not found となります。
- 上の不都合を回避するための環境設定が必要です。
2.前提
- RASBIAN JESSIEがインストールされ正しく動いていること。
- インターネットに接続していること。
- gitコマンドが有効になっていること。
- shell(bash)の操作に,ある程度習熟していること。
3.作業
- コンソールの表示を英語モードにします。
日本語モードのままでもOKなのですが,条件によっては日本語フォントが表示できず操作への反応メッセージがトーフ(■)で表示され場合があるのでこれを回避するためです。
$ export LANG=C
- gitコマンドの動作を確認します。
$ git --version
git version 2.1.4
バージョン番号が帰ってくればgitコマンドは動作します。
- node v0.10.29をアンインストールします
$ sudo apt-get autoremove nodejs
- nvmをインストールするディレクトリ(/usr/local/nvm)を作成しアトリビュートを変更します
$ sudo mkdir /usr/local/nvm
$ sudo chmod 777 /usr/local/nvm
- nvm.gitリポジトリのクローンを作成します
$ git clone https://github.com/creationix/nvm.git /usr/local/nvm
- nvmを使えるようにします
$ source /usr/local/nvm/nvm.sh
- nodeをインストールします
nvmでインストールできるnodeのバージョン一覧を表示
$ nvm ls-remote
v5.4.0をインストール
$ nvm install v5.4.0
- node, npm のバージョン表示して動作することを確認します
$ node -v
v5.4.0
$ npm -v
3.3.12
- ログイン時にnvm,nodeの起動設定を行うようにします
/etc/profile.d/ディレクトリ配下に次の内容のnvm.shを作成します。
$ sudo vi /etc/profile.d/nvm.sh
または
$ sudo nano /etc/profile.d/nvm.sh
でnvm.shを作成し,次の行を記述して保存
source /usr/local/nvm/nvm.sh
node-v5.4.0 が node コマンドで起動するようにdefaultエイリアスを設定します。
$ nvm alias default v5.4.0
以上の設定でログイン時にnvm.shが実行され node コマンドへの v5.4.0の割り付けとnvm, npmへのパスが設定されます。
- sudo node が動くようにします
$ sudo visudo
nanoエディタが起動しsudoの動作定義ファイルが開きます。
次の行をコメントアウトします。
#Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
次の行を追加します。
Defaults env_keep += "PATH"
sudoの動作環境に現在のユーザのコマンド・パスを引き渡す設定です。
4.NodeでGPIOを動かす
- johnny-five他のパッケージをインストールします
johnny-fiveパッケージのインストール
$ npm install johnny-five
raspi-ioパッケージのインストール
$ npm install raspi-io
- GPIOの7番ピンに接続したLEDを1秒(1000mS)間隔で点滅させます。
次のコードを記述したソース・ファイルgpio-led7.jsを作成します。
var raspi = require('raspi-io');
var five = require('johnny-five');
var board = new five.Board({
io: new raspi();
});
board.on('ready', function() {
var led = new five.led('P1-7');
led.blink(1000);
});
sudoで実行します
$ sudo node gipo-led7.js
1453297162821 Device(s) RaspberryPi-IO
1453297162907 Connected RaspberryPi-IO
1453297162937 Repl Initialized
>>
一般ユーザで実行して見ます
$ node gpio-led7.js
wiringPiSetup: Must be root. (Did you forget sudo?)
Aborted
GPIOを操作するプログラムは sudo で実行しないと動作しません。
5.Node.jsのバージョン管理
- Node.jsの開発スピードは非常に早く頻繁にバージョンアップされます。
nvmは使用するNode.jsのバージョンコントロールを強力にかつ簡単に行なえます。
- Node.jsのバージョンリストを表示する。
$ nvm ls-remote
リストが表示されます。青文字のバージョンは現在自分がaliasに設定している(node で起動する)バージョンです。 末尾が奇数のバージョンは開発版,偶数のものが安定版です。
- 最新版をインストールする
2016.06.18時点での最新安定版v6.2.2をインストールします。
$ nvm install v6.2.2
Downloading https://nodejs.org/dist/v6.2.2/node-v6.2.2-linux-...
######################################################### 100.0%
Now using node v6.2.2 (npm v3.9.5)
- インストールされているNode.jsのリストを表示する
$nvm ls
v5.4.0
-> v6.2.2
default -> v5.4.0
node -> stable (-> v6.2.2) (default)
stable -> 6.2 (-> v6.2.2) (default)
iojs -> N/A (default)
v5.4.0とv6.2.2がインストールされているのがわかります
- defaultをv6.2.2にする
$ nvm alias default v6.2.2
- 旧バージョンを使う
ソースコードが新バージョンに対応せず旧バージョンのNode.jsで実行したいときは
$ nvm use v5.4.0
として,一時的にnodeのaliasをv5.4.0に変更します。
- 旧バージョンのアンインストール
$ nvm uninstall v5.4.0
原典 http://make.kosakalab.com/make/electronic-work/nodejs_raspi/