Seeed Studio XIAO ESP32C3でMicroPython

Seeed K.K.の中井です。

デバイスを稼働させたときにどのコードが書かれていたのか思い出せない場合がたまにあるのですが、MicroPythonなどではコード自体がデバイスに保存されているのでこの悩みが無く助かっています。

そこで、Seeed Studio XIAO ESP32C3でもMicroPythonが使えないかと試してみたところ、動作確認ができたのでご紹介したいと思います。

ファームウェアの書き込み作業などは、Windows11にPythonがインストールされている環境のPCを使っています。

ファームウェアのダウンロード

Seeed Studio XIAO ESP32C3で動作確認がとれたファームウェアは「ESP32-C3 with USB」です。これの最新バージョンv1.19.1をダウンロードしておきます。

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

書き込みにはesptoolを使います。pipでインストールしておきます。

pip install esptool

手順にあるように一度フラッシュを消去し、その後に書き込みます。 下記コマンドを実行前にXIAO ESP32C3をブートローダーモード(Download Boot Mode)で起動します。BOOTボタンを押しながら電源をON(または、RESETボタンを押してリセット)します。

esptool.py erase_flash
esptool.py write_flash -z 0x0 .\esp32c3-usb-20220618-v1.19.1.bin

複数のデバイスを接続していなければシリアルポートの指定--port COMxは不要のようです。

ファームウェアさえ書き込んでしまえば、Thonnyなどで認識するようになります。

無線LANを動かしてみる

MicroPythonのサンプルコードを使って動作確認してみました。

ただし、残念ながら無線LANに対応したサンプルはない様子のなので、HTTPサーバー(http_server_simplistic.py)をカスタマイズして行いました。アクセスポイントとして動作するように下記を追加。

--- http_server_simplistic.py.orig
+++ http_server_simplistic.py
@@ -12,6 +12,13 @@
 Hello #%d from MicroPython!
 """

+import network
+ap = network.WLAN(network.AP_IF)
+ap.config(essid='XIAO ESP32C3', authmode=network.AUTH_WPA2_PSK, password='12345678')
+ap.ifconfig(('192.168.100.1','255.255.255.0','192.168.100.1','8.8.8.8'))
+while ap.active(True) == False:
+    pass
+print("Successful starting up as Access Point.")

 def main():
     s = socket.socket()

スマホなどで"XIAO ESP32C3"に接続し、ブラウザから"192.168.100.1"にアクセスすることができました。

BLEを動かしてみる

BLEはサンプルコードのble_simple_peripheral.pyを使ってみました。 スマホアプリのLightBlueなどを用いると動作の確認することができます。

コードを実行するとアプリでは「ESP32」として見えます。UARTのサンプルなので、TXとRXの2つのキャラクタリスティックが確認できます。

TXとRXは右上のフォーマットを「UTF-8」にすることで文字列を送受信することができました。

Expansion Boardを使って各インターフェースの確認

Seeed Studio XIAO Expansion Boardと組み合わせて各インターフェースの動作も確認しました。 簡単なサンプルを紹介します。

組み合わせた場合のピンマップは下記です

GPIO / ボタンスイッチ

GPIOの制御方法はESP32用クイックリファレンスにあります。

下記は割り込みを使ってボタン入力を検出するサンプルとなります。

from machine import Pin

def handler(p):
    status = 'Released' if p.value() == 1 else 'Pushed'
    print(status)

button = Pin(3, Pin.IN, Pin.PULL_UP)
button.irq(trigger=Pin.IRQ_RISING | Pin.IRQ_FALLING, handler=handler)

while True:
    pass
PWM / ブザー

PWMを使ってブザーを1秒間鳴らすサンプルです。

from machine import Pin, PWM
import time

buzzer = PWM(Pin(5, Pin.OUT))
buzzer.freq(440)
buzzer.duty_u16(32768)
time.sleep(1.0)
buzzer.deinit()
I2C / OLEDディスプレイ

ESP32-C3内蔵RTCから日付を取得してOLEDに表示するサンプルです。 ssd1306.pyを本体に保存しておく必要があります。

https://github.com/micropython/micropython/blob/v1.19.1/drivers/display/ssd1306.py

from ssd1306 import SSD1306_I2C
from machine import Pin, I2C, RTC
import time

intrtc = RTC()

i2c = I2C(0, scl=Pin(7), sda=Pin(6), freq=100000)
oled = SSD1306_I2C(128, 64, i2c)
 
while True:  
    oled.fill(0)
    oled.text('{0:04d}/{1:02d}/{2:02d}'.format(*intrtc.datetime()),0,0)
    oled.text('{4:02d}:{5:02d}:{6:02d}'.format(*intrtc.datetime()),0,10)
    oled.show()
    time.sleep(0.1)
UART

UARTをPCと接続し、PCから送られてきた文字列をエコーバックするサンプルです。

from machine import UART

uart = UART(1, tx=21, rx=20)
uart.init(115200, bits=8, parity=None, stop=1)

while True:
    if uart.any():
        data = uart.read()
        uart.write(data)
SPI / SDカード

SDカードからデータを読み出すサンプルです。 SDカードは事前にPCなどでFAT32にフォーマットし、README.txtを保存してあるものを利用します。

実行する前にはsdcard.pyを本体にコピーしておく必要があります。

https://github.com/micropython/micropython/blob/v1.19.1/drivers/sdcard/sdcard.py

from machine import Pin, SPI
import os, sdcard

spi = SPI(1, sck=Pin(8), miso=Pin(9), mosi=Pin(10))
sd = sdcard.SDCard(spi, Pin(4))

os.mount(sd, '/sd')
os.chdir('sd')
print(os.listdir())
print()
print(open('README.txt').read())

ただし、いくつかのSDカードを試してみましたが、マウント時にエラーとなるものがあるようです。対象のSDカードをPCで認識させるとエラーはないため、SDカード自体の故障ではないようです。

まとめ

ということで、Seeed Studio XIAO ESP32C3でもMicroPythonを無事(?)動作させることができました。

  • ファームウェアは「ESP32-C3 with USB」を使う
  • 無線LANとBLEも利用できる
  • Expansion boardと組み合わせても制御が可能

関連リンク

変更履歴

日付 変更者 変更内容
2023/2/17 mnakai 作成