🐥

Raspberry PiでESP32開発準備(MicroPtyhon)

2022/10/23に公開

Raspberry Piで作ろうとしても高騰している上に在庫もない状態が続きそうなのでESP32を使用してみることに。

全然ESP32をしらないまま秋月電子通商さんでESP32-DevKitC-VE ESP32-WROVER-E開発ボード 8MBを購入してみました。
https://akizukidenshi.com/catalog/g/gM-15674/

ファームウェアの選択

開発はPythonで行うけれど普通のPythonは使えずMicroPythonを使う必要があるらしい。
ダウンロードサイトではESP32といっても色々モデルがあり調べてみてどうやらEspressif社のESP32にしてみました。
https://micropython.org/download/esp32/

ではなくESP32 with SPIRAMにしました。
https://micropython.org/download/esp32spiram/

2022/10/23時点ではv1.19.1 (2022-06-18)が最新のようなのでbinファイルをRaspberry Piの任意のフォルダ(/tmp)にダウンロード

ESP32からESP32 with SPIRAM変更

ファームウェアのESP32を使用していたところちょっとしたプログラムを実行しただけでも”OSError: [Errno 12] ENOMEM”というメモリー不足と思われるエラーが発生、調べているとどうもheapメモリが少ない・・・ESP32-DevKitC-VE ESP32-WROVER-EはPSRAM(擬似SRAM)内蔵していてどうやらファームウェアを間違っていたいたため使えていなかったようです。
(ファームウェアがESP32の場合)

>>>import micropython
>>>micropython.mem_info()
stack: 736 out of 15360
GC: total: 111168, used: 11024, free: 100144
 No. of 1-blocks: 233, 2-blocks: 33, max blk sz: 24, max free sz: 6247
>>>import gc
>>> gc.mem_free()
96816
gc.mem_alloc()
17936

(ファームウェアがESP32 with SPIRAMの場合)

>>>import micropython
>>>micropython.mem_info()
stack: 736 out of 15360
GC: total: 4098240, used: 11792, free: 4086448
 No. of 1-blocks: 249, 2-blocks: 30, max blk sz: 24, max free sz: 255391

>>>import gc
>>> gc.mem_free()
4082576
>>> gc.mem_alloc()
17824

しっかり4MB増えました。
増えたおかげで今までエラーになっていたプログラムも問題なくうごきました。

ファームウェアの説明にもしっかり書いてありました。

The following files are daily firmware for ESP32-based boards with external SPIRAM (also known as PSRAM).

接続ポートの確認

Raspberry PiがESP32がどのように認識しているかdmesgと/dev/ttyを確認してみました。

dmesg

$ dmesg
[11969.089275] logitech-hidpp-device 0003:046D:4022.0004: HID++ 2.0 device connected.
[12889.692944] usb 1-1.2: new full-speed USB device number 4 using xhci_hcd
[12889.800989] usb 1-1.2: New USB device found, idVendor=10c4, idProduct=ea60, bcdDevice= 1.00
[12889.801026] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[12889.801042] usb 1-1.2: Product: CP2102N USB to UART Bridge Controller
[12889.801056] usb 1-1.2: Manufacturer: Silicon Labs
[12889.801069] usb 1-1.2: SerialNumber: f4f15496e1faeb1198f03ea4c6d924ec
[12889.902430] usbcore: registered new interface driver usbserial_generic
[12889.903070] usbserial: USB Serial support registered for generic
[12889.909943] usbcore: registered new interface driver cp210x
[12889.910001] usbserial: USB Serial support registered for cp210x
[12889.910104] cp210x 1-1.2:1.0: cp210x converter detected
[12889.919519] usb 1-1.2: cp210x converter now attached to ttyUSB0

自分の環境ではttyUSB0として接続されているようです。

ls /dev/tty*

$ ls /dev/tty*
/dev/tty    /dev/tty14  /dev/tty20  /dev/tty27  /dev/tty33  /dev/tty4   /dev/tty46  /dev/tty52  /dev/tty59  /dev/tty8
/dev/tty0   /dev/tty15  /dev/tty21  /dev/tty28  /dev/tty34  /dev/tty40  /dev/tty47  /dev/tty53  /dev/tty6   /dev/tty9
/dev/tty1   /dev/tty16  /dev/tty22  /dev/tty29  /dev/tty35  /dev/tty41  /dev/tty48  /dev/tty54  /dev/tty60  /dev/ttyAMA0
/dev/tty10  /dev/tty17  /dev/tty23  /dev/tty3   /dev/tty36  /dev/tty42  /dev/tty49  /dev/tty55  /dev/tty61  /dev/ttyUSB0
/dev/tty11  /dev/tty18  /dev/tty24  /dev/tty30  /dev/tty37  /dev/tty43  /dev/tty5   /dev/tty56  /dev/tty62  /dev/ttyprintk
/dev/tty12  /dev/tty19  /dev/tty25  /dev/tty31  /dev/tty38  /dev/tty44  /dev/tty50  /dev/tty57  /dev/tty63
/dev/tty13  /dev/tty2   /dev/tty26  /dev/tty32  /dev/tty39  /dev/tty45  /dev/tty51  /dev/tty58  /dev/tty7

