Raspberry PiのGPIOをmod_mrubyで操作してブラウザからLEDを光らせてみた

前回の記事では、Raspberry Pi上でmod_mrubyを動作させることに成功しました。やはり次はマイコンボードらしく、GPIOを操作してLEDを光らせてみましょう。

しかし、普通に光らせても面白くないので、mod_mrubyを使ってブラウザからLEDを光らせてみました。

ちなみに、無線LAN化も試してみました。以下はその時の写真です。

IMG_1764

 

準備

まずは、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

 

実際にアクセスしてみると、きちんと光ました!

IMG_1765

わーい、これでブラウザから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モジュールを作ってみんなも遊んでみませんか?