2016年6月1日水曜日

raspberry piに最新のnodejsをインストールして、gpioからLEDを光らせる方法


色々な情報があって戸惑ったので、自分向けのメモを兼ねて共有します。

使ったもの

raspberry pi B+
ブレッドボード
LED
抵抗
オスメスジャンパワイヤ

nodejsのインストール方法

apt-getで古いバージョンをインストールして、古いバージョンの機能を利用して新しいバージョンをインストールします。

下記のコマンドで古いバージョンのnpmをインストールします。
sudo apt-get install npm

apt-getでnpmをインストールすると、古いバージョンのnodejsも自動的にインストールされます。

新しいバージョンのnodejsとnpmをインストールします。
sudo npm install -g n
sudo n stable
sudo npm update -g npm

インストールできました。


余談:
nodejsのバージョンが古い状態でnpmをアップデートしようとしても、アップデートできませんでした。
nodejsのアップデートを先にする必要があります。


「sudo npm -v」と「npm -v」で表示されるバージョンが異なるときは、ターミナルを立ち上げ直すか、raspberry piを再起動すると新しいバージョンに統一されます。

自分の場合npmのapt-getでのインストール時に、このようなエラーが出ました。
E: Failed to fetch http://mirrordirector.raspbian.org/raspbian/pool/main/o/openssl/libssl-doc_1.0.1t-1+deb8u5_all.deb  Connection failed [IP: 203.178.132.80 80]
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

この場合、下記のコマンドを実行してからインストールを再実行するとうまくいきました。
sudo apt-get update --fix-missing

参考:
Raspberry Pi 3に最新のNode.jsをインストールする
Node.jsとnpmをアップデートする方法

Lチカする方法

プログラムの作成

適当な場所にgpioを操作するプログラムを作成します。
mkdir ~/draft_projects
cd ~/draft_projects
vi gpio_led.js

14番ピンに接続されたLEDの1秒点灯、1秒消灯を5回繰り返すプログラムです。
~/draft_projects/gpio_led.js
var fs = require('fs');

var gpio_dir = '/sys/class/gpio/';
var led_pin_num = 14;
var gpio_led_path = gpio_dir + 'gpio' + led_pin_num;

var is_led_on;
var led_on_counter = 0;
var finish_led_on_count = 5;

// export setting
fs.writeFileSync( gpio_dir + 'export', led_pin_num );

// direction setting
fs.writeFileSync( gpio_led_path + '/direction', 'out' );

console.log('finished setting');

// init led
fs.writeFileSync( gpio_led_path + '/value', 1 );
is_led_on = false;

// turn off led after 1 sec
var blink = setInterval(function(){
  if ( led_on_counter >= finish_led_on_count ) {
    fs.writeFileSync( gpio_dir + 'unexport', led_pin_num );
    clearInterval(blink);
    console.log('finished.');
    return;
  }

  if ( is_led_on ) {
    fs.writeFileSync( gpio_led_path + '/value', 1 );
    is_led_on = false;
    led_on_counter ++;
    console.log('turn on');
  } else {
    fs.writeFileSync( gpio_led_path + '/value', 0 );
    is_led_on = true;
    console.log('turn off');
  }
}, 1000);

LEDを設置

gpioで操作するLEDを設置します。
今回利用するのはraspberry pi B+なので、下記のように配線します。

gpioで操作していなくても、電流が流れているからか、ぼんやりLEDが光ります。


プログラムの実行

LEDの配線とプログラムのコーディングが済んだら、下記のコマンドでプログラムを実行します。
cd ~/draft_projects
sudo node gpio_led.js

うまくいくとLEDが5回点滅します。


実行時に下記のようなエラーが表示された場合、書き込み対象のパスが開かれたままになっている可能性があります。
fs.js:786
    return binding.writeBuffer(fd, buffer, offset, length, position);
                   ^

Error: EBUSY: resource busy or locked, write
    at Error (native)
    at Object.fs.writeSync (fs.js:786:20)
    at Object.fs.writeFileSync (fs.js:1343:24)
    at Object. (/home/pi/mabee/led_test.js:12:4)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.runMain (module.js:604:10)

この場合、下記のコマンドでピンをunexportすると、動作するようになります。
echo 14 > /sys/class/gpio/unexport

参考:
プログラム作成の参考にしました。
http://qiita.com/koki_cheese/items/a4555d6ec3a32273cf36
https://ics.media/entry/10547/2

gpioのピン一覧です。
https://www.raspberrypi.org/documentation/usage/gpio-plus-and-raspi2/


以上です。
何かの参考になれば嬉しいです。

更新履歴

2016/10/25
nodejsのインストールを、apt-get、npm、nを利用する方法に変更しました。
2017/07/15
sudoでnodeのバージョンが異なる場合、の対処法にターミナルの再起動を追加しました。

0 件のコメント :