Node.jsでラズパイに接続したLEDを点灯、消灯させる(Lチカ)

とりあえず、HelloWorld的なLチカ(LEDの点灯・消灯)をNode.jsでやってみたのでメモ

# 参考

+ [Raspberry Pi 2 GPIO のＬチカテスト Node.jsでもやってみる](http://ngw.jp/~tato/wp/?p=3375)

# 環境

+ ラズパイ3
+ LED。順電圧2V〜2.6V、順電流20mA
+ 100Ωの抵抗
+ オスメスのジャンパー線x2

配線などは本やブログなどに色々書かれていると思うのでそちらを参照ください。

# bashでLEDのON/OFFをしてみる

GPIO4を使ってON/OFFする場合は以下で実施できることを事前に確認します。
やってることは以下です。

+ GPIO4の仮想ファイル作成
+ 作成されたGPIO4の仮想ファイルにGPIO4は出力信号として利用することを宣言(スイッチなどの入力を受け取る場合には入力信号)
+ GPIO4に1(ON)、0(OFF)の信号を流す
+ GPIO4の仮想ファイルを削除

```bash
$sudo su

#最初の状態
$ls -la /sys/class/gpio/
合計 0
drwxrwx---  2 root gpio    0  4月  1 22:17 .
drwxr-xr-x 50 root root    0  4月  2 07:41 ..
-rwxrwx---  1 root gpio 4096  4月  1 22:17 export
lrwxrwxrwx  1 root gpio    0  4月  1 22:17 gpiochip0 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpiochip0
lrwxrwxrwx  1 root gpio    0  4月  1 22:17 gpiochip100 -> ../../devices/platform/soc/soc:virtgpio/gpio/gpiochip100
-rwxrwx---  1 root gpio 4096  4月  1 22:17 unexportを確認

# GPIO4を使うようにする
$echo 4 > /sys/class/gpio/export

# GPIO4の制御ができる仮想ファイルが作成される
$ls -la /sys/class/gpio/
合計 0
drwxrwx---  2 root gpio    0  4月  2 07:44 .
drwxr-xr-x 50 root root    0  4月  2 07:41 ..
-rwxrwx---  1 root gpio 4096  4月  2 07:44 export
lrwxrwxrwx  1 root gpio    0  4月  2 07:44 gpio4 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio4
lrwxrwxrwx  1 root gpio    0  4月  1 22:17 gpiochip0 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpiochip0
lrwxrwxrwx  1 root gpio    0  4月  1 22:17 gpiochip100 -> ../../devices/platform/soc/soc:virtgpio/gpio/gpiochip100
-rwxrwx---  1 root gpio 4096  4月  1 22:17 unexport

# GPIO4を出力信号として利用することを書き込む
$echo out > /sys/class/gpio/gpio4/direction

# ONさせる
$echo 1 > /sys/class/gpio/gpio4/value

# OFFさせる
$echo 0 > /sys/class/gpio/gpio4/value

# GPIO4の仮想ファイルを削除
$echo 4 > /sys/class/gpio/unexport

# 仮想ファイルが消える
$ls -la /sys/class/gpio/
合計 0
drwxrwx---  2 root gpio    0  4月  2 08:29 .
drwxr-xr-x 50 root root    0  4月  2 07:41 ..
-rwxrwx---  1 root gpio 4096  4月  2 07:44 export
lrwxrwxrwx  1 root gpio    0  4月  1 22:17 gpiochip0 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpiochip0
lrwxrwxrwx  1 root gpio    0  4月  1 22:17 gpiochip100 -> ../../devices/platform/soc/soc:virtgpio/gpio/gpiochip100
-rwxrwx---  1 root gpio 4096  4月  2 08:29 unexportァイルが消える
```

# Nodebewを使ってnodeとnpmをインストールする

Nodeは最初からインストールされていましたが、古いしnpmもないので別途nodeberwを使ってnodeとnpmをインストールします。

```bash
$curl -L git.io/nodebrew | perl - setup
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0
100 24322  100 24322    0     0   8629      0  0:00:02  0:00:02 --:--:--  8629
Fetching nodebrew...
Installed nodebrew in $HOME/.nodebrew

========================================
Export a path to nodebrew:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================

# export文を追記
$vi ~/.bashrc

# 反映
$source ~/.bashrc

# 確認
$nodebrew help

# stableをインストール
$nodebrew install-binary stable

# デフォルトを設定
$nodebrew alias default v5.10.0

# デフォルトを利用
$nodebrew use default

# 確認
$node -v
v5.10.0

$npm -v
3.8.3
```

# Node.jsを使ってやってみる

sleep処理は以下を使います。なお、こちらはデバッグ用でevent loopを停止させているらしいのでプロダクションとかでこれを使うのはダメっぽいので注意です。

[erikdubbelboer/node-sleep](https://github.com/ErikDubbelboer/node-sleep)


sleepを使うためにインストールします。

```bash
$npm install sleep
```

終わったら以下のようなコードを書いて確認してみます。

```led.js
var fs = require('fs');
var sleep = require('sleep');
var pin = 4;

// setup
console.log("setup");
fs.writeFileSync('/sys/class/gpio/export', pin);
fs.writeFileSync('/sys/class/gpio/gpio' + pin + '/direction', 'out');

// on
fs.writeFileSync('/sys/class/gpio/gpio' + pin + '/value', 1);
sleep.sleep(5);

// off
fs.writeFileSync('/sys/class/gpio/gpio' + pin + '/value', 0);

// teardown
console.log("teardown");
fs.writeFileSync('/sys/class/gpio/unexport', pin);
```

実行してみます。
`/sys/class/gpio/gpio4/`配下への書き込み権限がpiユーザーはなかったのでsudoで実行しています。

```bash
$sudo node led.js
```
成功すればLEDが5秒間点灯後、消灯できます。