JavaScriptでLEDを制御しよう!

ここからはRaspberry Pi上での作業になります。Raspberry PiでNode.jsが使用できる環境を用意し、LEDを制御するためのJavaScriptのコードを書いていきましょう。

1. Node.jsのインストール

Node.jsを使用できるように環境を整えます。Raspberry Piでターミナルを起動させ、以下のコマンドでNode.jsのLTS版(長期サポート版)v4.2.4をダウンロードします。

wget https://nodejs.org/dist/v4.2.4/node-v4.2.4-linux-armv7l.tar.gz

ダウンロードした圧縮ファイルを解凍させます。

tar -xvf node-v4.0.0-linux-armv7l.tar.gz

解凍したフォルダの中身をすべて/usr/local/に移動させます。これでNode.jsが使用できる状態になります。

sudo cp -R node-v4.2.4-linux-armv7l/* /usr/local/

nodeコマンドが使用できるか確認しておきましょう。

node -v

正しくv4.2.4とバージョンが表示されたらNode.jsの準備は完了です。Lチカの為の準備が整いました。

2. JavaScriptのコードを作成しよう

つぎにコードからGPIOピンを制御し、LEDを1秒毎に点滅させ、10回点滅したら停止させてみます。以下のようなコードをmain.jsファイルとして用意します。

var fs = require('fs');

var isOn = false;   // 点灯しているかどうか
var count = 0;      // 点灯した回数
var maxCount = 10;  // 点滅させる回数

// 8番のGPIOピンを出力として登録
fs.writeFileSync('/sys/class/gpio/export', '8');
fs.writeFileSync('/sys/class/gpio/gpio8/direction', 'out');

// 1秒毎にオンとオフを切り替える
var blink = setInterval(function() {

  if(count == maxCount) {
    // GPIOピンを開放
    fs.writeFileSync('/sys/class/gpio/unexport', '8');
    // インターバルを終了
    clearInterval(blink);
    return;
  }

  if(isOn) {
    // LEDをオフ
    fs.writeFileSync('/sys/class/gpio/gpio8/value', '0');
    isOn = false;
  } else {
    // LEDをオン
    fs.writeFileSync('/sys/class/gpio/gpio8/value', '1');
    isOn = true;
    count++;
  }

}, 1000);

GPIOピンの制御はファイルへの文字列の書き込みを通して行われます。Node.jsでファイルへの書き込みをする場合はwriteFileSync()メソッドを使用します。それではGPIOピンに関連したコードを順に説明していきます。

使用するGPIOピンを登録
fs.writeFileSync('/sys/class/gpio/export', '8'); // 使用するピンとして8番を登録

/sys/class/gpio/export8を書き込みGPIOの8番ピンを使用することをRaspberry Piに伝えます。すると/sys/class/gpio/gpio8というファイルが自動的に生成されます。

出力か入力かを指定
fs.writeFileSync('/sys/class/gpio/gpio8/direction', 'out'); // 8番を出力に変更

/sys/class/gpio/gpio8/directionoutinを書き込み、8番ピンが出力用か入力用かを指定します。今回はLEDを点滅させるのでoutを指定します。

ON/OFFを指定
fs.writeFileSync('/sys/class/gpio/gpio8/value', '1'); // 8番に電流を流す
fs.writeFileSync('/sys/class/gpio/gpio8/value', '0'); // 8番の電流を止める

/sys/class/gpio/gpio8/value10を書き込み、8番ピンに電流を流すかどうかを指定します1を設定すると入力電圧が3.3Vになり、0に設定すると0VになるためLEDのONとOFFを制御することができます。

GPIOピンを開放する
fs.writeFileSync('/sys/class/gpio/unexport', '8'); // 8番を開放する

使用が済んだピンは必ず開放する必要があります/sys/class/gpio/unexport8を書き込むことでRaspberry Piに8番の開放を伝えます。すると/sys/class/gpio/gpio8が削除され8番ポートの登録は解除されます。今回のデモの場合は10回点滅が終了した時点で開放を行っています。

3. 実行

それでは以下のコマンドでjsファイルを実行してみましょう。

sudo node main.js

冒頭の動画のようにLEDが点滅していれば成功です。

最後に

スクリーンの中だけで完結していたJavaScriptの世界が、Raspberry Piを使用することで、スクリーンの外まで広げLチカさせることができました。本サイトではArduinoでのLチカの方法も記事「JavaScriptでArduinoをコントロール ― Lチカさせてみよう!」で解説しています。Raspberry PiとArduinoを連携させる事もできるので、あわせてArduinoについて学んでおくと面白いと思います。

今回は電子工作の基本であるLチカを紹介しましたが、スイッチやセンサーなどをNode.jsで制御する事で、より世界を広げることもできます。是非Lチカで終わらず、Raspberry Piで電子工作の次のステップを学んでみてはいかがでしょうか。