ESP32 + MicroPythonを動かしてみた

先日MicroPythonをインストールしたESP32ですが、試しにI/Oを叩いたりインターネットに接続したりしてみました。
Pythonはあまり詳しくないので、まずはインタープリタでいろいろいじってみます。
最近はインタープリタとは言わないでREPL(Read-Eval-Print Loop)と呼ぶらしいですね。

Lチカ代わりに、GPIOをオンオフしてオシロスコープで観測してみました。
コードはこんな感じです。オンオフの無限ループで、CTRL-Cでストップします。
オンオフしているピンはIO21です。
ちなみにDevKitCのピンアウトはDEKOのアヤシいお部屋。さんのこちらのページにあるものが分かりやすいです。

>>> import machine
>>> p=machine.Pin(21,machine.Pin.OUT)
>>> p.value()
0
>>> while True:
... p.value(1)
... p.value(0)
...
...
...
Traceback (most recent call last):
File "", line 3, in
KeyboardInterrupt:
>>>

machineというモジュールに、いろいろハード依存の実装があるようです。
少し古い文書ではmachineではなくpybというモジュールで記述されていることがあります。
おそらく、以前MicroPythonはPyBoardという専用ハードで使われていたためではないかと思います。
ESP32では、以下のような機能が現時点では実装されているようです。

>>> help(machine)
object is of type module
__name__ -- umachine
mem8 -- <8-bit memory>
mem16 -- <16-bit memory>
mem32 -- <32-bit memory>
freq --
reset --
unique_id --
idle --
disable_irq --
enable_irq --
time_pulse_us --
Timer --
Pin --
Signal --
TouchPad --
ADC --
DAC --
I2C --
PWM --
SPI --
UART --
>>>

IO21の出力をオシロスコープで観測すると、一周期あたり約90μsecで回せていましたので、最大10KHzくらいのパルス波がこのやり方で出力できそうです。
以下の記事にはインラインアセンブラを含む複数の実装方法での比較があります。

Pin Toggle Frequency Contest against C. Please Help! 🙂 – MicroPython Forum

esp32-micropython-gpio.png

続いて、ネットワーク接続を試してみました。
まずはWiFiに接続します。
手順は以下の通りです。

MicroPython v1.9.2-272-g0d183d7 on 2017-09-18; ESP32 module with ESP32
Type "help()" for more information.
>>> import network
I (40128) wifi: wifi firmware version: 4acbf1f
I (40128) wifi: config NVS flash: enabled
I (40128) wifi: config nano formating: disabled
I (40128) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
I (40138) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
I (40158) wifi: Init dynamic tx buffer num: 32
I (40158) wifi: Init data frame dynamic rx buffer num: 64
I (40158) wifi: Init management frame dynamic rx buffer num: 64
I (40168) wifi: wifi driver task: 3ffd96dc, prio:23, stack:4096
I (40168) wifi: Init static rx buffer num: 10
I (40168) wifi: Init dynamic rx buffer num: 0
I (40178) wifi: Init rx ampdu len mblock:7
I (40178) wifi: Init lldesc rx ampdu entry mblock:4
I (40188) wifi: wifi power manager task: 0x3ffdeb54 prio: 21 stack: 2560
I (40208) phy: phy_version: 359.0, e79c19d, Aug 31 2017, 17:06:07, 0, 0
I (40208) wifi: mode : null
>>> wlan = network.WLAN(network.STA_IF)
>>> wlan.active()
False
>>> wlan.active(True)
I (99778) wifi: mode : sta (30:ae:a4:01:4c:30)
I (99778) wifi: STA_START
True
>>> wlan.connect('SSID','PASSWORD')
>>> I (153318) wifi: n:4 0, o:1 0, ap:255 255, sta:4 0, prof:1
I (153878) wifi: state: init -> auth (b0)
I (154878) wifi: state: auth -> init (0)
I (154878) wifi: n:4 0, o:4 0, ap:255 255, sta:4 0, prof:1
I (155968) wifi: n:9 0, o:4 0, ap:255 255, sta:9 0, prof:1
I (155968) wifi: state: init -> auth (b0)
I (155968) wifi: state: auth -> assoc (0)
I (155978) wifi: state: assoc -> run (10)
I (155988) wifi: connected with SSID, channel 9
I (155998) wifi: event 4
I (157658) event: ip: 192.168.0.106, mask: 255.255.255.0, gw: 192.168.0.1
I (157658) wifi: GOT_IP
I (158978) wifi: pm start, type:0

>>>

これでインターネットに接続できるようになりました。
次に、MicroPythonの以下のチュートリアルにある、STAR WARSのアスキーアートバージョンのサーバに接続してみます。
このチュートリアルはESP8266用ですが、この例題はESP32でも動作します。

5. Network – TCP sockets — MicroPython 1.9.2 documentation

socketモジュールを使って接続します。

>>> import socket
I (310618) modsocket: Initializing
>>> 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='')
...
...
...

最後のprint文の「end=”」はprint後に改行させないおまじないです。
画面制御シーケンスに対応したターミナルソフトであれば、下図のようなAsciiアート版STAR WARSが楽しめます。
停止はCtrl-Cです。

starwars.png

コメント