気の向くままに辿るIT/ICT/IoT
IoT・電子工作

Raspberry PiでWebIOPi

ホーム前へ次へ
Raspberry Piって?

Raspberry PiでWebIOPi

Raspberry PiでWebIOPi

2022/05/04

 WebIOPiは、Webサーバ機能を備えつつ、Raspberry PiのGPIOピンにアクセス・操作する手段を提供してくれるソフトウェア。

 WebIOPiにおけるPythonスクリプトでは、Arduino IDEのスケッチに似たdef setup()、def loop()、def destroy()といった構文を使うこともできるようになっています。

 Raspberry Piが初めてリリースされた2012年にラズパイ用に初版リリースという老舗、Webサーバ機能+GPIO操作機能を併せ持つソフトウェアは他にないこともあり、既に7年ほど前に開発が終わっているにも関わらず、今尚、人気がある模様。

 そんな魅力的なWebIOPiですが、数年前に開発が終了しているゆえに若干バグがある、今となっては、既に3系に完全移行したPythonにおいて2系に依存している(ため、2系が復活してしまう)こと、GPIO操作もこれで行う場合には、過去のものに対してトレーニングコストがかかることは、かなりのネックでしょう。

 ラズパイのGPIO操作については、WebIOPiのWebサーバ機能を利用しつつ、ラズパイGPIO操作専用のRPi.GPIO || gpiozero || WiringPi || gpiopiを使うケースも多いようです。

 Python 2系依存については、Webサーバと言えば、ApacheやNginxもあり、Python使いなら、BottleやFlask、tornadoなどPythonフレームワークもあります。

 よって現時点で初めて使うのであれば、WebサーバとGPIO操作は別個のツールを使うのが賢明でしょう。

 自身も他を当たろうとtornado/RPi.GPIOやpywebview/RPI.GPIOで道草を食いつつ、目的の実装には、Flask/RPI.GPIOを使うことにしました。

 とはいえ、このご時世にこれを試し、実装しようと思っていた機能にピッタリしっくりのプログラムも見つけてしまい、そのままでうまく動いたこともあり、インストールと基本設定の記録も残しておこうかと。

 尚、今回の検証に使ったステッピングモータは、28BYJ-48 5V、ステッピングモータードライバはULN2003。

WebIOPiのインストールとアクセス確認

USER@raspberrypi:~ $ wget http://sourceforge.net/projects/webiopi/files/WebIOPi-0.7.1.tar.gz
USER@raspberrypi:~ $ tar zxvf WebIOPi-0.7.1.tar.gz
USER@raspberrypi:~ $ cd WebIOPi-0.7.1
USER@raspberrypi:~ $ wget https://raw.githubusercontent.com/doublebind/raspi/master/webiopi-pi2bplus.patch
USER@raspberrypi:~ $ patch -p1 -i webiopi-pi2bplus.patch
USER@raspberrypi:~ $ sudo ./setup.sh
Do you want to access WebIOPi over Internet?[y/n]
USER@raspberrypi:~ $

 WebIOPiは、ソースをダウンロード(・展開)、ラズパイ2B用(実質3B/3B+対応)パッチを当ててから、setup.shでインストールという手順を踏みます。

 検索すると対応策を見つけて4Bで使っている人もいるようです。

 setup.sh終盤でインターネットを介してWebIOPiにアクセスしたいかを問われるのでyかnで選択すれば完了。

 nを選んでもLAN内では使えるので問題ありません。

USER@raspberrypi:~ $ sudo webiopi -d -c /etc/webiopi/config
USER@raspberrypi:~ $

 テスト時は、端末からデバックモード(webiopi -d -c /etc/webiopi/config)で実行できます。

 構成ファイル/etc/webiopi/configの内容に明らかな不備があった場合は、ここでわかります。