接続前後で比較してみると/dev/ttyUSB0が増えていました。

esptoolでインストール

パッケージ版

今回はRaspberry PiとUSBで接続しesptoolからコマンドラインでインストールしました、OSパッケージを検索してみるとesptoolがあることが分かりさっそくインストール
手順は公式サイト通りです。
https://docs.micropython.org/en/latest/esp32/tutorial/intro.html#esp32-intro

ファームウェアをESP32に転送するために一度クリアしようとしたところ

$ esptool --port /dev/ttyUSB0 erase_flash
esptool.py v2.8
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... ESP32
Chip is ESP32D0WDQ5 (revision 3)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 8c:4b:14:15:ac:5c
Enabling default SPI flash mode...
Erasing flash (this may take a while)...

A fatal error occurred: ESP32 ROM does not support function erase_flash.

失敗・・・

esptool.py

今度はpipでesptool.pyをインストールして使用してみました。

sudo pip install esptool
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting esptool
  Downloading https://www.piwheels.org/simple/esptool/esptool-4.3-py3-none-any.whl (286 kB)
     |████████████████████████████████| 286 kB 132 kB/s 
Collecting bitstring>=3.1.6
  Downloading https://www.piwheels.org/simple/bitstring/bitstring-3.1.9-py3-none-any.whl (39 kB)
Requirement already satisfied: cryptography>=2.1.4 in /usr/lib/python3/dist-packages (from esptool) (3.3.2)
Requirement already satisfied: ecdsa>=0.16.0 in /usr/lib/python3/dist-packages (from esptool) (0.16.1)
Collecting reedsolo<=1.5.4,>=1.5.3
  Downloading reedsolo-1.5.4.tar.gz (271 kB)
     |████████████████████████████████| 271 kB 4.9 MB/s 
Requirement already satisfied: pyserial>=3.0 in /usr/lib/python3/dist-packages (from esptool) (3.5b0)
Building wheels for collected packages: reedsolo
  Building wheel for reedsolo (setup.py) ... done
  Created wheel for reedsolo: filename=reedsolo-1.5.4-py3-none-any.whl size=28950 sha256=e2c980f38e156282feee627522a071a83ddb25a2203aa31dcb33e2cfbd098a71
  Stored in directory: /root/.cache/pip/wheels/95/b4/42/5e2e520111266f1108f10a6bcc549454b905513ce4fca0a9e3
Successfully built reedsolo
Installing collected packages: reedsolo, bitstring, esptool
Successfully installed bitstring-3.1.9 esptool-4.3 reedsolo-1.5.4

インストールができたので今一度メモリをクリア

$ esptool.py --port /dev/ttyUSB0 erase_flash
esptool.py v4.3
Serial port /dev/ttyUSB0
Connecting.....
Detecting chip type... Unsupported detection protocol, switching and trying again...
Connecting.....
Detecting chip type... ESP32
Chip is ESP32-D0WD-V3 (revision v3.0)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 8c:4b:14:15:ac:5c
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 5.0s
Hard resetting via RTS pin...

成功、次にファームウェアの転送

$ esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash -z 0x1000 /tmp/esp32spiram-20220618-v1.19.1.bin
esptool.py v4.3
Serial port /dev/ttyUSB0
Connecting.....
Chip is ESP32-D0WD-V3 (revision v3.0)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 8c:4b:14:15:ac:5c
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Flash will be erased from 0x00001000 to 0x0017efff...
Compressed 1560976 bytes to 1029132...
Wrote 1560976 bytes (1029132 compressed) at 0x00001000 in 91.2 seconds (effective 137.0 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

開発エディタThonny

Raspberry Pi OSには標準でThonnyが標準でインストールされていたのでとりあえず使用してみることに、[ツール]→[Options]→インタプリタでMicropython(ESP32)を選択するだけで問題なくESP32が認識されコード実行することができました。

とりあえず準備完了

Discussion