ESP8266でMicroPythonを動かす

Arduino化を試みたESP8266搭載のWeMos D1ボード(その時の記事)。

Arduino環境で開発出来るだけでも十分魅力的ではあるのだが、このボードはMicroPythonという組み込み向けPythonを動作させることも出来る。

MicroPythonは対話型インタープリタの他に、ボード上のフラッシュにファイルシステムを持っていて、そこに置いたPythonスクリプトを実行出来る。コンパイル不要でスクリプトを動かせるのは手軽で便利!
しかも、ボードへのファイル転送をOTA(Over The Air)、つまりWiFi経由で出来てしまう。購入時には全く気づかなかったけど、よく見たら上記の商品販売ページにもOTAって書いてありますね。

設定方法はMicroPythonの開発元?とおぼしきサイト
https://micropython-docs-ja.readthedocs.io/ja/latest/esp8266/tutorial/intro.html
に色々詳しく書かれており、参考にしながらインストールし動かしてみた。

スポンサーリンク

ESP8266用MicroPythonのダウンロードとインストール

以下、Linux環境(Ubuntu18.04)でのインストール方法。WindowsでもPythonを入れれば多分同様に出来ると思います(未確認)。

まずは、esptoolのインストール(pipはPython環境のインストーラで別途設定要)

$ pip install esptool

ESP8266用のファームウエアはダウンロードページに置いてある。最新の安定版ファームウエア(現時点では2019/5/29版)をダウンロード。

$ wget http://micropython.org/resources/firmware/esp8266-20190529-v1.11.bin

フラッシュに既に書かれている物を消去

$ esptool.py --port /dev/ttyUSB0 erase_flash

ダウンロードしたファームウエアを焼く

$ esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash -fm dio -ff 20m --flash_size=detect 0 esp8266-20190529-v1.11.bin

当初MicroPython開発元サイトの指示通りにファームウエアを焼いてもボードは起動しなかった。そこで、ボード開発元ページを見に行ったところ「ブート可能なイメージを焼くには”-fm dio -ff 20m -fs detect”のパラメータが必要」との記述を見つけesptool.pyコマンドの引数を上記のように修正したところ無事成功した。

シリアル接続でREPL(インタープリタ)を試す

MicroPythonのインタープリタはREPL(Read Evaluate Print Loop)と呼ばれる。ESP8266ボードをPCに接続し115200bpsでシリアルポートを開く(以下はLinuxの場合)。

$ picocom /dev/ttyUSB0 -b115200

シリアルポートを開いたらEnterを押してプロンプトが出るのを確認。とりあえずHello world。

>>> 
>>> print('Hello world')
Hello world
>>> 

ctrl-Dを押すとソフトリセットが掛かってビルド番号などが確認出来る。

>>> 
MPY: soft reboot
MicroPython v1.11-8-g48dcbbe60 on 2019-05-29; ESP module with ESP8266
Type "help()" for more information.
>>> 

WebREPL(WiFi 経由のインタープリタ)を試す

シリアルポート接続だけでなく、WiFi接続でもREPLコンソールが使える。有効化の手順は以下。

  1. https://github.com/micropython/webreplからWebREPLクライアントをダウンロードして適当なディレクトリに展開しておく
  2. シリアル接続のREPLで”import webrepl_setup”を実行しパスワードを設定すると、ボードが再起動する。
  3. ESP8266ボードへWiFi接続する。ESSIDはMicroPython-xxxxxx(xはMACアドレスの一部)でパスワードは micropythoN
  4. 1.でダウンロードし展開しておいたwebrepl.htmlをブラウザ(chromeかfirefox)で開き、Connectボタンを押す
  5. 接続に成功するとパスワードが要求されるので、2.で設定したパスワードを入力する

上記の有効化を行った後、ブラウザからHello worldした時のスクリーンショット。

ブラウザから使えるのは非常に便利!しかし、孤立したWiFiに繋げているせいでPCがインターネットから遮断されちゃうのは不便…

ESP8266をLANに接続させる

PCをLANに繋げたままWebREPLを使うために、ESP8266をLANに接続させる設定をする。

以下の関数定義にessidとpasswordに適宜設定値を入れたうえで、 REPL(シリアルでもWebでもOK)コンソールでctrl-Eキーを押し貼り付けモードにして、以下のコードをペーストする。

def do_connect():
    import network
    sta_if = network.WLAN(network.STA_IF)
    if not sta_if.isconnected():
        print('connecting to network...')
        sta_if.active(True)
        sta_if.connect('essid', 'password')
        while not sta_if.isconnected():
            pass
    print('network config:', sta_if.ifconfig())

ペースト後ctrl-DキーでREPLを通常モードに戻したうえで、
コンソールで”do_connect()”と売って上記関数を呼び出すと指定のWiFiルータに接続してLANに繋がる。

>>> do_connect()
#5 ets_task(4020f4d8, 28, 3fff95a8, 10)
connecting to network...
network config: ('192.168.1.10', '255.255.255.0', '192.168.1.1', '192.168.1.1')
>>> 

network config値からLANのDHCPサーバからESP8266に割り当てられたIPアドレスが192.168.1.10と分かる。あとはWebREPLクライアントから192.168.1.10:8266に接続すればWebREPLが使える。

ここで行った設定はどこぞかに保存されており、以降は電源を切っても再度電源On時に勝手にLANへ接続されるようになった。

ファイルシステムを覗いてみる

REPLコンソールからコマンドを打つとファイル一覧が取得出来る。

>>> import os
>>> os.listdir()
['boot.py', 'webrepl_cfg.py']
>>> 

WebREPLでファイルをダウンロードして中身を確認すると、webrepl_cfg.pyはWebREPLのパスワードが(平文で…)書かれており、boot.pyには以下のような初期化コードが書かれている。

boot.py

# This file is executed on every boot (including wake-boot from deepsleep)
#import esp
#esp.osdebug(None)
import uos, machine
#uos.dupterm(None, 1) # disable REPL on UART(0)
import gc
import webrepl
webrepl.start()
gc.collect()

WebREPLの開始とおぼしきコードが見える。

WiFi経由でスクリプトをアップロードして実行

MicroPythonの動作シーケンスはざっくり以下のような感じ。

  1. リセット
  2. boot.py実行
  3. main.py実行
  4. REPLコンソールへ制御が移る

インストール直後は、boot.pyのみでmain.pyが無いので3.は実行されない。

そこでmain.pyとして以下の簡単なプログラムをWebREPL画面の右上”send to device”ボタンで転送する。

main.py

import time

for n in range(10) :
    print(n)
    time.sleep(1)

ファイル転送後ctrl-Dでリセットをかける。この時点でWebREPLは接続が外れてしまうが、シリアルコンソールを繋いでおくと以下のような出力が見える。

>>> 
MPY: soft reboot
WebREPL daemon started on ws://192.168.4.1:8266
Started webrepl in normal mode
0
1
2
3
4
5
6
7
8
9
MicroPython v1.11-8-g48dcbbe60 on 2019-05-29; ESP module with ESP8266
Type "help()" for more information.
>>> 

上記でひととおり環境設定は終わり。次回はI2Cデバイスを繋いでみる。

コメント