USER@raspberrypi:~ $ sudo systemctl start webiopi
USER@raspberrypi:~ $ sudo systemctl stop webiopi
USER@raspberrypi:~ $ sudo systemctl daemon-reload
USER@raspberrypi:~ $ sudo systemctl restart webiopi
USER@raspberrypi:~ $ ps aux | grep webiopi
root プロセスID ... webiopi
...
USER@raspberrypi:~ $

 運用中の起動・終了には、systemdも使うことができます。

 が、困ったことに、なぜかsystemctl stopしてもwebiopiのプロセスが残ってしまいます。

 /etc/init.d/webiopiのstop部分をうまいこと書けば、これを呼んでいるwebiopiのsystemdサービスファイルにも反映されますし、もしくは、systemdサービスファイルに入れ込むことができれば、プロセスを始末させることもできるとは思いますが。

 ってwebiopiでも当初から自覚ありのようで始末はしているものの、全ての関連プロセスを完全に始末する巧みな手があれば、それを追記、なければ、最終手段はスリープで待って凌ぐべしというコメントが...。

 毎回同じ時間スリープで例外はないのだろうか?

USER@raspberrypi:~ $ sudo kill -9 プロセスID
USER@raspberrypi:~ $

 とりあえずは、デバックモードでもsystemctl startでもWebIOPiを起動した場合、終了させるには、ps aux | grep webiopiなどとして該当するプロセスIDを見つけ、sudo kill -9 プロセスIDなどとする必要があります。

 2度手間ですが、systemctl stopも一応。

 まぁ、どうにもならなければ、これが最終手段ですかね。

WebIOPiサンプルメニュー画面

 何れにせよ、WebIOPiを起動後、ブラウザのURL表示・入力欄に、今回はラズパイのIPアドレスか、Androidスマホでなければ、BonjourやAvahiによるmDNS名(x.local)でIPアドレス:8000などと入れ、EnterするとWebIOPiの実行・反映可能なGPIOヘッダのサンプルが表示されます。

WebIOPiサンプル[GPIO Header]

 例えば、[GPIO Header]。

 入力モードである[IN]とあるところをクリック・タップすると表示が出力モードである[OUT]に、BOARD番号の背景色が変わると共に該当するGPIO/BOARD番号のピンの出力がHIGHになります。

 これはラズパイの動作を確認できるサンプルであり、実物のラズパイのGPIOにつながっているので、例えば、任意のGPIOとGroundに抵抗+LEDなどの回路をつなぎ、該当するGPIO/BOARD番号横の[IN]/[OUT]を切り替えると実物のLEDを点灯/消灯させることができます。

USER@raspberrypi:~ $ mkdir -p path/to/webiopi/sample1/python
USER@raspberrypi:~ $ mkdir -p path/to/webiopi/sample1/html
USER@raspberrypi:~ $ sudo vi /etc/webiopi/config
...
myscript = /path/to/webiopi/sample1/python/script.py
...
passwd-file = /etc/webiopi/passwd
...
doc-root = /path/to/webiopi/sample1/html
...
USER@raspberrypi:~ $

 サンプルの表示とサンプルから物理回路を操作できることの確認が終わったところで、運用する場合の基本的な設定について。

 まず、先のWebIOPi-0.7.1ディレクトリは、インストール用なので本番や作業用のWebIOPi用ディレクトリを作成します。

 続いてWebIOPiの構成ファイル/etc/webiopi/configを編集、少なくともmyscript行とdoc-root行の2行を編集追記します。

 前者はPythonスクリプトのパス、後者はHTMLファイルのパスで、同じパスにするということは、同じディレクトリにpythonファイルとhtmlファイルを配置することを意味します。

 htmlファイルはindex.htmlがデフォルトのファイルとなります(当該ディレクトリにアクセスすると存在すればindex.htmlが表示されます)。

 というか、そのdoc-rootのHTMLファイル用パスがデフォルトルートとなるのでIPアドレス:8000x.local:8000などと入れ、Enterした時にあればindex.htmlファイルが、ファイル名までフルパス指定すれば別のhtmlファイルでも表示されます。

 アクセスするポート番号も/etc/webiopi/configで変更することもできます(当然他と被らないよう要注意)。

 また、この後、ブラウザからアクセスする際、このままだとアカウント及びパスワード認証することになりますが、これが不要なら、passwd-file行の先頭に#を付けてコメントアウトしておきます。

 尚、passwd-file行にあるファイルを確認すればわかりますが、デフォルトのアカウント/パスワードは、webiopi/raspberry。

 pythonファイルなどはともかく、前述の通り、ブラウザからアクセスして/etc/webiopi/configに記載したHTMLファイルパスにあるindex.htmlが(ファイル名が異なる場合は、ファイル名までフルパス指定して)表示されれば、とりあえず、確認完了です。

ホーム前へ次へ