ESP32-S3とMicroPythonとPSRAM


この記事では以下のような話をする。

  • 基本的にESP32-S3-WROOMシリーズのモジュール上でMicroPythonを動かしたい人向けの話
  • ESP32-S3のモジュールの型番の見方
  • PSRAMを使うときにはどのファームを焼いたらいいか
  • Octal SPI接続のPSRAM (8MBのPSRAMは全部これ) を使用する場合、GPIO35, GPIO36, GPIO37がGPIOとして使えなくなる

ESP32-S3のモジュールの型番の見方

ESP32-S3-WROOMシリーズの型番はこんな構成になっている。

[ESP32-S3-WROOM]-[1 or 1U]-[N or H][Flash size][R+PSRAM Size]

PSRAMを搭載していないものは最後の “R+PSRAM Size” の箇所がない。

  • ESP32-S3-WROOM (ここは共通)
  • 1 or 1U : 1はPCBアンテナ搭載、Uは外部アンテナ用
  • N or H : Nは85℃まで、Hは105℃まで
  • Flash Size : Flashのサイズ。4MB、8MB、16MBがある。
  • R+PSRAM Size : PSRAMのサイズ。PSRAMを搭載していないものはこの箇所がない。2MBと8MBがある。R2なら2MB、R8なら8MBのPSRAMを搭載している。

PSRAMはQuad SPI (QSPI) とOctal SPI (OSPI) の2種類ある。2023/06/01の時点でリリースされているものは、2MBのものはQuad SPI、8MBのものはOctal SPIとなっている。型番でいうと、末尾に “R2″ がつくものは容量2MBでQuad SPI接続、末尾に”R8” がつくものは容量8MBでOctal SPI接続のPSRAMがついている。

Octal SPI接続のPSRAMを使うと一部のGPIOが使えなくなる

また、Octal SPIの場合は、GPIO35・GPIO36・GPIO37がGPIOとして使えなくなるので注意が必要。

データシートにはこうある。

In module variants that have embedded OSPI PSRAM, i.e., that embed ESP32-S3R8, pins IO35, IO36, and IO37 connect to the OSPI PSRAM and are not available for other uses.

ESP32-S3-WROOM-1 & ESP32-S3-WROOM-1U Datasheet

どういうことか。
Quad SPIは4本、Octal SPIは8本のデータ線を使用する。この本数を確保するために従来GPIOとして使っていたピンをPSRAMに使っているのだ。通信速度の代償なので仕方ないが、「Octal SPIのPSRAMが載ったモジュールを買っちゃったけど、PSRAM要らないからGPIOいっぱい使わせて!」という場合は、PSRAMを無効にしたファーム (GENERIC_S3など) を焼けばPSRAMが無効になるかわりにGPIO35〜37が解禁される。

PSRAMを使うときにはどのファームを焼いたらいいか

使用するモジュールのPSRAMの接続タイプによって、使用すべきファームウェアが違う。それぞれの接続タイプに対応したファームウェアを選ばないとPSRAMが使えない。目的に合ったものを選んで書き込む。

OctalにQuad用のファームを焼いたり、逆にQuadのモジュールにOctal用のファームをを焼いたりすると、動くことは動くけどPSRAMは使えない。一応、起動はする。

PSRAMが使えているかどうかチェックする

gcモジュールを使う。

>>> import gc
>>> gc.mem_free() + gc.mem_alloc()
8196480
>>> 

gc.mem_alloc()は使用済みメモリ、gc.mem_free()未使用メモリをバイト単位で返す。PSRAM無しだと100KBくらい。上の例だと8MBくらい使えている。