LoginSignup
0
2

More than 5 years have passed since last update.

Mojolicious x RaspberryPiでコンパクトにIOT試作をする

Last updated at Posted at 2017-01-22

はじめに

先日、perl入学式 in大阪 第五回へ行ってきた。
内容はperlのMojoliciousというwebアプリケーションフレームワークを使って、掲示板を作ってみようというもの。
そこで実際にMojoliciousを使ってみて、RaspberryPiでIOTする上で自前のwebアプリ制作に使えそうだ、という気分になったので、とりあえず簡単なものを作ってみた。
なお、成果物をまるっと紹介したいだけなので、ライブラリのインストールや、ラズパイのセッティング等は割愛している。

Why Mojolicious??

なぜ、MojoliciousがRaspberryPiでIOTするのに良さそうと思ったかは以下の通り

  • linuxの素のシステムパールでさくっと動く
  • 一つのperlスクリプトを書くだけでwebアプリが完結する
  • webサーバアプリケーション本体を内蔵している
  • その気になれば完成度の高いものも作れる
  • webiopiのように全て用意されてしまっていないので、自由に作れる

環境

  • サーバ
    • RaspberryPi3
    • OS
    • Raspbian jesse(debian系のlinux)
  • perl
    • Raspbian内蔵のシステムperl
  • Mojolicious
    • ver.7.20
  • ブラウザ
    • safari

 ブラウザでLチカするだけの試作

できた。

mojo_led.gif

ざっとMojoliciousのDocを読んで目に付いたのがこれだけだったので、まさかのラジオボタン。
ともかくブラウザで入力した情報を'POST'でサーバへ送って、それを元にサーバのアプリケーションで電子回路を制御する、というIOTっぽい基本的な流れを作れたのでよしとする。

ハード

ただledを光らせたいだけなのでこれだけでOK。
Rpi_led.png
アノード側にGPIOを接続している。

ソフト

とりあえずwebアプリ側をperl x Mojoliciousで、電子回路制御アプリ側をpythonで用意した。
HTMLはperlスクリプトの__DATA__セクションに記述できるようになっているので、今回はこの2ファイルのみで実装できる。

以前に同じような試作をした時は、HTML, JavaScript, PHPのリソースを一式用意して、apacheに乗せてサーバを立ち上げて...とかなり手間と時間がかかったので拍子抜けするくらいシンプルで楽にできてしまった。

Mojo_IOT

#!/usr/bin/env perl
use utf8;
use Mojolicious::Lite;


my $led ="";

get '/' => sub {
    my $c = shift;
    $c->render(template => 'index');
};

post '/post' => sub {
    my $c = shift;
    $led = $c->param('led');
    `python mojoIOT_led.py $led`;
    $c->redirect_to('/');
};

app->start;

__DATA__

@@ index.html.ep
% layout 'default';
% title 'IN';

%= form_for '/post' => method => 'POST' => begin
    LED<br>
    on
    %= radio_button 'led' => '1'
    off
    %= radio_button 'led' => '0', checked => 'checked'
    %= submit_button 'send'
% end

@@ layouts/default.html.ep
<!DOCTYPE html>
<html>
    <head>
        <title><%= title %></title>
    </head>
    <body>
        <%= content %>
    </body>
</html>
  • webアプリ側でやっていること
    • POSTでラジオボタンから値('1' or '0')を取得して変数へ格納し、それを起動引数として下記のpythonスクリプトを実行
    • その他タイトルや文字列の表示

mojoIOT_led.py

#!/usr/bin/python

import RPi.GPIO as GPIO
import sys

gpio1 = 18
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(gpio1,GPIO.OUT)

args = sys.argv

if args[1] == '1' :
    GPIO.output(gpio1, GPIO.HIGH)
else :
    GPIO.output(gpio1, GPIO.LOW)
  • 電子回路制御アプリでやっていること
    • コマンドライン引数を取得し、値に応じてGPIOへhigh/lowの信号を出力する

サーバの起動

Mojolicious内蔵のサーバで起動する。
$morbo MojoIOT
デフォルトのポートは:3000なので、あとは好きにlocalhostなり、ローカル,
グローバルにアクセスしてブラウザから操作すればOK。

 まとめ・TODO 

  • まとめ
    • ハード側の開発に時間をかけて、それを利用するweb側をさくっとやっつけたい、でも後々はそれなりのアプリにできたらしたい、みたいな人にはMojoliciousは良さそうだなと思った
  • TODO
    • いまいちMojoliciousのDocを読み切れていなくチープな実装になっているので、もう少しweb系のテクニックの習得合わせてしっかりとした実装にしたい
    • 制作しているIOTなマシンに実際に使っていきたい
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2