M5CAMERAでラジコン戦車作ってみた〜【Part5:picowebをインストールする】
はじめに
M5CAMERAに接続したモータをスマホから遠隔操作するために、ここではpicowebを使えるように設定を行います。picowebは小型のマイクロコントローラ上で動く軽量なwebフレームワークで、インストールするとwebサーバーを簡単に実装できるようになります。M5CAMERAをWiFiに接続した状態で、インターネットからpicowebプログラムをpipコマンドでインストールし、動作に必要なファイルulogging.pyをダウンロードします。
先ずはWiFi接続
先ずはM5CAMERAをWiFiに接続している状態にしてください。WiFiへの接続方法がわからない時は、Part4 のWiFi接続を参考にしてください。 Part4 で作成したPythonプログラムboot.pyをampyコマンドでM5CAMERAに転送して、リセットスイッチを押すとboot.pyプログラムが起動して、WiFi接続が完了します。ampyを使ったboot.pyの転送は、ターミナルで下記のコマンドを実行します。
ampyコマンドで、boot.pyをM5CAMERAの転送(Part4で実施済みの場合は不要)
ampy --port /dev/tty.usbserial-01EF52FF put boot.py
boot.pyの転送が終わったら、screenコマンドを実行しパイソンを対話モードにします
screen /dev/tty.usbserial-01EF52FF 115200
対話モードの状態でリセットボタンを押すと、画面に文WiFi接続の状態が表示されます
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:5180
load:0x40078000,len:14032
load:0x40080400,len:3800
entry 0x4008063c
connecting to network...
network config: ('●.●.●.●', '▲.▲.▲.▲', '■.■.■.■', '×.×.×.×')
MicroPython v1.13-153-g9c0ac7e6a-dirty on 2020-11-07; Camera Module (i2s) with ESP32
Type "help()" for more information.
M5CAMERAに割り当てられてIPアドレスが、●.●.●.●の部分に表示されます。通常は192.168.***のような3桁の数値×4セットをコンマで区切った文字列です。
picowebをupipでインストールする
WiFiに接続完了したら、picowebをインストールします。Pythonの対話モードでupipコマンドを実行する事で、必要なファイルがインターネットからダウンロードされます。
picowebのインストール
import upip
upip.install('picoweb')
以下に実行時のターミナルを示します。
>>> import upip
>>> upip.install('picoweb')
Installing to: /lib/
Warning: micropython.org SSL certificate is not validated
Installing picoweb 1.8.2 from https://files.pythonhosted.org/packages/c2/22/a1eb0cf52b72e818fe47acadaf8ade200d7c0c7c6fc5acc7b47f53f2a338/picoweb-1.8.2.tar.gz
Installing pycopy-uasyncio 3.7 from https://files.pythonhosted.org/packages/e5/58/80b8b403c52ea88d44844570dbe487d7a4b3045ae0ecad0c9f4dbac0d104/pycopy-uasyncio-3.7.tar.gz
Installing pycopy-pkg_resources 0.2.1 from https://files.pythonhosted.org/packages/05/4a/5481a3225d43195361695645d78f4439527278088c0822fadaaf2e93378c/pycopy-pkg_resources-0.2.1.tar.gz
Installing pycopy-uasyncio.core 2.3.2 from https://files.pythonhosted.org/packages/ca/b2/c5bba0bde7022b6d927a6144c026d7bf310d3f8a20e031571fbf1a08a433/pycopy-uasyncio.core-2.3.2.tar.gz
>>>
このように、エラーなど表示されずに対話モードに戻ればOKです。自分の場合、WiFi電波の弱い場所で実施したら、installingの後に進めなかったことがありました。おそらく電波が弱くてインターネット接続が途切れてしまったのだと思います。その後、場所を変えてやりなおしてうまくいきました。
ulogging.pyのダウンロード
少し先回りしてしまいますが、このままpicowebを使うと下の黄色文字のエラーが発生してうまく動きませんでした。
>>> app.run(debug=True, host = '●.●.●.●')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/lib/picoweb/__init__.py", line 308, in run
ImportError: no module named 'ulogging'
>>>
uloggingモジュールが見当たらないため、importエラーが発生します。従って、ulogging.pyをインターネットからダウンロードして、ampyコマンドでM5CAMERAに転送しておく必要があります。
ulogging.pyは、こちらから入手しました。
このサイトから、micropython-ulogging-0.3.tar.gz (1.1 kB) をダウンロードして解凍すると、ulogging.pyが入っているので、このファイルをampyでM5CAMERAに転送します。転送先は、M5CAMERA直下ではなく、libフォルダの中にしました。ulogging.pyが置いてあるディレクトリで次のコマンドを実行します
ampy --port /dev/tty.usbserial-01EF52FF put ulogging.py /lib/ulogging.py
ampyのlsコマンドでlibフォルダ内のファイルが以下のようになっていればOK です。
usagi@usagi-mba work % ampy --port /dev/tty.usbserial-01EF52FF ls /lib
/lib/picoweb
/lib/pkg_resources.py
/lib/uasyncio
/lib/ulogging.py
動作確認
以上でpicowebを使う環境は整いました。動作確認をしてみましょう。対話モードで次のコマンドを入力します。
>>> import picoweb
>>> app = picoweb.WebApp('app')
>>> @app.route("/")
... def index(req, resp):
... yield from picoweb.start_response(resp)
... yield from resp.awrite('test')
...
...
...
>>> app.run(debug=True, host = '●.●.●.●')
* Running on http://●.●.●.●:8081/
やっていることは
- picowebインポートして、appの名前でWebApp生成
- @app.route("/")で、M5CAMERAに割り当てられたIPアドレスに、ブラウザからアクセスしたときのアクションを定義しています。ここでは文字列testを表示するようにしている。
- app.run(debug=True, host = '●.●.●.●')の部分で、M5CAMERAに割り当てられてIPアドレスでサーバーを稼働開始し、ブラウザからのアクセス待ち状態に入ります。
この状態で、WiFiに接続しているスマホやPCのブラウザから、M5CAMERAのIPアドレスにアクセスします。アクセスの方法は、ブラウザのアドレスバーにM5CMREAのアドレスを入力します。アドレスはポート番号とルートも含めた●.●.●.●:8081/と入力します。
こんな感じで、testと表示されればpicowebがブラウザからのリクエストを検知して、レスポンスを正常に返していることが確認できます。同時に、ターミナルのpython対話モード画面には、ブラウザからのアクセスを受け取ったことを示す情報が表示されます。
>>> app.run(debug=True, host = '●.●.●.●')
* Running on http://●.●.●.●:8081/
INFO:picoweb:224.000 <HTTPRequest object at 3f94d5d0> <Stream object at 3f94dc90> "GET /"
INFO:picoweb:224.000 <HTTPRequest object at 3f9503e0> <Stream object at 3f94d810> "GET /favicon.ico"
以上で、picowebを使用できる状態になりました。