I2C液晶(2) Webアプリ版

Webブラウザをクライアントとして動作するプログラム、いわゆるWebアプリを動かす場合はPCでWebサーバを走らせておく必要がある。

Raspberry PiでももちろんWebサーバをインストールしてWebアプリを動かす事は可能だが、Pythonには標準で簡易CGIサーバ機能が備わっているので、もっと簡単にWebアプリを試してみる事ができる。

このへんの必要と思われる機能が予め用意されていて、面倒なお膳立ての必要無しに気軽に試せるのがPythonの真骨頂。教育目的で開発されたRaspberry Piには、非常に似合った開発環境だろう。最初からこんな良いモノが使える今の子供たちが、ちょっと羨ましい。

PythonのCGIサーバを起動するには、単にコンソールから

python -m CGIHTTPServer

とだけ入力すれば良い。CGIサーバが起動されて、ブラウザからの接続待ち状態になる。

pi@raspberrypi ~ $ python -m CGIHTTPServer
Serving HTTP on 0.0.0.0 port 8000 …

今回はCGIサーバ起動時に別な処理を行いたいので、起動用のスクリプトを作ってそこから行う。^C(Ctrl+C)でPythonの実行を中断し、作業用のフォルダに移動して以下の起動用ファイルを作成する。ファイル名は CGIServer.py とした。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import CGIHTTPServer
import smbus
import time

# LCD initialize
i2c = smbus.SMBus(1)
addr = 0x3e
contrast = 42   # 0~63
i2c.write_byte_data(addr, 0, 0x38)  # function set(IS=0)
i2c.write_byte_data(addr, 0, 0x39)  # function set(IS=1)
i2c.write_byte_data(addr, 0, 0x14)  # internal osc
i2c.write_byte_data(addr, 0,
                    (0x70 | (contrast & 0x0f))) # contrast
i2c.write_byte_data(addr, 0,
                    (0x54 | ((contrast >> 4) & 0x03)))  # contrast/icon/power
i2c.write_byte_data(addr, 0, 0x6c)  # follower control
time.sleep(0.2)
i2c.write_byte_data(addr, 0, 0x38)  # function set(IS=0)
i2c.write_byte_data(addr, 0, 0x0C)  # Display On
i2c.write_byte_data(addr, 0, 0x01)  # Clear Display
i2c.write_byte_data(addr, 0, 0x06)  # Entry Mode Set
time.sleep(0.2)

# CGI Server start
CGIHTTPServer.test()

CGIHTTPServerを起動する前に、I2C液晶の初期化を行っている。

次に同じフォルダに index.html ファイルを作成。

</pre>
<form action="/cgi-bin/cgilcd.py" method="GET">
Send to I2C LCD

1<input type="text" name="line1" />

2<input type="text" name="line2" />
<input type="submit" /></form>
<pre>

このフォルダの直下にcgi-binフォルダを作成(mkdir cgi-bin)して、そこに cgilcd.py ファイルを作成する。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import cgi
import smbus
import time

i2c = smbus.SMBus(1)
addr = 0x3e
# LCD Clear
i2c.write_byte_data(addr, 0, 0x38)  # function set(IS=0)
i2c.write_byte_data(addr, 0, 0x0C)  # Display On
i2c.write_byte_data(addr, 0, 0x01)  # Clear Display
i2c.write_byte_data(addr, 0, 0x06)  # Entry Mode Set
time.sleep(0.2)

# Send to LCD
form = cgi.FieldStorage()
if form.has_key('line1'):
    line1 = form['line1'].value
    [i2c.write_byte_data(addr, 0x40, ord(c)) for c in line1]
else:
    line1 = 'none'
if form.has_key('line2'):
    line2 = form['line2'].value
    i2c.write_byte_data(addr, 0, 0xc0)  # 2nd line
    [i2c.write_byte_data(addr, 0x40, ord(c)) for c in line2]
else:
    line2 = 'none'

print 'Content-type: text/html\n'
print ''
print 'Send to LCD
'
print '1:',line1,'
'
print '2:',line2,'
'
print '<a href="../index.html">Back</a>'
print ''

これで準備完了。I2C液晶が接続された状態で、CGIServer.pyを起動する。

pi@raspberrypi ~/PythonProjects $ python CGIServer.py
Serving HTTP on 0.0.0.0 port 8000 …

Raspberry Piと同一ネットワーク上にあるPCのブラウザから、Raspberry PiのIPアドレスとポート番号を指定してアクセスする。ポート番号はデフォルトでは8000番。

cgilcd1

index.htmlに記述した入力フォームが表示されるので、文字列を入力して送信。

cgilcd2

I2C液晶に入力した文字列が表示されればOK。

2013-02-18 22.34.27

非常に簡単なプログラムで、WebブラウザからRaspberry Piに接続したデバイスへ情報を渡すことができた。同じような仕組みで接続したセンサ類の情報をブラウザで読み出すような事も可能だろう。

ブラウザからアクセスした時に、Raspberry Piのコンソールに「code 404, message File not found」というエラーメッセージが出る場合があるが、これはブラウザがfavicon.icoファイルを要求しているのに、そのファイルが無いというエラーなので、無視してかまわない。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中