Node.js
RaspberryPi
nvm
Johnny-Five

Raspberry Pi への Node.js インストールとnvmでのバージョン管理

More than 1 year has passed since last update.

Raspberry Pi のGPIOに色々なデバイスを接続しIoTを試しています。Node.jsとJohnny-fiveを使えばRaspberry PiでIoTを容易に実現できます。しかし,GPIOを使った入出力制御にはroot権限が必要でNode.js動作環境のセットアップに工夫が必要です。このページは,その工夫の備忘書きです。

1.概要

  1. RASBIAN JESSIE には node v0.10.29 が収容されていますが,現行のものと比べてかなり古いバージョンなのでアンインストールしv5.4.0をインストールします。
  2. nvm(node version manager)を使うとnodeのインストールとバージョンコントロールを極めて簡単に行うことができます。
  3. しかし,nvmの一般的方法でインストールしたnodeは複数ユーザで使う考慮がされてません。
  4. sudo node としてroot権限でnodeを動かそうとしても node: command not found となります。
  5. 上の不都合を回避するための環境設定が必要です。

2.前提

  1. RASBIAN JESSIEがインストールされ正しく動いていること。
  2. インターネットに接続していること。
  3. gitコマンドが有効になっていること。
  4. shell(bash)の操作に,ある程度習熟していること。

3.作業

  1. コンソールの表示を英語モードにします。
    日本語モードのままでもOKなのですが,条件によっては日本語フォントが表示できず操作への反応メッセージがトーフ(■)で表示され場合があるのでこれを回避するためです。
    $ export LANG=C

  2. gitコマンドの動作を確認します。
    $ git --version
    git version 2.1.4
    バージョン番号が帰ってくればgitコマンドは動作します。

  3. node v0.10.29をアンインストールします
    $ sudo apt-get autoremove nodejs

  4. nvmをインストールするディレクトリ(/usr/local/nvm)を作成しアトリビュートを変更します
    $ sudo mkdir /usr/local/nvm
    $ sudo chmod 777 /usr/local/nvm

  5. nvm.gitリポジトリのクローンを作成します
    $ git clone https://github.com/creationix/nvm.git /usr/local/nvm

  6. nvmを使えるようにします
    $ source /usr/local/nvm/nvm.sh

  7. nodeをインストールします
    nvmでインストールできるnodeのバージョン一覧を表示
    $ nvm ls-remote
    v5.4.0をインストール
    $ nvm install v5.4.0

  8. node, npm のバージョン表示して動作することを確認します
    $ node -v
    v5.4.0
    $ npm -v
    3.3.12

  9. ログイン時に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へのパスが設定されます。

  10. sudo node が動くようにします
    $ sudo visudo
    nanoエディタが起動しsudoの動作定義ファイルが開きます。
    次の行をコメントアウトします。
    #Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
    次の行を追加します。
    Defaults env_keep += "PATH"
    sudoの動作環境に現在のユーザのコマンド・パスを引き渡す設定です。

4.NodeでGPIOを動かす

  1. johnny-five他のパッケージをインストールします
    johnny-fiveパッケージのインストール
    $ npm install johnny-five
    raspi-ioパッケージのインストール
    $ npm install raspi-io

  2. 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のバージョン管理

  1. Node.jsの開発スピードは非常に早く頻繁にバージョンアップされます。 nvmは使用するNode.jsのバージョンコントロールを強力にかつ簡単に行なえます。

  2. Node.jsのバージョンリストを表示する。
    $ nvm ls-remote
    リストが表示されます。青文字のバージョンは現在自分がaliasに設定している(node で起動する)バージョンです。 末尾が奇数のバージョンは開発版,偶数のものが安定版です。

  3. 最新版をインストールする
    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)

  4. インストールされている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がインストールされているのがわかります

  5. defaultをv6.2.2にする
    $ nvm alias default v6.2.2

  6. 旧バージョンを使う
    ソースコードが新バージョンに対応せず旧バージョンのNode.jsで実行したいときは
    $ nvm use v5.4.0
    として,一時的にnodeのaliasをv5.4.0に変更します。

  7. 旧バージョンのアンインストール
    $ nvm uninstall v5.4.0

原典 http://make.kosakalab.com/make/electronic-work/nodejs_raspi/