Fusic Tech Blog

Fusion of Society, IT and Culture

MicroPythonでESP32を動かす方法
2021/10/14

MicroPythonでESP32を動かす方法

IoTチームの岡嵜です。

はじめてMicroPythonに触れて、簡単に組込みプログラミングができることに感動しました。

本記事ではESP32-WROOM-32上でMicroPythonを起動できるようにし、Pythonプログラムで出力ピンをON/OFFするところまでまとめます。

準備

基本的にはGetting started with MicroPython on the ESP32に書いてある手順でファームウェアを書き込むことで簡単に利用できます。

要点を抜粋して記載します。

ファームウェアの入手

以下のページからESP32用のファームウェアを入手します。

https://micropython.org/download/esp32/

Stable版とDaily版があるので、記事執筆時点の最新のStable版である esp32-20210902-v1.17.bin をダウンロードしました。

esptoolのインストール

pipでインストールした後、PATHを通しておきます。

$ pip install esptool

# pipのインストール先を確認
$ python -m ensurepip
Looking in links: /var/folders/q2/f3g6blws3xq93fvzwlgcnrp40000gn/T/tmp45fjbnoh
Requirement already satisfied: setuptools in ./.asdf/installs/python/3.8.11/lib/python3.8/site-packages (56.0.0)
Requirement already satisfied: pip in ./.asdf/installs/python/3.8.11/lib/python3.8/site-packages (21.2.4)

# PATHを通す
$ export PATH=$PATH:./.asdf/installs/python/3.8.11/bin

# esptool.py
$ esptool.py version
esptool.py v3.1
3.1

ファームウェアの書き込み

先ほどの手順でダウンロードしたファームウェアを書き込みます。

# シリアルデバイスの確認
$ ls /dev | grep usb
cu.usbserial-0001
tty.usbserial-0001

# FLASHを消去
$ esptool.py --port /dev/tty.usbserial-0001 erase_flash
# !!! ここで基板のBOOTスイッチを長押しすること

# ファームウェアの書き込み
$ esptool.py --chip esp32 --port /dev/tty.usbserial-0001 --baud 460800 write_flash -z 0x1000 ~/Downloads/esp32-20210902-v1.17.bin

シリアル接続する

MacからESP32へシリアル接続することで、すぐにMicroPython REPLが使えます。今回はMacを使っているのでscreenコマンドを使ってシリアル接続しています。

ここでは試しにD2ポートの出力をHIGHに切り替えてみます。

$ screen /dev/tty.usbserial-0001 115200

MicroPython v1.17 on 2021-09-02; ESP32 module with ESP32
Type "help()" for more information.
>>> from machine import Pin
>>> p2 = Pin(2, Pin.OUT)
>>> p2.on()   # D2に接続したLEDが点灯する

# 終了したいときは Crtl+A→K→Y の順で入力する

C言語で書くとこれだけで結構な行数のソースコードを書かなければならないですし、コンパイル→書き込みにも時間がかかります。

MicroPythonだとスクリプトを数行書くだけでデバイス制御ができるので、非常に楽ですね。

Pythonソースを自動起動させる(フルカラーLEDを使ったデモ)

今回書き込んだファームウェアはFlashメモリ上に1MBのファイルシステムが構築されています。そこに boot.py, main.py というPythonファイルを格納しておくと、起動時に boot.pymain.py の順で自動実行してくれます。

今回は試しに以下のようなPythonファイルを用意してみました。

boot.py

from machine import Pin

r = Pin(2, Pin.OUT)
g = Pin(4, Pin.OUT)
b = Pin(5, Pin.OUT)

main.py

from machine import Pin
import time

r = Pin(2, Pin.OUT)
g = Pin(4, Pin.OUT)
b = Pin(5, Pin.OUT)

while True:
    r.off()
    time.sleep(1)
    b.on()
    time.sleep(1)
    g.off()
    time.sleep(1)
    r.on()
    time.sleep(1)
    b.off()
    time.sleep(1)
    g.on()
    time.sleep(1)

ファイルシステムへの書き込みには ampy と呼ばれるパッケージを利用します。

$ pip install adafruit-ampy

# ファイルシステム配下のファイルを表示
$ ampy --port /dev/tty.usbserial-0001 ls
/boot.py

# boot.pyを書き込み
$ ampy --port /dev/tty.usbserial-0001 put boot.py

ブレッドボード上にアノードコモンのフルカラーLEDを配置し、カソードをD2, D4, D5ピンに接続しています。 それぞれのピンをOFFにするとアノード→カソード(各ピン)に電流が流れ、LEDが点灯します。

まとめ

これまでC言語やmrubyを使った組込み開発を経験してきましたが、MicroPythonは以下のような点で有用だと思いました。

  • イメージを書き込むだけで簡単に使えるようになる
  • 必要最低限のライブラリが一通り揃っている(IO, I2C, SPI, Timer等)
  • ドキュメントが充実している

自分はRubyが好きなので、MicroPythonには手を出せていなかったのですが、ちょっとしたデバイス制御では積極的に使っていきたいと思いました。

yuuu

yuuu

2018年の年明けに組込み畑からやってきた、2児の父 兼 Webエンジニアです。 mockmockの開発・運用を担当しており、組込みエンジニア時代の経験を活かしてデバイスをプログラミングしたり、簡易的なIoTシステムを作ったりしています。主な開発言語はRuby、時々Go。