株式会社インデペンデンスシステムズ横浜

システム開発エンジニアの西田五郎が運営しております。新規開発案件のご依頼をお待ちしております。

*

Node.jsでRaspberryPiのGPIOを使う(その2)ブラウザからの操作

      2015/03/05

Node.jsでRaspberryPiのGPIOを使うの2回目です。前回はGPIOのデバイスドライバをNode.jsのファイル操作を使って操作しました。今回はこれを以下の記事で作成したWebサーバ的なプログラムに組み込んでブラウザからLEDを操作出来るようにしてみました。
Raspberry PiでのNode.jsの導入(その2)Webサーバ的なプログラム

以下のような簡単な回路をブラウザから操作します。
IMG_0286

ブラウザのスクリーンショットです。ここからLEDを操作します。
0001

(あと一応静的なHTMLファイルも用意しました。main.htmlのファイル名です。上記のプログラム(URL)にアクセスします。)
0001

使い方はファイル一式のディレクトリからルート権限でNode.jsでindex.jsを起動します。ブラウザから、http://ホスト名またはIPアドレス:8888/ledgpio21 を指定します。そうすると上のLEDの状態を表示していてボタンが表示された状態になります。

ここでLED ONまたはLED OFFのボタンで処理をします。エラー処理は組み込んでいないので正常に接続されていればLEDが操作出来るということでご了承頂ければと思います。

プログラムの説明です。ここではこのGPIOの処理の部分だけの説明を書きます。その他の説明は以下の記事を参照して下さい。
Raspberry PiでのNode.jsの導入(その2)Webサーバ的なプログラム

今回のプログラム全体は以下からダウンロード出来ます。(※テスト的なプログラムです。一切無保証ということをご了承下さい。)
GPIOのプログラム一式

function ledgpio21(response, request) {
	console.log("Request handler 'ledgpio21' was called.");

	//HTMLの出力
	response.writeHead(200, header);
	response.write('<!DOCTYPE html>');
	response.write('<html lang="ja">');
	response.write('<head>');

	response.write('<meta charset="utf-8">');
	response.write('<title>Raspberry Pi GPIO</title>');
	response.write('<meta name="description" content="">');
	response.write('<meta name="keywords" content="">');

	response.write('<link rel="stylesheet" href="main.css">');
	response.write('</head>');
	response.write('<body>');

	response.write('<div id="header">');
	response.write('Node.jsでのLED ON/OFFのテスト');
	response.write('</div>');

	response.write('<div id="content">');
	
	//パラメータの取得
	var url = require('url');
	var fs = require('fs');

	var url_parts = url.parse(request.url, true);
	var query = url_parts.query;

	//console.log(query.sw);

	//GPIO初期化
	fs.writeFileSync('/sys/class/gpio/export', 21);
	fs.writeFileSync('/sys/class/gpio/gpio21/direction', 'out');

	//パラメータが指定されていたらON/OFFの処理
	if(typeof query.sw !== "undefined"){ 

		//console.log(query.sw);

		if(query.sw == '1'){
			fs.writeFileSync('/sys/class/gpio/gpio21/value', 1);
		}
		else{
			fs.writeFileSync('/sys/class/gpio/gpio21/value', 0);
		}
	}

	//値の読み込み
	var value = fs.readFileSync('/sys/class/gpio/gpio21/value','ascii');

	if(value == 1){
		response.write('<p>LEDはONです</p>');
	}
	if(value == 0){
		response.write('<p>LEDはOFFです</p>');
	}

	//GPIOの終了処理
	fs.writeFileSync('/sys/class/gpio/unexport', 21);

	//HTMLの出力
	response.write('<input type="button" onclick="location.href=\'ledgpio21?sw=1\'" value="LED ON">');
	response.write('&nbsp;&nbsp;<input type="button" onclick="location.href=\'ledgpio21?sw=0\'" value="LED OFF">');

	response.write('</div>');
	response.write('</body>');
	response.write('</html>');

	response.end();
}

申し訳ありませんが本当にテスト的なプログラムです。前回書いたファイル操作でデバイスドライバを扱う処理と画面表示と全て一括で書いています。sw=1またはsw=0のパラメータを解析してON/OFFの操作を行っています。毎回書いていますが、21は例です。他のGPIOを使う場合はその番号を指定する必要があります。LEDを接続した状態で、on/offが確認出来ました。Raspberry Piをwifiに接続して同じネットワークからiPad miniでも操作出来ました。

ここでは単純にMVC一括で書きましたがフレームワーク等もありますので、MVCの形で書くことも出来るかと思います。あと私自身としては、Javascriptらしいプログラミングというのも課題かと思っています。いずれにしても、軽いという意味ではRaspberry Piではメリットとなると思うのでNode.jsはまた使ってみたいと思います。今回はここまでです。


 - Node.js, Raspberry Pi

AdSense

AdSense

  関連記事

Raspberry Piでタッチアプリ開発(その3)Kivyでレイアウト・ボタン作成

Raspberry Piでタッチアプリ開発の3回目です。前回はKivyの導入につ …

Raspberry Piでwifiに接続する

Raspberry Pi(Raspbian)でwifiを使って無線LANに接続し …

Raspberry PiでIoT(MQTTで遠隔操作編 その1)MQTTでの通信

Raspberry PiでIoTのMQTTで遠隔操作編のシリーズを始めます。実際 …

Raspberry PiでのNode.jsの導入(その2)Webサーバ的なプログラム

Raspberry PiでのNode.jsの導入の2回目です。前回はインストール …

Raspberry PiでIoT(温度・湿度・気圧データ編 その2)Webサーバ側構築とデータ送信

Raspberry PiでIoT 温度・湿度・気圧データ編の2回目です。前回はR …

Raspberry PiでIoT(MQTTで遠隔操作編 その4)Raspberry PiのGPIOとHeroku連動Pub編

Raspberry PiでIoT MQTTで遠隔操作編の4回目です。2台のRas …

Raspberry PiでIoT(温度・湿度・気圧データ編 その4)アラートメール送信

Raspberry PiでIoT 温度・湿度・気圧データ編の4回目です。前回まで …

Raspberry Piでタッチアプリ開発(その4)ボタンとGPIOの連動

Raspberry Piでタッチアプリ開発の4回目です。前回作成したレイアウトと …

Raspberry PiでAvahi を使ってホスト名でアクセスする

Raspberry PiでAvahiを使ってホスト名でのアクセスを可能にする方法 …

ASP.NET Web APIでデータ蓄積(その7)Raspbery Piからの温度データ蓄積

ASP.NET Web APIでデータ蓄積の7回目です。前回までで少なくとも温度 …