前回、ESP32版MicroPython上で、MicroPython特有のパッケージ管理ツール mip を走らせんと試みましたが一山超えて二山目で止まってました。今回はその二山目を超えるべくネット接続を追加してみました。あれよあれよと言ううちに一瞬でパッケージのインストールOK、mip 動作してしまったみたいです。
※「MicroPython的午睡」投稿順 Indexはこちら
いつもお世話になっておりますMicroPythonの日本語ドキュメントの以下ページでは、パッケージ管理について mip を使うように記されとります。
「フルPython」のpipに対抗?するツールみたいっす(mipのレポジトリの参照先はPyPIではない。)しかし、ESP32版のMicroPythonでは、mipの事前装備なし。そこで前回、手動でmipをインストールするもエラーで止まりました。原因は requests モジュールの呼び出しでした。
-
- mipの中では requests という名で呼び出している
- ESP32版MicroPythonでは requests ではダメで、urequests としてu付で呼び出さないとならない
そこでダウンロードしたmipのソースを勝手変更、数か所の requests を urequests に変更しました。すると mip は動き出した感じ、でもエラー。よく考えてみると mipを実行している ESP32 DevKitC機はネットに接続してません。URLにアクセスできるわけがないのだ、これは。PC上のThonny IDEで作業しているのでThonnyはネット接続見えているのでESP32機もネットに繋がっているように錯覚してました。お間抜け。
前回、勝手修正のmip、ネット接続したらあっけなく動作OK
そこでESP32 DevKitC機をWiFiでネット接続すべく、コードを追加したものが以下に。なおSSIDとPASSWORDのところは、Yourチョメチョメとしてあるのでご注意を。
import network, time, sys import mip import uerrno class ESP32WiFi: """ESP32WiFi Class """ def __init__(self): self.ssid = "Your SSID" self.password = "Your Password" self.wlan = None self.timeout = 20 def do_connect(self, opt=True): self.wlan = network.WLAN(network.STA_IF) self.wlan.active(True) if not self.wlan.isconnected(): print('connecting to network...') self.wlan.connect(self.ssid, self.password) while (not self.wlan.isconnected()) and (self.timeout > 0): start = time.ticks_ms() while time.ticks_diff(time.ticks_ms(), start) < 1000: pass self.timeout -= 1 if opt: print('timeout: ', self.timeout) print('network config: ', self.wlan.ifconfig()) return self.wlan.isconnected() def close(self): self.wlan.disconnect() self.wlan = None def main(): nw = ESP32WiFi() if nw.do_connect(): try: #mip.install("https://github.com/micropython/micropython-lib/python-stdlib/functools") mip.install("pickle") except OSError as exc: print("OSError: ", exc.args[0]) nw.close() if __name__ == "__main__": main()
mipの動作確認
さて、上記コードを走らせれば、ネット接続後 mip が走ります。今回、mip でインストールするターゲットは、pickleとしてみました。Python伝統の「酢漬け」モジュールですな。
上記の実行後、DevKitC機のローカルストレージを観察すると以下のように/lib内に pickle.mpy(コンパイル済のMicroPythonコード)が設置を確認できました。
以下のように、普通にimport 可能です。
import pickle
ちゃんと動くかどうかは確かめてないケド。ファイルのGetのみ。
upipもある
上記のようにmip使ったmicropython-libのライブラリモジュールのインストールが出来るようになりました。しかし、実はESP32版のMicroPythonに mip が入っていなかった理由が推測?できるのです。それが以下に。
import upip
upipだと。フルPythonの pip の MicroPython版ってことかい?
こちらは 伝統の PyPI からパッケージをもってくるのね。。。
そういえば Thonny IDE内蔵のパッケージマネージャもあり。どれ使ったらよいのだ? 端から試してみるしかないか?