とりあえず、HelloWorld的なLチカ(LEDの点灯・消灯)をNode.jsでやってみたのでメモ
参考
環境
- ラズパイ3
- LED。順電圧2V〜2.6V、順電流20mA
- 100Ωの抵抗
- オスメスのジャンパー線x2
配線などは本やブログなどに色々書かれていると思うのでそちらを参照ください。
bashでLEDのON/OFFをしてみる
GPIO4を使ってON/OFFする場合は以下で実施できることを事前に確認します。
やってることは以下です。
- GPIO4の仮想ファイル作成
- 作成されたGPIO4の仮想ファイルにGPIO4は出力信号として利用することを宣言(スイッチなどの入力を受け取る場合には入力信号)
- GPIO4に1(ON)、0(OFF)の信号を流す
- GPIO4の仮想ファイルを削除
$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をインストールします。
$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を停止させているらしいのでプロダクションとかでこれを使うのはダメっぽいので注意です。
sleepを使うためにインストールします。
$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で実行しています。
$sudo node led.js
成功すればLEDが5秒間点灯後、消灯できます。