Experience IoT through Node.js

Node.jsでRaspberry Piを制御しよう

Raspberry Pi + Node.jsでIoTを体験しよう〈Node.jsシリーズ vol.5〉

Node.jsシリーズもいよいよ上級編。

今回からは、小型ワンボードコンピュータ「Raspberry Pi」を組み合わせ、いま流行りの「IoT」をNode.jsで実現してしまおうと思います。

IoT(Internet of Things)とは

IoTとは「Internet of Things」の略で、直訳すると「モノのインターネット」となります。

これまでパソコンやスマートフォンを経由して接続するものだったインターネットを身の回りの他の機器に直接つなぎ、これまでになかった機能を実現してしまおうというものです。

とはいえ、これまで通信機能を持っていなかった機器にいちからインターネット接続の機能を持たせるためには専門的なハードウェアの知識が必要。なかなか手軽にチャレンジできるものではありませんでした。

そんななか登場したのが、Raspberry Piです。

Raspberry Piとは

Raspberry Piとは、イギリスのRaspberry Pi Foundationによって開発されているワンボード型の超小型コンピュータです。

ARMと呼ばれる組み込みコンピュータ用のマイクロチップを搭載しており、さまざまな電子部品を直接制御することができます。

画期的なのは、最初からUSBと有線LAN端子がついていて、インターネットに接続する機能がついていたこと。そして、LinuxベースのOSが無料配布されていること。

これによって電子部品を直接ネットワーク上から制御したり、逆に電子部品の動作をトリガーにしてインターネット上にデータを送ったりすることができるのです。

2015年8月現在の最新モデルは「Raspberry Pi 2 Model B」で、Amazonなどでも気軽に購入することができます。

Raspberry Pi + Node.jsで「Twitter通知ランプ」をつくる

今回は、このRaspberry PiにNode.jsをインストールし、LEDを接続し、以前作ったTwitter通知アプリケーションをベースにした、Twitterでメンションを送るとLEDが点灯するシステム を作ってみたいと思います。

まずは以下を用意します。

  • Raspberry Pi 2 Model B
  • microSDカード(本体にセットし、記憶領域として使用します)
  • 有線LAN
  • Raspberry Pi 電子工作キット(Amazonなどで検索すると色々出てきます)
    • LED
    • ブレッドボード(LEDとRaspberry Piをつなぐ役目をする装置です)
    • ジャンパーワイヤx2(Raspberry Piとブレッドボード、LEDをつなぐケーブルです)

それぞれ電子工作の専門用語が出てきますが、今回は割愛します。気になる方は調べてみてください。

Raspberry Piのセットアップ

Raspberry Piをセットアップし、ネットワーク上からSSH接続します。 詳しい手順については、こちらも割愛します。筆者は以下の資料を参考にしました。

周辺機器などのセットアップまわり

OS(Raspbian)のインストールまわり

日本語環境のセットアップまわり

※注意 2015年8月現在で参照した情報です。時期によっては古くなっている場合があります。

Raspberry PiにNode.js環境をインストールする

インストールには、Raspberry PiをはじめとするARM環境用のインストーラーNodejs-ARM-builder を使います。

$ wget http://node-arm.herokuapp.com/node_latest_armhf.deb$ sudo dpkg -i node_latest_armhf.debで最新版がインストールされます。

$ node -vで最新バージョンであることを確認しましょう。

また、これからの操作にはsudo権限が必要なので$ sudo ln -s /opt/node/bin/node /usr/bin/node$ sudo ln -s /opt/node/bin/npm /usr/bin/npmとして、シンボリックリンクを作成しましょう。

これで、Raspberry Pi上にNode.js環境が出来上がりました。次はいよいよコードです。

Node.jsでRaspberry PiのGPIO(汎用入出力)を操作する

Node.jsのインターフェースを使い、Raspberry Pi上の制御インターフェースであるGPIO(General Purpose Input / Output:汎用入出力) を制御します。

制御……と聞くと思わず身構えてしまいますが、その仕組はとても簡単。Raspberry Piのプロセッサから伸びた数十個のピンのスイッチをオン/オフするだけです。

0と1、究極のデジタルですね。

LEDを点灯させるだけのプログラム

試しに、接続したLEDを光らせるだけのプログラムを作ってみましょう。

Raspberry PiのGPIOの21番ピンをONにし、ピンに刺したLEDに通電させて光らせます。
GPIOのピンの対応表についてはRaspberry Piに紙の対応表が添付されていますので、そちらを参照してください。

led_on.js

1
2
3
4
5
6
var fs = require('fs'); // fsモジュールを読み込み

fs.writeFileSync('/sys/class/gpio/export', 21); // 21番ピンを補足
fs.writeFileSync('/sys/class/gpio/gpio21/direction', 'out'); // 21番ピンを「出力先」に設定
fs.writeFileSync('/sys/class/gpio/gpio21/value', 1); // 21番ピンに「1(ON)」の信号を送る
fs.writeFileSync('/sys/class/gpio/unexport', 21); // 21番ピンを解放

Node.jsでは、ピンのON/OFFはファイルの入出力と同じようにして扱います。

$ node led_on.jsで起動するとLEDが点灯するはずです。

TwitterでメンションされたらLEDを点灯する

さて、次はこれを改良して、Twitterでリプライを受け取ったらLEDを点灯するプログラムを書いてみましょう。
今回はよりわかりやすくするために、[ON]というツイートがメンションされたらLEDを点灯するようにしましょう。

以前作成したTwitter通知アプリケーションのコードを改良します。

前もって、npm install twitterでnpmのtwitterモジュールをインストールしておきます。

twitter_led_notice.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var twitter = require('twitter'); // twitterモジュールを読み込み
var fs = require('fs'); // fsモジュールを読み込み

// アプリ登録時に取得したkeyを入れて初期化
var client = new twitter({
  consumer_key: '【Consumer Keyの内容】',
  consumer_secret: '【Consymer Secretの内容】',
  access_token_key: '【Access Token Keyの内容】',
  access_token_secret: '【Access Token Secretの内容】'
});

// タイムラインから、自分のアカウント名を含む文字列でフィルターする
client.stream( 'statuses/filter', { track : '@【アカウント名】' }, function( stream ) {
    // フィルターされたデータを取得する
    stream.on( 'data', function( data ) {
        var text = data.text;

        // [ON]を含むツイートを見つけたら起動する
        var isMatch = /\[ON\]/.test(text)
        if ( isMatch ) {
            // Raspberry Piの21番ポートを出力に設定
            fs.writeFileSync('/sys/class/gpio/export', 21);
            fs.writeFileSync('/sys/class/gpio/gpio21/direction', 'out');

            // Raspberry Piの21番ポートを「1(オン)」にする
            fs.writeFileSync('/sys/class/gpio/gpio21/value', 1);

            // Raspberry Piの21番ポートを解放する
            fs.writeFileSync('/sys/class/gpio/unexport', 21);
        }
    });
});

出来上がったら$ sudo node twitter_led_notice.jsで起動して待機状態にします。

自分宛に[ON]とメンションしてみましょう。

すると……

光りました!

これで、「自分宛てにメンションされるとLEDが点灯するシステム」が完成しました。

次回は、センサーも駆使して、よりインタラクティブな仕組みを作ってみます。

Tech Blog

(編集部)

株式会社リクルートライフスタイルのTech Blog編集部です。いま流行りのTechネタやちょっと使えるTipsなどをお届けしていきます。

NEXT