Arduino化を試みたESP8266搭載のWeMos D1ボード(その時の記事)。
- EasyWordMall OTA ESP-12E D1 WiFi UnoシールドベースESP8266モジュール(Amazon)
- HiLetgo® OTA WeMos D1 CH340 WiFi 開発ボード ESP8266 ESP-12F Arduino IDE UNO R3に対応(Amazon)
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コンソールが使える。有効化の手順は以下。
- https://github.com/micropython/webreplからWebREPLクライアントをダウンロードして適当なディレクトリに展開しておく
- シリアル接続のREPLで”import webrepl_setup”を実行しパスワードを設定すると、ボードが再起動する。
- ESP8266ボードへWiFi接続する。ESSIDはMicroPython-xxxxxx(xはMACアドレスの一部)でパスワードは micropythoN
- 1.でダウンロードし展開しておいたwebrepl.htmlをブラウザ(chromeかfirefox)で開き、Connectボタンを押す
- 接続に成功するとパスワードが要求されるので、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の動作シーケンスはざっくり以下のような感じ。
- リセット
- boot.py実行
- main.py実行
- 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デバイスを繋いでみる。
コメント