MicroPython的午睡(117) ESP32版、net接続すれば御勝手mip動作OK

Joseph Halfmoon

前回、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伝統の「酢漬け」モジュールですな。

mipWorks

上記の実行後、DevKitC機のローカルストレージを観察すると以下のように/lib内に pickle.mpy(コンパイル済のMicroPythonコード)が設置を確認できました。pickle_installed

以下のように、普通にimport 可能です。

import pickle

ちゃんと動くかどうかは確かめてないケド。ファイルのGetのみ。

upipもある

上記のようにmip使ったmicropython-libのライブラリモジュールのインストールが出来るようになりました。しかし、実はESP32版のMicroPythonに mip が入っていなかった理由が推測?できるのです。それが以下に。

import upip

upipだと。フルPythonの pip の MicroPython版ってことかい?

import後、upipのhelpを読むと以下の如し。upipHelp

こちらは 伝統の PyPI からパッケージをもってくるのね。。。

そういえば Thonny IDE内蔵のパッケージマネージャもあり。どれ使ったらよいのだ? 端から試してみるしかないか?

MicroPython的午睡(116) ESP32版、mip動かんぜよ? へ戻る

MicroPython的午睡(118) ESP32版、PyPIからulp開発環境インストール へ進む