ESP8266(WIO NODE)でMicroPythonを動かしてみた

昨日(1/25)、以前からアナウンスされていた、MicroPython ver 1.10がリリースされました。
2018/5/11にリリースされた前バージョンの1.9.4以降に取り込まれた更新がまとまっています。

具体的には、

・Nordic nRF51/52のサポート
ESP32版のドキュメント
・ESP32のpsRAMサポート

などです。ビルド済みバイナリも既にダウンロードページに掲載されています。

WIO NODE

この機会に、これまで動かしたことのなかったESP8266版MicroPythonを動かしてみました。

ボードはSeeedのWIO NODEです。このボードはSeeed独自のサービス向けに作られたようですが、単なるESP8266ボードとしても使えます。

1000円強で買えますので、価格的にも手頃です。(ただしUSBシリアル変換は別途必要になりますので、それを含めるならUSBシリアル変換が内蔵されているESP-32 DevKitCのほうが安くなります。)

このボードは、ピンヘッダが無い代わりに、Groveコネクタが2つ付いています。GroveコネクタはI/Oが2本とGNDとVccですので、合計4本のI/Oピンが使えます。また、RSTとGPIO0にタクトスイッチが付いています。
Groveコネクタの一方はUARTのTX/RXが使えるようになっていますので、ここからESP8266のフラッシュへ書き込みができます。

UARTの配線は以下を見ながら、変換コネクタを作りました。

MobileHackerz再起動日記: 遠隔でPCの電源を入れる、無線LAN×WoL電源ボタンをつくった

スイッチサイエンスのUSBシリアルコンバータに、1×6のピンヘッダで接続しています。

電源供給用MicroUSBも接続する必要がありますので、PC側にはUSBポートが2つ必要です。

MicroPythonの書き込み

ダウンロードページからESP8266用のバイナリをダウンロードします。今回はesp8266-20190125-v1.10.binをダウンロードしました。

WIO NODEには「Func」「RST」の2つのタクトスイッチが付いています。
「Func」を押したまま、「RST」を押して離すとフラッシュ書き込みモードになります。

書き込み手順はMicroPythonのドキュメント(英語日本語)にあるとおり、esptool.pyを使うのが良いようです。

Windowsの場合は、NODEMCUの書き込みツールを使うこともできます。(Adafruitのページより。)
このツールはGitHubからダウンロードできます(64bit版32bit版)。

使い方は、まずConfigタブで歯車アイコンをクリックして、ファームウェアのファイルを指定します。

次に、Advancedタブで以下の通り設定します。

最後にOperationタブでCOMポートを選択してFlashボタンをクリックします。

書き込みが終わったら、RSTボタンを押せばUARTからMicroPythonへアクセスできます。
通信速度は8bit/115200bpsです。

ただし、MicroPythonが起動する前にESP8266のファームウェアが出力するメッセージは72000bpsですので、その部分だけは文字化けします。
ちなみに、72000bpsで読み取ると以下のようなメッセージが出ていました。

load 0x40100000, len 31020, room 16
tail 12
chksum 0xd2
ho 0 tail 12 room 4
load 0x3ffe8000, len 1100, room 12
tail 0
chksum 0x9a
load 0x3ffe8450, len 824, room 8
tail 0
chksum 0xbd
csum 0xbd
rf cal sector: 1019
freq trace enable 0
rf[112] : 00
rf[113] : 00
rf[114] : 01

SDK ver: 2.2.0-dev(9422289) compiled @ Nov  3 2017 19:40:08
phy ver: 1136_0, pp ver: 10.2

mode : softAP

WebREPLを使う

ESP8266版のMicroPythonには、WebブラウザからREPLにアクセスするWebREPLという仕組みがあります。

これを使うには、以下のような手順を踏みます。

(1)REPLから以下のコマンドでWebREPLを有効化(「E」を入力)する。(このあとパスワードの設定もあります。)

>>> import webrepl_setup
WebREPL daemon auto-start status: enabled

Would you like to (E)nable or (D)isable it running on boot?
(Empty line to quit)
>

(2)rebootするかと訊かれるので、yを入力してリブートする。(すると、MicroPythonの起動メッセージに「Started webrepl in normal mode」という表示が現れ、WiFi APが起動する。PCからはMicroPython-xxxxxxというAPがあるのが見えるはず)

(3)PCのブラウザからhttp://micropython.org/webrepl/にアクセスする(HTMLとJavaScriptを取得するため)。

(4)PCのWiFiを上記で確認したアクセスポイントMicroPython-xxxxxx(xxxxxxの部分は個体により異なる)へ接続する。WiFiのパスワードは「micropythoN」(最後のNだけ大文字)。

(5)上記(3)で開いたWebページのConnectボタンをクリックし、先ほど設定したパスワードを入力するとREPLに接続できる。

WebREPLを使ってESP8266との間でファイルのアップロード/ダウロードもできるようです。

インターネットに接続する

いつものASCII ART STAR WARSにつないでみました。

まず、WebREPLを使っているのであれば、再度
でDを入力してWebREPLを無効にしておきます。

>>> import webrepl_setup
WebREPL daemon auto-start status: enabled

Would you like to (E)nable or (D)isable it running on boot?
(Empty line to quit)
>

そして、以下のようにWiFi APへ接続する関数を定義します。(SSIDとパスワードは指定してください)

def do_connect():
    import network
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect('YOUR-WIFI-AP-SSID', 'YOUR-PASSWORD')
        while not wlan.isconnected():
            pass
    print('network config:', wlan.ifconfig())

ペーストモード(CTRL-E)で上記を貼り付け、CTRL-Dで抜けると読み込まれます。
これで以下のようにするとSTAR WARSサイトに接続できます。

>>> do_connect()
#5 ets_task(4020f4d0, 28, 3fff9e30, 10)
connecting to network...
network config: ('192.168.0.105', '255.255.255.0', '192.168.0.1', '192.168.0.1')
>>> import socket
>>> addr_info = socket.getaddrinfo("towel.blinkenlights.nl", 23)
>>> addr = addr_info[0][-1]
>>> s = socket.socket()
>>> s.connect(addr)
>>> while True:
...     data = s.recv(500)
...     print(str(data, 'utf8'), end='')
...
...
...

無事表示されました。速度もそこそこ高速です。

コメント