HW-394 と書いてある ESP-WROOM-32 (ESP32) 開発ボードで CircuitPython をする

Python マイクロコントローラー
2023-12-24 18:20 (4ヶ月前) ytyng

AliExpress で、ESP32 で検索すると出てくる ESP-WROOM-32 搭載の開発ボードで、基盤に「HW-394」と書いてあるものを買いました。

4個入で16ドルでした。

画像

USBシリアルコンソールのチップで CH340C が実装されているものです。HW-394 という印字が無く、パターンが同じタイプもあるようです。

日本の Amazon でも、ESP-WROOM-32 + CH340C (もしくは別のシリアルコンソールチップ)の(謎メーカーの)同等商品が数多く売られていました。

HW-394 という印字が開発ボードの名前かどうかもわかりませんが、正式名称がわからないため、今後、この製品は HW-394 と呼びます。

後記: 後からわかったのですが、ESP32 DevKitC という規格でいろんなメーカーが作っているらしい

選定にあたっての注意

アリエク以外で売ってないですし、型番で検索しても公式ページなどは無いので怪しい商品です。

よく使う小さめのブレッドボードを使った時、基盤が大きすぎるため片側のピンしかアクセスできません。 そのためかなりおすすめしません。

画像

(写真では見えにくいですが、左側のピンしか使えません)

ESP32を使う場合、この商品は使わずに、CircuitPython の公式サイトで「ESP32」で検索すると出てくるボードを買うのが良いと思います。

https://circuitpython.org/downloads?q=ESP32

Seeed Studio XIAO ESP32C3 が、日本でも入手しやすく比較的安価で小さくて良いと思います。

開発方法

Mac (Apple Silicon M2) を使って開発します。

ESP32 は、USBシリアル接続を使わずに、ブラウザを使ってファイルを転送したりブラウザ内で開発したりできるようですが、今回はそれは行いません。Python ファイルの転送も USB シリアルポート経由で行います。

PyCharm でコードを書いて、シェルスクリプトでフラッシュの書き込みを行います。

USB シリアルの接続ポートを確認する

HW-394 を Mac に USB-C-C のケーブルで接続します。 ドライバのインストール等は不要です。

接続後、以下のコマンドでポートを確認します。

python -m serial.tools.list_ports

結果

/dev/cu.Bluetooth-Incoming-Port
/dev/cu.usbserial-110
2 ports found

Bluetooth-Incoming-Port は除外し、検出された /dev/cu.usbserial-110 が、今回作られた USB シリアルポートです。

ここで、シリアルポートが見えないようであれば、ケーブルを変えて、ハブを通さず直接接続したほうが良いです。途中で USB ハブをはさんでいるとうまく認識されないことがあります。

シェルスクリプト内でポートを扱う際、110 という数字は変動しそうなので、シェルスクリプトから取得する場合は私はこんな感じで探すようにしています。

port=$(ls -1 /dev/cu.usbserial* |head -n 1)

CircuitPython のファームウェアを書き込む

RP2040(RaspberryPi Pico 等) のように、uf2 をドラッグアンドドロップして書き込むことはできません。ESP32はストレージデバイスとして認識されないためです。

ファームウェア書き込みのために、esptool というライブラリを使います。

esptool のインストール方法

python3 -m pip install esptool

Pipenv を使う場合、以下のような Pipfile が良いと思います。

Pipfile

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
esptool = "*"

# 不具合を修正したフォークを使う
adafruit-ampy = {git = "git+ssh://git@github.com/ytyng/ampy.git"}

[requires]
python_version = "3.9"
pipenv install

adafruit-ampy については後ほど説明します。ファイルの転送に使います。

CircuitPython のファームウェアの取得

HW-394 用の CircuitPython のファームウェアは用意されていません。そのため、構成の似ている DOIT ESP32 Development Board のファームウェアを使います。

本来の製品用のものではないため、自己責任での使用をお願いします。

上記ページから DOWNLOAD .BIN NOW を押して、ダウンロードします。

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

esptool の write_flash を使って書き込みます。

#!/usr/bin/env zsh
port=$(ls -1 /dev/cu.usbserial* |head -n 1)

esptool.py --chip esp32 --port $port \
  --before default_reset --after hard_reset --no-stub \
  write_flash --flash_mode dio 0x0 \
  adafruit-circuitpython-doit_esp32_devkit_v1-en_US-8.2.9.bin

Python の REPL に接続する

シリアルポートに接続することで、ボード上の Python コンソール (REPL) が使えます。

screen コマンドで接続します。

#!/usr/bin/env zsh

port=$(ls -1 /dev/cu.usbserial* |head -n 1)

screen $port 115200
Adafruit CircuitPython 8.2.9 on 2023-12-06; ESP32 Devkit V1 with ESP32
>>> import board
>>> dir(board)
['__class__', '__name__', 'D1', 'D12', 'D13', 'D14', 'D15', 'D16', 'D17', 'D18', 'D19', 'D2', 'D21', 'D22', 'D23', 'D25', 'D26', 'D27', 'D3', 'D32', 'D33', 'D34', 'D35', 'D4', 'D5', 'I2C', 'LED', 'MISO', 'MOSI', 'RX', 'RX0', 'RX2', 'SCK', 'SCL', 'SDA', 'SPI', 'TX', 'TX0', 'TX2', 'UART', 'VN', 'VP', 'board_id']

Mac で書いた Python コードをフラッシュに書き込む

シリアルポートからファイルを書き込むには、 rshell ,mpfshell, ampy, および upydev といったツールが使えそうですが、どれも開発ボードが MicroPython でないと使えないようです。

例えば、MicroPython では ubinascii というモジュール名なのが、CircuitPython では binascii となっていたりと、モジュール名が違うものがいくつかあるため、MicroPython 用のライブラリはそのまま CircuitPython では使えない場合が多いです。多くは、MicroPython 用のものは先頭に「u」がつく場合が多いです。

この中では ampy が一番シンプルなツールで CircuitPython への対応が容易そうなのでフォークして修正して使いました。本家では既にプルリクエストが上がっていますが、メンテが放置されているらしくマージされていません。

修正済みampy

修正済みの ampy をインストールする

上で書いた Pipfile でインストールするか、

python3 -m pip install git+https://github.com/ytyng/ampy.git

でインストールしてください。

Python コードを書く

基盤に実装されている D2 LEDを点滅させるスクリプトを書きます。

blink_led_d2.py

import digitalio
import time
import board

print('brink_led.py loaded.')

led_pin = digitalio.DigitalInOut(board.D2)
led_pin.direction = digitalio.Direction.OUTPUT

while True:
    led_pin.value = True
    time.sleep(0.1)
    led_pin.value = False
    time.sleep(1.9)

フラッシュに書き込む

deploy.sh

```shell

!/usr/bin/env zsh

export AMPY_PORT=$(ls -1 /dev/cu.usbserial* |head -n 1)

cd $(dirname $0)

ampy put blink_led_d21.py /code.py ````

フラッシュの /code.py としてコピーしした後、EN と書いてある基板上のボタン(リセットボタン)を押すと実行され、Lチカします。

画像

ピン番号を変更することで、他のピンでもLチカできることを確認しました。

画像

Current rating: 5

Comments

Archive

2024
2023
2022
2021
2020
2019
2018
2017
2016
2015
2014
2013
2012
2011