ラズベリーパイのGPIOを、Node.jsで操作してLED光らせてみた!
前々から、ラズベリーパイのGPIOをJavaScriptでいじりたかったのですが、いろいろ試行錯誤した結果、Node.jsを使うことにしました。
と言っても、ガッツリNode.jsを知らなくても大丈夫で、今回は非常にシンプルなコードしか使いません。(ファイルシステムをチョコっと使うくらい…)
事前準備!
今回、用意するのは…、
- ラズベリーパイ本体
- ジャンパーワイヤ(オスメス用)2本
- LED1個
- ブレッドボード1台
となっています。
(参考)
ラズベリーパイ「電子工作入門キット」|Amazon
あと、私のラズパイ環境なのですが、Google製の「Coder」を導入して、SSH接続でMacbookのターミナルから無線LANで操作しています。
(参考)
参考:「Coderを使って、ラズパイをSSH接続!」
もし、同じように進めたい場合は、上記リンクを参考にしてみてください。
ただ、特殊な環境ですが、Node.jsで操作する方法は、基本的には普通のラズベリーパイと同じことをするので、無理に合わせなくても問題ありません。
本題の「Node.js」に関しては、Coderを使っていれば一緒にインストールされているのですが、自分でインストールする場合は、以下のリンクを参考にしてみてください。
(参考)
「Node.jsの準備」|うえぶまなぶ
LEDを光らせる基本操作!
まずは、ターミナル上でラズパイのファイルを直接操作して、LEDを光らせてみたいと思います。
予備知識として、LEDは「アノード(足が長い)」から「カソード(足が短い)」へ電流が流れるという点に注意しましょう。
そして、今回は25番ピンから電気が流れて、LEDが点灯しながらGNDへ抜けていくようになっています。
イラストにすると、こんな感じ!
(参考)
「ラズベリーパイGPIO図」
LEDを光らせるために、まずはラズパイのターミナル上から直接ファイルを操作したいと思います。
ファイルへのアクセス権が必要なので、rootに移動します。
$ sudo su
これで、rootになりました。
次に、以下のコマンドを入力して、25番ピンを「export」します。
$ echo 25 > /sys/class/gpio/export
これで、25番ピンを使えるようになりました。
今回は、25番ピンから電気を出力するので「out」に設定します。
$ echo out > /sys/class/gpio/gpio25/direction
これで、もう準備完了です!
LEDを「ON」にするには、数字の「1」を書き込めばOKです!
$ echo 1 > /sys/class/gpio/gpio25/value
どうですか? 光りましたか?
LEDの「OFF」は、数字の「0」を書き込みます。
$ echo 0 > /sys/class/gpio/gpio25/value
これで消灯になりました。
あとは、上記の方法で「1」と「0」を切り替えれば、LEDが点灯したり消灯したりするわけです。
最後に、終了する時は使ったピンを「unexport」するのを忘れないようにしましょう!
$ echo 25 > /sys/class/gpio/unexport
これでOK!
再度、同じことをしたい場合は、もう一度最初の「export」から実行してみましょう。(最後に、元のユーザーに戻しておきましょう…)
(参考)
rootから元のユーザーに戻すには、「exit」と入力すればOKです。
「Node.js」で光らせてみよう!
それでは、先ほどと同じことを「Node.js」でやってみたいと思います。
ラズパイのターミナル上から、「led.js」というファイルを作成して、以下のようなコードを書いて保存します。(今回はrootにしなくてもOKです…)
1 | var fs = require('fs'); |
あとは、このプログラムを実行すれば良いのですが、内容を少し解説しておきます。
まずは、ファイルを操作する必要があるので、Node.jsの「fs」モジュールを使えるようにしておきます。
var fs = require('fs');
あとは、最初に実行したように、25番ピンを「export」し、出力「out」にしてからLEDの「ON(1)」を実行します。
fs.writeFileSync('/sys/class/gpio/export', 25);
fs.writeFileSync('/sys/class/gpio/gpio25/direction', 'out');
fs.writeFileSync('/sys/class/gpio/gpio25/value', 1);
少し、プログラミングらしいことをしているのは、以下のコードくらいでしょうか。
setTimeout(function(){
fs.writeFileSync('/sys/class/gpio/gpio25/value', 0);
fs.writeFileSync('/sys/class/gpio/unexport', 25);
}, 2000);
今回は、手っ取り早く「setTimeout」を使って、2秒後に中身が実行されるようにしてます。(2秒後にLEDを消灯して25番ピンをunexport)
このプログラムを実行してみます!
$ sudo node led.js
これで、2秒間LEDが点灯して消えます。
ただし、私の環境だと「sudo」が実行できなかったので、実行できるように設定しました。
まず、Node.jsのインストール先を調べます。
$ whereis node
/opt/node/bin/node
環境によって、パスは変わるので適宜読み替えてください…。
最後に、以下のコマンドを実行。
$ sudo ln -s /opt/node/bin/node /usr/bin/node
これで、sudoが実行できるようになり、LEDが光りました!
まとめ
「Node.js」に関しては、ラズパイのGPIOを簡単に操作できるライブラリが多く公開されているので、このあたりを使った方が効率は良いかもしれません。
また、Node.jsを使えば、ブラウザ上からGPIOを操作したりも実現できると思うので、このあたりに関しては、また次回に挑戦したいと思います。
(参考)
「ラズベリーパイ活用記事まとめ」