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と組み合わせても制御が可能
関連リンク
- Seeed Studio XIAO ESP32C3 - Seeed Studio
- Getting Started with Seeed Studio XIAO ESP32C3 - Seeed Wiki
- Seeed Studio XIAO ESP32C3 カテゴリーの記事一覧 - Seeed K.K. エンジニアブログ
- XIAO RP2040 x Expansion boardのMicroPythonサンプル - Seeed K.K. エンジニアブログ
変更履歴
日付 | 変更者 | 変更内容 |
---|---|---|
2023/2/17 | mnakai | 作成 |