前回の記事では、Raspberry Pi上でmod_mrubyを動作させることに成功しました。やはり次はマイコンボードらしく、GPIOを操作してLEDを光らせてみましょう。
しかし、普通に光らせても面白くないので、mod_mrubyを使ってブラウザからLEDを光らせてみました。
ちなみに、無線LAN化も試してみました。以下はその時の写真です。
準備
まずは、mrubyでGPIOを操作するために、mruby-WiringPiとmruby-sleepをmrbgemとしてmrubyに組み込みます。
以下のようなbuild_config.rbになります。
[program lang=’ruby’ escaped=’true’]
MRuby::Build.new do ¦conf¦ conf.cc = ENV['CC'] ¦¦ 'gcc' conf.ld = ENV['LD'] ¦¦ 'gcc' conf.ar = ENV['AR'] ¦¦ 'ar' conf.cflags << (ENV['CFLAGS'] ¦¦ %w(-g -O3 -Wall -Werror-implicit-function-declaration)) conf.ldflags << (ENV['LDFLAGS'] ¦¦ %w(-lm)) conf.gem :git => 'https://github.com/akiray03/mruby-WiringPi.git' conf.gem :git => 'https://github.com/matsumoto-r/mruby-sleep.git' end
[/program]
そして、mrubyをリビルドして、mod_mrubyに組み込みます。組み込み方は前回の記事を参考にして下さい。
mod_mrubyの設定とRubyスクリプトを書く
mod_mrubyの設定は以下のようにしました。リクエストコンテンツ処理直前のFixups当たりでフックします。
[program lang=’apache’ escaped=’true’]
LoadModule mruby_module modules/mod_mruby.so mrubyFixupsMiddle "/usr/local/apache/htdocs/led.rb"
[/program]
そして、実際にフックさせるmrubyスクリプトは以下です。
[program lang=’ruby’ escaped=’true’]
r = Apache::Request.new io = WiringPi::GPIO.new pin = 7 if r.uri == "/led/on" io.write(pin, WiringPi::HIGH) Apache.return 200 elsif r.uri == "/led/off" io.write(pin, WiringPi::LOW) Apache.return 200 elsif r.uri == "/led/flash" 5.times do ¦v¦ io.write(pin, WiringPi::HIGH) Sleep::sleep 1 io.write(pin, WiringPi::LOW) Sleep::sleep 1 end Apache.return 200 else Apache.return Apache::DECLINED end
[/program]
ブラウザからLEDを操作してみる
上記のようにmod_mrubyでApacheモジュールを作り、以下のようにアクセスします。
LEDをONにしたい場合
http://192.168.0.10/led/on
LEDをOFFにしたい場合
http://192.168.0.10/led/off
LEDを点滅(5回)したい場合
http://192.168.0.19/led/flash
実際にアクセスしてみると、きちんと光ました!
わーい、これでブラウザからGPIOが操作し放題です。
今後
mod_mruby経由でブラウザからRaspberry PiのGPIOを操作することに成功しました。
今度は、この技術を応用して、
http://192.168.1.10/エアコン/on
http://192.168.1.10/エアコン/off
http://192.168.1.10/温度/摂氏
http://192.168.1.10/温度/摂氏/tweet
http://192.168.1.10/ルンバ/on
http://192.168.1.10/ウォシュレット/ノズルクリーン
などなど夢が広がリングです!mod_mrubyで簡単にApacheモジュールを作ってみんなも遊んでみませんか?