ESP32-WROOM-32
ESP32-WROOM-32 (旧 ESP-WROOM-32) に関する記事です。
ESP32-WROOM-32
Espressif Systems 社の ESP32-WROOM-32 は Arduino ではないのですが、Arduino IDE で Arduino ライクな使い方ができます。
ESP32-WROOM-32 の SoC が ESP32 (ESP32-D0WDQ6) で、ESP32 の MCU (CPU) が "32bit で 240MHz デュアルコア" の Tensilica Xtensa LX6 です。520KB の SRAM と 4MB の SPI フラッシュメモリを持っています。実際に書き込めるスケッチの最大サイズはファームウェアに依存しますが、最低でも Arduino UNO (ATmega328P) の 10 倍以上のメモリが使えます。
ESP32 には以下のようなバリエーションがあります。
ESP32-D0WD
Dual core
QFN 5x5
48
520KB SRAM 448KB ROM 16KB SRAM in RTC
N/A
ESP32-WROOM-32D ESP32-WROOM-32U ESP32-WROVER-B ESP32-WROVER-IB
ESP32-D0WDQ6
QFN 6x6
N/A
ESP32-WROOM-32
ESP32-D2WD
QFN 5x5
2MB
ESP32-S0WD
Single core
QFN 5x5
N/A
ESP32-SOLO-1
ESP32 搭載製品で技適を通っているのは上記の表 (Module) に載っているものだけ であり、ESP32-D0WDQ6 搭載の ESP32-WROVER / ESP32-WROVER-I や AI-THINKER (安信可科技) 社の ESP シリーズは技適を通っていません。
この記事中では可能な限り元ネタとなった Espressif のドキュメントへのリンクを貼るようにしていますが、Espressif はしばしばリンク切れを起こします ので、リンク切れしているドキュメントは以下から探してみてください。
存在しなくなったドキュメントは [コピー] を用意してある事があります。
See Also:
購入
ESP32-WROOM-32 単体
どこでも購入できます。
ESP32-WROOM-32
ESP32-D0WDQ6
QFN 6x6
Dual Core
Internal
4MB
N/A
ESP32-WROVER
Internal
8MB
ESP32-WROVER-I
External
ESP32-WROOM-32D ESP32-WROOM-32E
ESP32-D0WD (ESP32-D0WDQ5)
QFN 5x5
Internal
N/A
ESP32-WROOM-32U ESP32-WROOM-32UE
External
ESP32-WROVER-B ESP32-WROVER-E
Internal
8MB
ESP32-WROVER-IB ESP32-WROVER-IE
External
ESP32-SOLO-1
ESP32-S0WD
Single Core
Internal
N/A
[ESP32-WROOM-32 (Dual Core / QFN 6x6)]
最初期の ESP32 モジュール。チップバグ のあるリビジョンがある。
[ESP32-WROOM-32D (Dual Core / QFN 5x5)]
SoC が変更された ESP32 モジュール。ESP32-WROOM-32 と性能の違いはない。
[ESP32-WROOM-32E (Dual Core / QFN 5x5)]
基本的にESP32-WROOM-32D と同じ。脆弱性 の解消と、17~22 ピンが NC になっている (GPIO 6~11) 事が大きな違い。
[ESP32-WROOM-32U (Dual Core / QFN 5x5 / 外部アンテナ)]
ESP32-WROOM-32D の外部アンテナ版。
[ESP32-WROOM-32UE (Dual Core / QFN 5x5)]
基本的にESP32-WROOM-32U と同じ。脆弱性 の解消と、17~22 ピンが NC になっている (GPIO 6~11) 事が大きな違い。
[ESP32-WROVER 系]
SoC は ESP32-WROOM-32 と同じで、主な違いは次の通りです:
モジュールサイズが大きい。
PSRAM (擬似 SRAM) が追加されている。
GPIO 16 および 17 が使えない。
[ESP32-SOLO-1 (Single Core / QFN 5x5)]
シングルコアの ESP32 モジュール。ESP32-WROOM-32 / ESP32-WROVER とは SoC が異なります。
ESP32-WROOM-32 だけでは何もできません。最低でも 3.3V 電源 と USB<->シリアル変換モジュール が別途必要となります。
ESP32-WROOM-32 ブレークアウトボード
ESP32-WROOM-32 はそのままでは使いにくい (ピン間隔 1.27mm) ので、ブレッドボードに挿せるようなブレークアウトボードも各社から出ています。
ブレッドボードで使うには別途ピンヘッダが必要です。ピンソケットでもいいかもしれません。
チップ抵抗とチップコンデンサもあると便利です。
ESP32-WROOM-32 開発ボード
USB シリアル変換等が含まれる開発ボードです。買ったその日から ESP32-WROOM-32 を試すことができます。
開発ボードも種類が増えてきましたが、最初の一つなら ESP32-DevKitC をオススメします。
ESP32-WROOM-32 の概要
ピンアウト
ピンアウトは以下のようになっています。
最低限、EN を 10kΩ でプルアップして電源 (3.3V) を繋げば動作します。
赤字 のピンは内部 FLASH との接続に使用されているため利用できません。
青字 のピンは入力専用です。
緑字 のピンは起動に関係があるため、プルアップまたはプルダウンされている事があります。
See Also:
起動モード
起動モードを決定するピンは 5 つあります。
内部電圧:
※ HIGH だとシリアルへ Enter 送信でビルトイン BASIC が起動する。
※ レジスタビットの設定で初期値を変更可能。
起動モード
UART Download
SPI Flash Boot
UART Download
SPI Flash Boot
※ UART Download Mode がプログラム書き込み時で、SPI Flash Boot Mode がプログラム実行時のモードです。
シリアルへのブートログ出力
SDIO スレーブタイミング
入力: 立下がり 出力: 立下がり
入力: 立下がり 出力: 立上がり
入力: 立上がり 出力: 立下がり
入力: 立上がり 出力: 立上がり
※ レジスタビットの設定で初期値を変更可能。
オレンジ の設定がデフォルトになります。
ブレイクアウトボード各部詳細
頂き物のブレークアウトボードです。ブレッドボードで使えるように、一部ピンソケットにしてあります。
表面の GND と 3V3 の間に 0.1μF のチップコンデンサ を、3V3 と EN の間に 10kΩのチップ抵抗 を取り付けました (0805 / 2012 でギチギチです。後で取り付けるなら 0603 / 1608 がいいと思います)。
別バージョンです。こちらはピンソケットを立ててみました。Arduino Uno みたいな使い方ができます。
真ん中の穴はハンダしておくと安定性と放熱性が上がるらしいのですが、ハンダごてのワット数が小さいとハンダできない ので注意が必要です。この穴と ESP32-WROOM-32 が熱を吸ってしまい、うまくハンダできません...放熱性能は確かだと言えるでしょう。
ワット数の大きなハンダごてを使う
ハンダごてにハンダを盛って、溶けたハンダを穴に向かって投げつける
ハンダ付けするのをあきらめる
三択です (w
生の ESP32-WROOM-32 を使うには以下の図 (ESP32-WROOM-32 Datasheet: 3.5.2 Peripheral Schematics ) が参考になると思います。
ESP32-WROOM-32 は ESP-WROOM-02 よりも必要な外部パーツが少ないので、開発ボードではなく、ブレークアウトボードだけでもいいかもしれませんね。
See Also:
ESP32-DevKitC 各部詳細
ESP32-DevKitC V2 各部詳細
開発ボード (ESP32 Core Board / DevKitC) です。裏面にあるように Ver2 のボードです。
普通のピンヘッダで 19ピンx2列のものをブレッドボードに挿したら、モノによってはちゃんと刺さらないか、抜く時に大変だと思います。ピンヘッダはハンダされていない方がよかったなぁ...。
このボード、Windows だと自動プログラムできない / 自動プログラムが不安定 って報告があったのですが、ごく普通に自動プログラムできていますね。なお、自動プログラムに問題がある場合の対処法はコンデンサ容量の増量です (0.22μF~2.2μF)。
C9 コンデンサを取り換える (1005 / 0402 サイズ)
C9 コンデンサの横に並列にコンデンサを取り付ける (多少サイズが違っていても構わない&隣の R11 とブリッジしても構わない)
ESP32-WROOM-32 モジュールのGND と EN 端子間にコンデンサを取り付ける
ESP32-DevKitC ボードのGND と EN 端子間にコンデンサを取り付ける
ブレッドボードの GND と EN 端子間にコンデンサを取り付ける
対処方法は上に行くほど難易度が高いです。まずはブレッドボードで試してみる事をオススメします。
See Also:
ESP32-DevKitC V4 各部詳細
V4 ボードには様々な ESP32 モジュールが載ったものがあります。購入の際は載っている ESP32 モジュールをよく確認してください。
以下は秋月電子で購入した V4 ボードで、ESP32-WROOM-32D が載っています (ESP32-DevKitC-32D)。
V4 ボードには USB シリアル変換として Silicon Labs 社の CP2102N が載っており、Arduino-ESP32 の boards.txt に定義を追加する事によってスケッチを 3M (3000000) baud で転送する事が可能 です。
##############################################################
esp32.name=ESP32 Dev Module
esp32.upload.tool=esptool
esp32.upload.maximum_size=1310720
esp32.upload.maximum_data_size=327680
esp32.upload.wait_for_upload_port=true
esp32.serial.disableDTR=true
esp32.serial.disableRTS=true
esp32.build.mcu=esp32
esp32.build.core=esp32
esp32.build.variant=esp32
esp32.build.board=ESP32_DEV
(中略)
esp32.menu.UploadSpeed.921600=921600
esp32.menu.UploadSpeed.921600.upload.speed=921600
esp32.menu.UploadSpeed.115200=115200
esp32.menu.UploadSpeed.115200.upload.speed=115200
esp32.menu.UploadSpeed.256000.windows=256000
esp32.menu.UploadSpeed.256000.upload.speed=256000
esp32.menu.UploadSpeed.230400.windows.upload.speed=256000
esp32.menu.UploadSpeed.230400=230400
esp32.menu.UploadSpeed.230400.upload.speed=230400
esp32.menu.UploadSpeed.460800.linux=460800
esp32.menu.UploadSpeed.460800.macosx=460800
esp32.menu.UploadSpeed.460800.upload.speed=460800
esp32.menu.UploadSpeed.512000.windows=512000
esp32.menu.UploadSpeed.512000.upload.speed=512000
esp32.menu.UploadSpeed.960000=960000
esp32.menu.UploadSpeed.960000.upload.speed=960000
esp32.menu.UploadSpeed.1000000=1000000
esp32.menu.UploadSpeed.1000000.upload.speed=1000000
esp32.menu.UploadSpeed.1200000=1200000
esp32.menu.UploadSpeed.1200000.upload.speed=1200000
esp32.menu.UploadSpeed.1500000=1500000
esp32.menu.UploadSpeed.1500000.upload.speed=1500000
esp32.menu.UploadSpeed.2000000=2000000
esp32.menu.UploadSpeed.2000000.upload.speed=2000000
esp32.menu.UploadSpeed.3000000=3000000
esp32.menu.UploadSpeed.3000000.upload.speed=3000000
esp32.menu.DebugLevel.none=None
esp32.menu.DebugLevel.none.build.code_debug=0
esp32.menu.DebugLevel.error=Error
esp32.menu.DebugLevel.error.build.code_debug=1
esp32.menu.DebugLevel.warn=Warn
esp32.menu.DebugLevel.warn.build.code_debug=2
esp32.menu.DebugLevel.info=Info
esp32.menu.DebugLevel.info.build.code_debug=3
esp32.menu.DebugLevel.debug=Debug
esp32.menu.DebugLevel.debug.build.code_debug=4
esp32.menu.DebugLevel.verbose=Verbose
esp32.menu.DebugLevel.verbose.build.code_debug=5
赤字の部分が追記箇所です。
なお、ESP32-DevKitC (V1/V2) (CP2102) でもスケッチを 1.5M (1500000) baud で転送できる事があります。
See Also:
ピンアウト
ピンアウトは以下のようになっています。
No は ESP32-WROOM-32 でのピン番号です。
赤字 のピンは内部 FLASH との接続に使用されているため利用できません。
青字 のピンは入力専用です。
緑字 のピンは起動に関係があるため、プルアップまたはプルダウンされている事があります。
#32 (NC) は内部で #37 (IO23) と結線されています。
類似品 (DOIT V1)
紛らわしい見た目をしていますが、ESP32-WROOM-32 モジュールが飛び出していないのが V1 (DOIT 社製) で、飛び出ているのが V2 (espressif 社製) です。四隅に穴が開いてるのが V1 (DOIT 社製)です。
ESP32.net さん 情報によると、青い espressif 社製 V1 もある との事です。V1 のボードは自動プログラムで問題が発生することがあります。DOIT V1 は EN<->GND 間にコンデンサが取り付けられていません。
See Also:
ブレッドボード
ESP32-DevKitC はピン数が多く、安物中華ブレッドボードを使うと挿すのも困難、外すのも困難です。しかも、片側一列しかピンが空かないので、ジャンパーワイヤーでの配線も面倒です。普通のブレッドボードを二つ上下に連結するのが最も簡単な解決方法ですが、安物中華ブレッドボードの場合、連結するとピッチがズレてしまって挿しにくい事があります。
なんだかんだで ESP-WROOM-02 / ESP32-WROOM-32 開発ボード用のブレッドボードにはサンハヤトの SAD-101 や E-Call の EIC-3901 が最適だと思います。
普通のブレッドボードは A-E・F-J の 5 穴ですが、これは A-F・G-L の 6 穴なので片側一列、もう片側は二列空きます。加えて縦にも横にも連結できます。
See Also:
プロトタイプ基板
ESP32-DevKitC 専用のプロトタイプ基板もあります。
スイッチサイエンス ESPr Developer 32 各部詳細
スイッチサイエンスの ESPr Developer 32 です。
ピンヘッダは付属しないので秋月の細ピンヘッダ辺りを取り付けましょう。あと、USB 端子のランドにはハンダではなくフラックスが詰まってる 気がしたので、強度を稼ぐためにハンダを盛っておきました。
この製品の特長は、
名前の通り、ESPr Developer の ESP32-WROOM-32 版である。
ESPr Developer 用の拡張ボードがそのまま使える。
但し、上記理由によりピン配置が他の開発ボードに比べて特殊。
幅はESPr Developer 互換なため普通のブレッドボード に挿せる。
片側 20 ピンとボードが長い ため、ハーフサイズのブレッドボード では殆ど何もできない (だって ESPr Developer は片側 10 ピンなのよ?)。
USB シリアルに FTDI FT231XS を採用している (ESP32-DevKitC は CP2102)。
IO32 および IO33 が使えない。
恐らくコンデンサの問題は発生しない。
突入電流対策が施されている。
旧 FRISK ケースに収まる。
IO6~IO11 と一番下の左右 GND を削ればもう少し短くできたんではなかろうかと思いますが、総じていい開発ボード だと思います。
See Also:
ピンアウト
ピンアウトは以下のようになっています。
No は ESP32-WROOM-32 でのピン番号です。
赤字 のピンは内部 FLASH との接続に使用されているため利用できません。
青字 のピンは入力専用です。
緑字 のピンは起動に関係があるため、プルアップまたはプルダウンされている事があります。
#32 (NC) は結線されていません。NC と結線されている訳でもありません。NC の場所にあるピンは ESPr Developer では RESET でした。
#8 (IO32) および #9 (IO33) は利用できません。
裏面の空きパッド
裏面の空きパッドにはパーツを追加できます。
C7 : 表面の C8 (0.1μF) と並列に 0805 / 2012 チップコンデンサを取り付けられます。データシート に倣うと 10μF を取り付けるといいようです。
X1 : 表面実装クリスタル FC-135 が取り付けられます。
C9 , C10 : X1 を取り付けた場合、ここに 12pF の 0603 / 1608 チップコンデンサを取り付けます。
クリスタルを取り付けないのであれば、パッド X1 から #8 (IO32) と #9 (IO33) の信号を引き出すことができます。
See Also:
ボードの追加
Arduino IDE にこのボードの定義を追加してみます。環境構築がまだの方は先にセットアップ のトピックを読んでください。
ESP32 の boards.txt をテキストエディタで開く。 このサイトのセットアップ の通りにやった方は Arduino インストールフォルダ\hardware\espressif\esp32 にあるはずです。
以下を追記する。
##############################################################
espr-developer-32.name=SWITCH SCIENCE ESPr Developer 32
espr-developer-32.upload.tool=esptool
espr-developer-32.upload.maximum_size=1310720
espr-developer-32.upload.maximum_data_size=294912
espr-developer-32.upload.wait_for_upload_port=true
espr-developer-32.serial.disableDTR=true
espr-developer-32.serial.disableRTS=true
espr-developer-32.build.mcu=esp32
espr-developer-32.build.core=esp32
espr-developer-32.build.variant=esp32
espr-developer-32.build.board=ESP32_DEV
espr-developer-32.build.f_cpu=240000000L
espr-developer-32.build.flash_mode=dio
espr-developer-32.build.flash_size=4MB
espr-developer-32.build.boot=bootloader
espr-developer-32.menu.FlashMode.qio=QIO
espr-developer-32.menu.FlashMode.qio.build.flash_mode=dio
espr-developer-32.menu.FlashMode.qio.build.boot=bootloader_qio
espr-developer-32.menu.FlashMode.dio=DIO
espr-developer-32.menu.FlashMode.dio.build.flash_mode=dio
espr-developer-32.menu.FlashMode.qout=QOUT
espr-developer-32.menu.FlashMode.qout.build.flash_mode=dout
espr-developer-32.menu.FlashMode.qout.build.boot=bootloader_qio
espr-developer-32.menu.FlashMode.dout=DOUT
espr-developer-32.menu.FlashMode.dout.build.flash_mode=dout
espr-developer-32.menu.FlashFreq.80=80MHz
espr-developer-32.menu.FlashFreq.80.build.flash_freq=80m
espr-developer-32.menu.FlashFreq.40=40MHz
espr-developer-32.menu.FlashFreq.40.build.flash_freq=40m
espr-developer-32.menu.FlashSize.4M=4MB (32Mb)
espr-developer-32.menu.FlashSize.4M.build.flash_size=4MB
espr-developer-32.menu.FlashSize.2M=2MB (16Mb)
espr-developer-32.menu.FlashSize.2M.build.flash_size=2MB
espr-developer-32.menu.FlashSize.2M.build.partitions=minimal
espr-developer-32.menu.UploadSpeed.115200=115200
espr-developer-32.menu.UploadSpeed.115200.upload.speed=115200
espr-developer-32.menu.UploadSpeed.256000.windows=256000
espr-developer-32.menu.UploadSpeed.256000.upload.speed=256000
espr-developer-32.menu.UploadSpeed.230400=230400
espr-developer-32.menu.UploadSpeed.230400.upload.speed=230400
espr-developer-32.menu.UploadSpeed.230400.windows.upload.speed=256000
espr-developer-32.menu.UploadSpeed.460800.linux=460800
espr-developer-32.menu.UploadSpeed.460800.macosx=460800
espr-developer-32.menu.UploadSpeed.460800.upload.speed=460800
espr-developer-32.menu.UploadSpeed.512000.windows=512000
espr-developer-32.menu.UploadSpeed.512000.upload.speed=512000
espr-developer-32.menu.UploadSpeed.921600=921600
espr-developer-32.menu.UploadSpeed.921600.upload.speed=921600
espr-developer-32.menu.UploadSpeed.960000=960000
espr-developer-32.menu.UploadSpeed.960000.upload.speed=960000
espr-developer-32.menu.UploadSpeed.1000000=1000000
espr-developer-32.menu.UploadSpeed.1000000.upload.speed=1000000
espr-developer-32.menu.UploadSpeed.1200000=1200000
espr-developer-32.menu.UploadSpeed.1200000.upload.speed=1200000
espr-developer-32.menu.UploadSpeed.1500000=1500000
espr-developer-32.menu.UploadSpeed.1500000.upload.speed=1500000
espr-developer-32.menu.UploadSpeed.2000000=2000000
espr-developer-32.menu.UploadSpeed.2000000.upload.speed=2000000
espr-developer-32.menu.UploadSpeed.3000000=3000000
espr-developer-32.menu.UploadSpeed.3000000.upload.speed=3000000
espr-developer-32.menu.DebugLevel.none=None
espr-developer-32.menu.DebugLevel.none.build.code_debug=0
espr-developer-32.menu.DebugLevel.error=Error
espr-developer-32.menu.DebugLevel.error.build.code_debug=1
espr-developer-32.menu.DebugLevel.warn=Warn
espr-developer-32.menu.DebugLevel.warn.build.code_debug=2
espr-developer-32.menu.DebugLevel.info=Info
espr-developer-32.menu.DebugLevel.info.build.code_debug=3
espr-developer-32.menu.DebugLevel.debug=Debug
espr-developer-32.menu.DebugLevel.debug.build.code_debug=4
espr-developer-32.menu.DebugLevel.verbose=Verbose
espr-developer-32.menu.DebugLevel.verbose.build.code_debug=5
Arduino IDE を開いていれば再起動する。
すると Arduino IDE で SWITCH SCIENCE ESPr Developer 32 が使えるようになります。
また、このボードは USB シリアルに FTDI FT231XS を採用しているので、スケッチを 3M (3000000) baud で転送する事が可能 です。
CQ 出版 IoT Express 各部詳細
CQ 出版の IoT Express です。
この製品の特長は、
組み立てキットと完成品がある。
Arduino UNO のピンソケットと物理的な互換性がある。
Arduino UNO 用のシールドは電圧の関係で接続できないものも多く、ICSP コネクタがないため SPI 接続のシールドも動作しないものが多い。
自動書き込み回路がない (後継の IoT Express MkII にはある)。
USB シリアルモジュール上の LED がクソ眩しい。
See Also:
ピンアウト
ピンアウトは以下のようになっています。
シルク印刷の方を見ると混乱しますのでご注意。USB シリアルモジュールを選ぶなら FT231XS (U2UART231P42) 一択です。
セットアップ
スケッチを書き込むための準備です。
ハードウェア (開発ボードの場合には読み飛ばしてください)
ESP32-WROOM-32 にスケッチを書き込むには電源と何らかの USB<->シリアル変換モジュール が必要です。
TXD / RXD と GND をつなぐいつものやり方です。
TXD0 (IO1)
RXD
RXD0 (IO3)
TXD
GND
GND
後述の自動プログラム回路 を使わない、または "RTS / DTR の引き出せない USB<->シリアル変換モジュールしか持っていない" 場合にはボタンの実装が必要 となります。
ボタンはチャタリング (バウンシング) を考慮しないのであれば、IO0<->GND 間 (FLASH / KEY / BOOT ボタン) と EN<->GND 間 (EN / RST ボタン) にスイッチを取り付けるだけです。
See Also:
ソフトウェア
ESP32-WROOM-32 を Arduino IDE で使うには Arduino core for the ESP32 をインストールします。二通りのインストール方法がありますが、安定板をインストールするには、ライブラリマネージャを使ったやり方を行ってください。
[Arduino core for the ESP3 のインストール (ライブラリマネージャ使用)]
[ファイル | 環境設定] を開く
[追加のボードマネージャの URL:] に https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json を追加する (以前は https://dl.espressif.com/dl/package_esp32_index.json でした)。
[ツール | ボード | ボードマネージャ...] を開く
"ESP32" を検索し、"esp32 by Espressif Systems" をインストールする。
[Arduino core for the ESP32 のインストール (手動)]
https://github.com/espressif/arduino-esp32 から [Clone or download] ボタンを押し、zip アーカイブを取得。
アーカイブを適当な場所に解凍。
Arduino インストールフォルダの中の hardware フォルダに、espressif サブフォルダを作成。
espressif フォルダの中に esp32 サブフォルダを作成。
解凍したアーカイブの中身を esp32 フォルダ内にコピー。
階層は以下のようになる。
Arduino インストールフォルダ\hardware\espressif\esp32\tools にある get.exe を右クリックし、[管理者として実行] で実行。
コマンドプロンプトが消えるまでしばらく待つ (あまりにも時間が掛かるようなら〔Enter〕キーを叩いてみる)。
以上で ESP32-WROOM-32 が Arduino IDE から使えるようになりました。
See Also:
はい、ちょっと待って!
Arduino IDE で開発する前に、まずは工場出荷時のファームウェアをバックアップ しましょう。
@echo off
SET COM_PORT=COM4
esptool.exe --chip esp32 --port %COM_PORT% --baud 921600 read_flash 0 0x400000 esp32_firmware.bin
このスクリプトを Firmware_Backup.cmd という名前で Arduino インストールフォルダ\hardware\espressif\esp32\tools に保存します。
@echo off
SET COM_PORT=COM4
esptool.exe --chip esp32 --port %COM_PORT% --baud 921600 write_flash 0 esp32_firmware.bin
このスクリプトを Firmware_Restore.cmd という名前で Arduino インストールフォルダ\hardware\espressif\esp32\tools に保存します。
そして、Firmware_Backup.cmd を管理者として実行 してください。Arduino インストールフォルダ\hardware\espressif\esp32\tools フォルダに 4MB の esp32_firmware.bin が生成されます。赤字 の部分はご自分の環境に合わせて適宜書き換えてください。
See Also:
自動プログラム
開発ボードを使わない場合、何らかの自動プログラム回路 を付けておけばスケッチの書き込みが随分楽になります。自動プログラム回路は ESP-WROOM-02 のものを流用できます 。
この ESP32 ブレークアウトボードの EN ピンは 10kΩ抵抗でプルアップされている事に注意してください。EN<->3V3 間に10kΩ抵抗が必要 です。
個人的にはN-ch MOSFET の回路 がスッキリしていてオススメです。何度もブレッドボード上にトランジスタの回路 を作るのは面倒ですから。
TXD0 (IO1)
RXD
RXD0 (IO3)
TXD
ID0
6 D2
EN
8 D1
2 G1
DTR
4 G2
RTS
自動プログラムが安定しない場合には、EN <-> GND 間 に 1nF (0.001μF / 1000pF)~0.1μF のコンデンサ を入れてみてください (この図の C3 コンデンサに相当 )。
Windows で USB<->シリアル変換に CP2102 を使う場合 には EN <-> GND 間にもっと大きな 0.22μF~2.2μF のコンデンサ を入れてください。CP2102 を使っている開発ボードも DOIT V1 の回路図通り ならコンデンサを追加する必要があると思います。
現在では自動プログラムに失敗すると esptool がタイミングを変更してリトライする ようなので、EN <-> GND 間コンデンサは必須ではないようです。但し、リトライが発生すると "Connecting..." でちょっと待たされますので、やっぱりコンデンサは入れておいた方がいいと思います。リトライしないで済むコンデンサ容量は先述の通りです。
See Also:
Blink
L チカ (Blink) のサンプルスケッチは [ファイル | スケッチ例 | 01.Basics | Blink] です。コンパイルするには...
ボード: ESP32 Dev Module (お持ちのボードがメニューにあればそれを)
ポート: USB<->シリアル変換モジュールのポート
基本的にこの 2 つを指定するだけです。
オンボード LED が存在しない開発ボードも多く、コンパイル時に LED_BUILTIN が未定義エラーになる事があります。LED_BUILTIN が定義されていないボードをお使いの場合には、LED_BUILTIN の部分を LED を接続したピン番号で置き換えてください。
自動書き込み
開発ボードを使うか自動プログラム 回路を付けていれば Arduino UNO 並のお手軽さで使えます。何も考えずに [マイコンボードに書き込む] ボタンを押すだけです。
開発ボードを使っているのに自動プログラム できない場合は EN<->GND 間にコンデンサを追加 してみましょう。
手動書き込み
ボタンを使ってスケッチを書き込むには...
IO0 (FLASH / KEY / BOOT) ボタンを押しっぱなしにする
EN (RST / RESET) ボタンを押して離す ▶
スケッチをコンパイル&転送 ([マイコンボードに書き込む] ボタンを押す)
転送が始まったら IO0 ボタンを離す
書き込みが完了したら EN ボタンを押して離す ▶
ESP-WROOM-02 の時と似たような感じですね。
ピンの説明
ESP32-WROOM-32 DataSheet (espressif.com) からの抜粋です。
GND 1 P Ground
3V3 2 P Power supply.
EN 3 I Chip-enable signal. Active high.
SENSOR_VP 4 I GPIO36, SENSOR_VP, ADC_H, ADC1_CH0, RTC_GPIO0
SENSOR_VN 5 I GPIO39, SENSOR_VN, ADC1_CH3, ADC_H, RTC_GPIO3
IO34 6 I GPIO34, ADC1_CH6, RTC_GPIO4
IO35 7 I GPIO35, ADC1_CH7, RTC_GPIO5
IO32 8 I/O GPIO32, XTAL_32K_P (32.768 kHz crystal oscillator input), ADC1_CH4, TOUCH9, RTC_GPIO9
IO33 9 I/O GPIO33, XTAL_32K_N (32.768 kHz crystal oscillator output), ADC1_CH5, TOUCH8, RTC_GPIO8
IO25 10 I/O GPIO25, DAC_1, ADC2_CH8, RTC_GPIO6, _RXD0
IO26 11 I/O GPIO26, DAC_2, ADC2_CH9, RTC_GPIO7, EMAC_RXD1
IO27 12 I/O GPIO27, ADC2_CH7, TOUCH7, RTC_GPIO17, EMAC_RX_DV
IO14 13 I/O GPIO14, ADC2_CH6, TOUCH6, RTC_GPIO16, MTMS, HSPICLK, HS2_CLK, SD_CLK, EMAC_TXD2
IO12 14 I/O GPIO12, ADC2_CH5, TOUCH5, RTC_GPIO15, MTDI, HSPIQ, HS2_DATA2, SD_DATA2, EMAC_TXD3
GND 15 P Ground
IO13 16 I/O GPIO13, ADC2_CH4, TOUCH4, RTC_GPIO14, MTCK, HSPID, HS2_DATA3, SD_DATA3, EMAC_RX_ER
SHD/SD2* 17 I/O GPIO9, SD_DATA2, SPIHD, HS1_DATA2, U1RXD
SWP/SD3* 18 I/O GPIO10, SD_DATA3, SPIWP, HS1_DATA3, U1TXD
SCS/CMD* 19 I/O GPIO11, SD_CMD, SPICS0, HS1_CMD, U1RTS
SCK/CLK* 20 I/O GPIO6, SD_CLK, SPICLK, HS1_CLK, U1CTS
SDO/SD0* 21 I/O GPIO7, SD_DATA0, SPIQ, HS1_DATA0, U2RTS
SDI/SD1* 22 I/O GPIO8, SD_DATA1, SPID, HS1_DATA1, U2CTS
IO15 23 I/O GPIO15, ADC2_CH3, TOUCH3, MTDO, HSPICS0, RTC_GPIO13, HS2_CMD, SD_CMD, EMAC_RXD3
IO2 24 I/O GPIO2, ADC2_CH2, TOUCH2, RTC_GPIO12, HSPIWP, HS2_DATA0, SD_DATA0
IO0 25 I/O GPIO0, ADC2_CH1, TOUCH1, RTC_GPIO11, CLK_OUT1, EMAC_TX_CLK
IO4 26 I/O GPIO4, ADC2_CH0, TOUCH0, RTC_GPIO10, HSPIHD, HS2_DATA1, SD_DATA1, EMAC_TX_ER
IO16 27 I/O GPIO16, HS1_DATA4, U2RXD, EMAC_CLK_OUT
IO17 28 I/O GPIO17, HS1_DATA5, U2TXD, EMAC_CLK_OUT_180
IO5 29 I/O GPIO5, VSPICS0, HS1_DATA6, EMAC_RX_CLK
IO18 30 I/O GPIO18, VSPICLK, HS1_DATA7
IO19 31 I/O GPIO19, VSPIQ, U0CTS, EMAC_TXD0
NC 32 -
IO21 33 I/O GPIO21, VSPIHD, EMAC_TX_EN
RXD0 34 I/O GPIO3, U0RXD, CLK_OUT2
TXD0 35 I/O GPIO1, U0TXD, CLK_OUT3, EMAC_RXD2
IO22 36 I/O GPIO22, VSPIWP, U0RTS, EMAC_TXD1
IO23 37 I/O GPIO23, VSPID, HS1_STROBE
GND 38 P Ground
GND 39 P Ground
Note:
* Pins SCK/CLK, SDO/SD0, SDI/SD1, SHD/SD2, SWP/SD3 and SCS/CMD, namely, GPIO6 to GPIO11 are connected
to the integrated SPI flash integrated on ESP32-WROOM-32 and are not recommended for other uses.
注意書きを要約すると、
* になっているピンは ESP32-WROOM-32 内部で SPI FLASH メモリと接続されているので使っちゃダメ!
という事のようです。また、EN, SENSOR_VP (IO36), SENSOR_VN (IO39), IO34, IO35 は入力専用 となっています。
See Also:
ペリフェラルとセンサー
ESP32-WROOM-32 DataSheet (espressif.com) からの抜粋です。
ADC
ADC1_CH0
SENSOR_VP (IO36)
Two 12-bit SAR ADCs
ADC1_CH3 SENSOR_VN (IO39)
ADC1_CH4 IO32
ADC1_CH5 IO33
ADC1_CH6 IO34
ADC1_CH7 IO35
ADC2_CH0 IO4
ADC2_CH1 IO0
ADC2_CH2 IO2
ADC2_CH3 IO15
ADC2_CH4 IO13
ADC2_CH5 IO12
ADC2_CH6 IO14
ADC2_CH7 IO27
ADC2_CH8 IO25
ADC2_CH9 IO26
Ultra Low Noise Analog Pre-Amplifier
SENSOR_VP
IO36
Provides about 60dB gain by using larger capacitors on PCB
SENSOR_VN IO39
DAC
DAC_1
IO25
Two 8-bit DACs
DAC_2 IO26
Touch Sensor
TOUCH0
IO4
Capacitive touch sensors
TOUCH1 IO0
TOUCH2 IO2
TOUCH3 IO15
TOUCH4 IO13
TOUCH5 IO12
TOUCH6 IO14
TOUCH7 IO27
TOUCH8 IO33
TOUCH9 IO32
SD / SDIO / MMC Host Controller
HS2_CLK
MTMS (IO14)
Supports SD memory card V3.01 standard
HS2_CMD MTDO (IO15)
HS2_DATA0 IO2
HS2_DATA1 IO4
HS2_DATA2 MTDI (IO12)
HS2_DATA3 MTCK (IO13)
Motor PWM
Any GPIOs*
Three channels of 16-bit timers generate PWM waveforms; each has a pair of output signals. Three fault detection signals. Three event capture signals. Three sync signals.
LED PWM
Any GPIOs*
16 independent channels @80MHz clock/RTC CLK. Duty accuracy: 16 bits.
UART
Any GPIOs*
Two UART devices with hardware flow-control and DMA
I2C
Any GPIOs*
Two I2C devices in slave or master modes
I2S
Any GPIOs*
Stereo input and output from/to the audio codec, and parallel LCD data output
Remote Controller
Any GPIOs*
Eight channels of IR transmitter and receiver for various waveforms
Parallel QSPI
SPIHD
SHD/SD2 (IO9)
Supports Standard SPI, Dual SPI, and Quad SPI that can be connected to the external flash and SRAM
SPIWP SWP/SD3 (IO10)
SPICS0 SCS/CMD (IO11)
SPICLK SCK/CLK (IO6)
SPIQ SDO/SD0 (IO7)
SPID SDI/SD1 (IO8)
HSPICLK IO14
HSPICS0 IO15
HSPIQ IO12
HSPID IO13
HSPIHD IO4
HSPIWP IO2
VSPICLK IO18
VSPICS0 IO5
VSPIQ IO19
VSPID IO23
VSPIHD IO21
VSPIWP IO22
General Purpose SPI
Any GPIOs*
Standard SPI consists of clock,
chip-select, MOSI and MISO. These SPIs
can be connected to LCD and other
external devices. They support the
following features:
both master and slave modes;
4 sub-modes of the SPI format
transfer that depend on the clock
phase (CPHA) and clock polarity
(CPOL) control;
CLK frequencies by a divider;
up to 64 bytes of FIFO and DMA.
JTAG
MTDI
IO12
JTAG for software debugging
MTCK IO13
MTMS IO14
MTDO IO15
SDIO Slave ※ESP32-WROOM-32 では使えません
SD_CLK
IO6
SDIO interface that conforms to the
industry standard SDIO 2.0 card
specification. On ESP32-WROOM-32 these
pins are connected to the integrated SPI
flash.
SD_CMD IO11
SD_DATA0 IO7
SD_DATA1 IO8
SD_DATA2 IO9
SD_DATA3 IO10
EMAC
EMAC_TX_CLK
IO0
Ethernet MAC with MII/RMII interface
EMAC_RX_CLK IO5
EMAC_TX_EN IO21
EMAC_TXD0 IO19
EMAC_TXD1 IO22
EMAC_TXD2 IO14
EMAC_TXD3 IO12
EMAC_RX_ER IO13
EMAC_RX_DV IO27
EMAC_RXD0 IO25
EMAC_RXD1 IO26
EMAC_RXD2 TXD (IO1)
EMAC_RXD3 IO15
EMAC_CLK_OUT IO16
EMAC_CLK_OUT_180 IO17
EMAC_TX_ER IO4
EMAC_MDC_out Any GPIOs*
EMAC_MDI_in
EMAC_MDO_out
EMAC_CRS_out
EMAC_COL_out
Note:
Functions of Motor PWM, LED PWM, UART, I2C, I2S, general purpose SPI and Remote Controller can be configured
to any GPIO except GPIO6, GPIO7, GPIO8, GPIO9, GPIO10 and GPIO11.
In Table 6, for the items marked with "Any GPIOs*" in the "Pin" column, users should note that GPIO6, GPIO7,
GPIO8, GPIO9, GPIO10 and GPIO11 are connected to the integrated SPI flash of ESP32-WROOM-32 and are not
recommended for other uses.
注意書きを要約すると、
ESP32-WROOM-32 では内部 SPI FLASH メモリとの接続に GPIO6~11 を使っているので、Any GPIOs* になっていても GPIO6~11 は使っちゃダメ!
という事のようです。また、EN, SENSOR_VP (IO36), SENSOR_VN (IO39), IO34, IO35 は入力専用 となっています。
See Also:
analogRead()
ADC に使えるピンは以下の通りです。
A0 SENSOR_VP (IO36) ADC1_CH0
A3 SENSOR_VN (IO39) ADC1_CH3
A4 IO32 ADC1_CH4
A5 IO33 ADC1_CH5
A6 IO34 ADC1_CH6
A7 IO35 ADC1_CH7
A10 IO4 ADC2_CH0
A11 IO0 ADC2_CH1
A12 IO2 ADC2_CH2
A13 IO15 ADC2_CH3
A14 IO13 ADC2_CH4
A15 IO12 ADC2_CH5
A16 IO14 ADC2_CH6
A17 IO27 ADC2_CH7
A18 IO25 ADC2_CH8
A19 IO26 ADC2_CH9
ESP32-WROOM-32 での ADC の基準電圧は 1.1V ですが、減衰器 (アッテネータ) により 3.3V での読み取りが可能 になっています。ESP-WROOM-02 のような罠 はありません。但し、緑字のピンは動作モードに関連 するので注意が必要です。
void setup () {
Serial.begin(115200);
}
void loop () {
int adc_key_in = analogRead(4);
Serial.println(adc_key_in);
}
適当なアナログピン (スケッチでは IO4) に可変抵抗を付けます。シリアルモニタ (115200) を開いてボリュームを回してみると、値は 0~4095 の間で変化するはずです (12bit)。
See Also:
リニアじゃない!
読み取ったアナログ値がリニアに変換されない という話があるようですが、上記スケッチで値から電圧を実測 してみた限りではそこまで極端な誤差はない気がします。
4095 3.31 3.310
3583 2.88 2.896
3071 2.54 2.483
2559 2.15 2.069
2047 1.751 1.655
1535 1.351 1.241
1023 0.935 0.828
511 0.526 0.414
0 0 0.000
最大の実測電圧が 3.31V だったので、理論電圧の上限も 3.31V に合わせてあります。安物テスターとブレッドボードでの実測なのでデータに信頼性はありません (w
グラフにするとこうなります。青が実測値で、赤が理論値です。
既に補正が入っているのでしょうかね、言うほどズレてないような?それでも、ちゃんとやるなら更なる補正関数を噛ますか、外部 ADC IC を使わないといけないかもしれません。特にアナログ値で読み取る温度センサー等ではこの誤差は看過できないと思われます。
See Also:
Wi-Fi 使用時
Wi-Fi 使用時 には ADC2 が使えません。つまり、実質 A4 (IO32) ~ A7 (IO35) の 4 本しか使えません。
analogWrite()
arduino-esp32 には、現状 analogWrite() がありません 。
似たような事はできます。[ファイル | スケッチ例 | ESP32 | AnalogOut] にあるスケッチを参考にしてみてください。
LED Control PWM (LEDC)
L チカ用のサンプルスケッチは LEDCSoftwareFade です。
以下は [ファイル | スケッチ例 | 01.Basics] にある Fade と同等のスケッチです。
int LEDC_CHANNEL_0 = 0 ; // LEDC channel (0-15)
int LEDC_BASE_FREQ = 4900 ; // use 4900 Hz as a LEDC base frequency
int LEDC_TIMER_13_BIT = 13 ; // use 13 bit precission for LEDC timer
int led = 5 ; // LED connected to IO5
int brightness = 0 ; // how bright the LED is
int fadeAmount = 5 ; // how many points to fade the LED by
// Arduino like analogWrite
// value has to be between 0 and valueMax
void ledcAnalogWrite(uint8_t channel, uint32_t value, uint32_t valueMax = 255 ) {
// calculate duty
uint32_t dutybase = (1 << LEDC_TIMER_13_BIT) - 1 ;
uint32_t duty = (dutybase / valueMax) * min(value, valueMax);
// write duty to LEDC
ledcWrite(channel, duty);
}
void setup() {
// Setup timer and attach timer to a led pin
ledcSetup(LEDC_CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_13_BIT);
ledcAttachPin(led, LEDC_CHANNEL_0);
}
void loop() {
// set the brightness on LEDC channel 0
ledcAnalogWrite(LEDC_CHANNEL_0, brightness);
// change the brightness for next time through the loop:
brightness = brightness + fadeAmount;
// reverse the direction of the fading at the ends of the fade:
if (brightness <= 0 || brightness >= 255 ) {
fadeAmount = -fadeAmount;
}
// wait for 30 milliseconds to see the dimming effect
delay(30 );
}
Arduino の analogWrite() の周波数は多くの場合で 490Hz です。LEDC_BASE_FREQ の値は 4900 等、490 の倍数の方が UNO での動作に近いと思います。
Sigma-Delta Modulation
こちらはΔΣ変調のようです。SigmaDelta がサンプルスケッチです。(ソースコード的に) Arduino 標準の analogWrite() の使い方に近いのはこちらです。
以下は [ファイル | スケッチ例 | 01.Basics] にある Fade と同等のスケッチです。
int SIGMADELTA_CHANNEL_0 = 0 ; // SigmaDelta channel (0-7)
int SIGMADELTA_FREQ = 4900 ; // use 4900 Hz as a SigmaDelta base frequency
int led = 5 ; // LED connected to IO5
int brightness = 0 ; // how bright the LED is
int fadeAmount = 5 ; // how many points to fade the LED by
// the setup routine runs once when you press reset:
void setup()
{
sigmaDeltaSetup(SIGMADELTA_CHANNEL_0, SIGMADELTA_FREQ); // setup channel 0 with frequency 4900 Hz
sigmaDeltaAttachPin(led, SIGMADELTA_CHANNEL_0); // attach pin 5 to channel 0
sigmaDeltaWrite(SIGMADELTA_CHANNEL_0, 0 ); // initialize channel 0 to off
}
// the loop routine runs over and over again forever:
void loop() {
// set the brightness of channel 0:
sigmaDeltaWrite(SIGMADELTA_CHANNEL_0 , brightness);
// change the brightness for next time through the loop:
brightness = brightness + fadeAmount;
// reverse the direction of the fading at the ends of the fade:
if (brightness <= 0 || brightness >= 255 ) {
fadeAmount = -fadeAmount;
}
// wait for 30 milliseconds to see the dimming effect
delay(30 );
}
SigMaDelta の周波数指定は 1220 Hz~312500 Hz の間で行う必要があります。
See Also:
ledcWriteNote() / ledcWriteTone()
LEDC には何故か Note / Tone 関係の関数が含まれています。esp32-hal-ledc に ledcWriteNote() / ledcWriteTone() が実装されていますので、これで音を鳴らすことができます。
ledcWriteNote()
Arduino チュートリアルの Play a Melody using the tone() function と同等のメロディを鳴らしてみます。
// use first channel of 16 channels (started from zero)
#define LEDC_CHANNEL_0 0
// use 13 bit precission for LEDC timer
#define LEDC_TIMER_13_BIT 13
// use 5000 Hz as a LEDC base frequency
#define LEDC_BASE_FREQ 5000
// SPEAKER PIN
#define SPEAKER_PIN 23
const int NOTE_NONE = NOTE_MAX;
int melody[] = {
NOTE_C, NOTE_G, NOTE_G, NOTE_A, NOTE_G, NOTE_NONE, NOTE_B, NOTE_C
};
int noteOctaves[] = {
4 , 3 , 3 , 3 , 3 , 0 , 3 , 4
};
int noteDurations[] = {
4 , 8 , 8 , 4 , 4 , 4 , 4 , 4
};
void setup() {
ledcSetup(LEDC_CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_13_BIT);
ledcAttachPin(SPEAKER_PIN, LEDC_CHANNEL_0);
}
void loop() {
for (int thisNote = 0 ; thisNote < 8 ; thisNote++) {
ledcWriteNote(LEDC_CHANNEL_0, (note_t)melody[thisNote], noteOctaves[thisNote]);
int pauseBetweenNotes = 1000 / noteDurations[thisNote] * 1.30 ;
delay(pauseBetweenNotes);
ledcWriteTone(LEDC_CHANNEL_0, 0 ); // stop the tone playing:
}
delay(2000 );
}
IO22 にスピーカー (パッシブブザー) を接続してスケッチを実行してみてください。以下、ノートとオクターブの対応表です (単位は Hz)。
ド NOTE_C 16.35 32.70 65.41 130.81 261.62 523.25 1046.50 2093.00 4186.00
ド♯ NOTE_Cs 17.32 34.65 69.30 138.59 277.19 554.37 1108.75 2217.50 4435.00
レ NOTE_D 18.36 36.71 73.42 146.84 293.69 587.37 1174.75 2349.50 4699.00
ミ♭ NOTE_Eb 19.45 38.89 77.78 155.56 311.12 622.25 1244.50 2489.00 4978.00
ミ NOTE_E 20.60 41.20 82.41 164.81 329.62 659.25 1318.50 2637.00 5274.00
ファ NOTE_F 21.83 43.66 87.31 174.62 349.25 698.50 1397.00 2794.00 5588.00
ファ♯ NOTE_Fs 23.12 46.25 92.50 185.00 370.00 740.00 1480.00 2960.00 5920.00
ソ NOTE_G 24.50 49.00 98.00 196.00 392.00 784.00 1568.00 3136.00 6272.00
ソ♯ NOTE_Gs 25.96 51.91 103.83 207.66 415.31 830.62 1661.25 3322.50 6645.00
ラ NOTE_A 27.50 55.00 110.00 220.00 440.00 880.00 1760.00 3520.00 7040.00
シ♭ NOTE_Bb 29.14 58.27 116.55 233.09 466.19 932.37 1864.75 3729.50 7459.00
シ NOTE_B 30.87 61.73 123.47 246.94 493.87 987.75 1975.50 3951.00 7902.00
ちなみに SHARP PC-E500 の BEEP で鳴らせる範囲は ド(4)~ド(7) までです。
ledcWriteTone()
Arduino 純正 tone() と同じように音を鳴らせるハズですが...試しにサインスマートのプロジェクト練習教本 Chapter 7: Buzzer 用のスケッチを改変して鳴らしてみます。
// use first channel of 16 channels (started from zero)
#define LEDC_CHANNEL_0 0
// use 13 bit precission for LEDC timer
#define LEDC_TIMER_13_BIT 13
// use 5000 Hz as a LEDC base frequency
#define LEDC_BASE_FREQ 5000
int passiveBuzPin = 23 ;
int i = 0 ;
int numOfLoops = 0 ;
int noteDuration = 1000 /8 ; // an eighth note
int pauseBetweenNotes = noteDuration * 0.2 ;
void setup() {
ledcSetup(LEDC_CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_13_BIT);
ledcAttachPin(passiveBuzPin, LEDC_CHANNEL_0);
}
void loop() {
// This outer for statement determines the number
// of siren cycles that are played.
for (numOfLoops =0 ; numOfLoops < 4 ; numOfLoops++) {
// Play low to high frequencies
for (i=25 ;i<120 ;i++){
ledcWriteTone(LEDC_CHANNEL_0, 20 *i);
delay(noteDuration);
//ledcNoTone(LEDC_CHANNEL_0);
//delay(pauseBetweenNotes);
}
// Play high to low frequencies
for (i=120 ;i>=25 ;i--){
ledcWriteTone(LEDC_CHANNEL_0, 20 *i);
delay(noteDuration);
//ledcNoTone(LEDC_CHANNEL_0);
//delay(pauseBetweenNotes);
}
}
}
void ledcNoTone(uint8_t channel){
ledcWriteTone(channel, 0 );
}
IO22 にスピーカー (パッシブブザー) を接続してスケッチを実行してみてください。私のやり方が悪いのか、音と音がキレイに繋がりません。
SHARP PC-E500 の BEEP 1 で鳴るビープ音は以下のソースコードで再現できます (大体合ってる)。
ledcWriteTone(LEDC_CHANNEL_0, 4000 ); // 4KHz
delay(583 ); // 583 ms
ledcWriteTone(LEDC_CHANNEL_0, 0 );
マニアックすぎましたかね (^^;A
8bit DAC
IO25 と IO26 は dacWrite() を用いて 8bit DAC ができます。UNO の analogWrite() のような PWM ではなく DAC を使ったアナログ出力 です。Arduino DUE で DAC1 / DAC2 ピンに対して analogWrite() するのと同等です (但し DUE は 12bit DAC)。
以下は [ファイル | スケッチ例 | 01.Basics] にある Fade と似たような動作をするスケッチです。PWM ではないので、LED が光っている時間は短いです (値が 127 でも 1.65V 付近なので LED は光らない)。
int led = 25 ; // DAC pin (25 or 26)
int brightness = 0 ; // how bright the LED is
int fadeAmount = 5 ; // how many points to fade the LED by
void setup() {
dacWrite(led, 0 );
}
void loop() {
// set the brightness on LEDC pin 25
dacWrite(led, brightness);
// change the brightness for next time through the loop:
brightness = brightness + fadeAmount;
// reverse the direction of the fading at the ends of the fade:
if (brightness <= 0 || brightness >= 255 ) {
fadeAmount = -fadeAmount;
}
// wait for 30 milliseconds to see the dimming effect
delay(30 );
}
当方の環境で dacWrite(25, 127); を実測したら、1.637V になりました。
See Also:
SPI
SPI に使えるピンはデフォルトで以下の通りです。これは VSPI と呼ばれます。
SCK IO18 VSPICLK
MISO IO19 VSPIQ
MOSI IO23 VSPID
SS IO5 VSPICS0
IO21 VSPIHD
IO22 VSPIWP
Arduino ESP32 の SPIClass.begin() は引数を持っており、任意のピンを使った 汎用 SPI (General-Purpose SPI) 通信ができます。
void begin(int8_t sck=SCK, int8_t miso=MISO, int8_t mosi=MOSI, int8_t ss=-1 );
さらに VSPI とは別系統の SPI ポートがあります。これは HSPI と呼ばれます。
SCK IO14 HSPICLK
MISO IO12 HSPIQ
MOSI IO13 HSPID
SS IO15 HSPICS0
IO4 HSPIHD
IO2 HSPIWP
HSPI を使うには SPIClass のコンストラクタに HSPI を指定します (明示的に指定しなかった場合も HSPI になります)。
#include "SPI.h"
...
SPIClass hspi(HSPI);
上記コードで、SPI オブジェクト (VSPI) とは別に、hspi オブジェクト (HSPI) が使える事になります。
SD (VSPI 接続)
SD カード を SPI 接続 (VSPI) する場合についてです。この接続方法のスケッチは [ファイル| スケッチ例 | SD(esp32)] にある SD_Test です。
9 DAT2
1 DAT3 SS IO5 VSPICS0
2 CMD MOSI IO23 VSPID
3 VSS1 GND
4 VCC VCC/3.3V
5 CLK SCK IO18 VSPICLK
6 VSS2 GND
7 DAT0 MISO IO19 VSPIQ
8 DAT1
SD カード を接続したい場合には、MISO (DAT0 / DO) に指定したピンを忘れずにプルアップ する必要があります。
外部抵抗を使わず、setup() で pinMode(MISO, PULLUP) として、
void setup(){
pinMode(MISO, PULLUP); // ADD
Serial.begin(115200 );
if (!SD.begin()){
Serial.println("Card Mount Failed" );
return ;
}
...
内部プルアップでも動作するかもしれませんが、確実性を求めるならば MISO (IO19) を 10kΩ抵抗でプルアップしてください。
bool begin(uint8_t ssPin=SS, SPIClass &spi=SPI, uint32_t frequency=4000000 , const char * mountpoint="/sd" );
SD.begin() メソッドにはオリジナルの SD ライブラリ 同様、チップセレクトピンを引数として指定する事ができます (デフォルトで SS が指定されます)。
See Also:
SD MMC (HS2 接続)
HSPI 接続と同じピンを使って、SD_MMC (HS2) 接続 ができます。この接続方法のスケッチは [ファイル| スケッチ例 | SD_MMC] にある SDMMC_Test です。VSPI 接続に比べると配線するピンが多くなります
9 DAT2 IO12 HS2_DATA2
1 DAT3 IO13 HS2_DATA3
2 CMD IO15 HS2_CMD
3 VSS1 GND
4 VCC VCC/3.3V
5 CLK IO14 HS2_CLK
6 VSS2 GND
7 DAT0 IO2 HS2_DATA0
8 DAT1 IO4 HS2_DATA1
DAT0 / DAT1 / DAT2 / DAT3 は 10kΩ抵抗でプルアップしなくてはならない。
DAT0 (IO2) はプルダウンで起動しないとスケッチを書き込めない。
DAT0 (IO2) はプルアップでないと SD/MMC が正しく動作しない。
DAT2 (IO12) をプルアップして起動すると、内部電圧が 1.8V になってしまう (&ビルトイン BASIC が起動する)。
DAT2 (IO12) はプルアップでないと SD/MMC が正しく動作しない。
DAT1 / DAT2 が省かれた SD カードモジュールは使えない。
面倒臭いなぁ...この方式を選択するメリットあるんですかね?
SD カードモジュールを HS2 で結線する
IO4 (DAT1) と IO13 (DAT3) を 10KΩ抵抗でプルアップする。 IO2 (DAT0) と IO12 (DAT2) はプルアップしない (プルアップが不要とは言ってない)。
setup() に以下のコードを追加し、IO2 (DAT0) と IO12 (DAT2) を内部プルアップする。
void setup(){
pinMode( 2 , PULLUP); // ADD
pinMode(12 , PULLUP); // ADD
Serial.begin(115200 );
if (!SD_MMC.begin()){
Serial.println("Card Mount Failed" );
return ;
}
...
一応、この手順で SD_MMC が使え、自動プログラム とも両立できるようですが、確実性を求めるなら ESP-WROVER-KIT や魔法の大鍋さんの ESP-WROOM-32開発ボード+microSD を参考に回路を追加した方がいいでしょうね。
見ての通りなのですが、ESP32-DevKitC 等にこの回路を追加するのは難易度が高いと思います。
See Also:
使えない SPI (SPI / SDIO Slave)
IO6~IO11 を使った SPI は ESP32-WROOM-32 では利用不可です。理由は内部 FLASH との接続に使われているから です。これらのピンは SPI 以外の用途であっても使うべきではありません。
つまり、ESP32 では使えますが、ESP32-WROOM-32 では実質使えない SPI という事になります。ソースコード内ではこの SPI を FSPI と呼んでいる箇所があります。
See Also:
Serial (UART)
Serial
Serial (UART) に使えるピンはデフォルトで以下の通りです。
TXD IO1 (TXD0)
RXD IO3 (RXD0)
Serial オブジェクトは宣言なしに利用可能です。以下は ESP32 のチップ情報を表示するスケッチです。
// Model Strings
const char * ModelStrings[] PROGMEM = {"" , "ESP32" };
// Add Feature String
void AddFeatureString(String &S, const String F) {
if (S.length() != 0 ) S.concat(", " );
S.concat(F);
}
void setup() {
// Get Chip Information
esp_chip_info_t chip_info;
esp_chip_info(&chip_info);
// Start Serial Communication
Serial.begin(115200 );
while (!Serial);
Serial.println("\r\n***** Chip Information *****" );
// Model
Serial.printf("Model: %s\r\n" , ModelStrings[chip_info.model]);
// Features
String Features = "" ;
if (chip_info.features & CHIP_FEATURE_EMB_FLASH) AddFeatureString(Features, "Embedded Flash" );
if (chip_info.features & CHIP_FEATURE_WIFI_BGN ) AddFeatureString(Features, "Wifi-BGN" );
if (chip_info.features & CHIP_FEATURE_BLE ) AddFeatureString(Features, "BLE" );
if (chip_info.features & CHIP_FEATURE_BT ) AddFeatureString(Features, "Bluetooth" );
Serial.println("Features: " + Features);
// Cores
Serial.printf("Cores: %d\r\n" , chip_info.cores);
// Revision
Serial.printf("Revision: %d\r\n" , chip_info.revision);
// MAC Address
String MACString = "" ;
uint64_t chipid = ESP.getEfuseMac();
for (int i=0 ; i<6 ; i++) {
if (i > 0 ) MACString.concat(":" );
uint8_t Octet = chipid >> (i * 8 );
if (Octet < 16 ) MACString.concat("0" );
MACString.concat(String(Octet, HEX));
}
Serial.println("MAC Address: " + MACString);
// Flash Size
uint32_t FlashSize = ESP.getFlashChipSize();
String ValueString = "" ;
do {
String temp = String(FlashSize);
if (FlashSize >= 1000 ) {
temp = "00" + temp;
ValueString = "," + temp.substring(temp.length() - 3 , temp.length()) + ValueString;
} else {
ValueString = temp + ValueString;
}
FlashSize /= 1000 ;
} while (FlashSize > 0 );
Serial.println("Flash Size: " + ValueString);
}
void loop() {
}
See Also:
SoftwareSerial
2017/07 現在、SoftwareSerial は利用できません。外部ライブラリを使用してください。
See Also:
HardwareSerial
3系統のハードウエアシリアルを利用可能です。よく使う Serial オブジェクトはハードウェアシリアルです (UART0)。
TXD IO1 (TXD0) IO10 IO17
RXD IO3 (RXD0) IO9 IO16
RTS IO22 IO11 IO7
CTS IO19 IO6 IO8
ハードウェアシリアルは以下のようなコードで使えるようになります。
HardwareSerial mySerial(2 ); // UART2
void setup() {
mySerial.begin(115200 );
}
void loop() {
...
}
ESP-WROOM32 には IO6~IO11 を使ってはいけない という制約があるので、UART1 は使えません 。
但し、UART はピンを変更可能 なため、ピンを変更した UART1 なら利用可能です。
HardwareSerial mySerial1(1 ); // UART1 (RX=9, TX=10)
HardwareSerial mySerial2(2 ); // UART2 (RX=16, TX=17)
void setup() {
mySerial1.begin(115200 , SERIAL_8N1, 32 , 33 ); // ピンを変更 (RX=32, TX=33)
mySerial2.begin(115200 );
}
void loop() {
...
}
IO6~IO11, IO34, IO35 以外なら任意の GPIO に割り当て可能だと思われます。
I2 C
I2 C に使えるピンはデフォルトで以下の通りです。
但し、ESP32-WROOM-32 の Wire.begin() は引数を持っており、任意のピンを使った I2 C 通信ができます。
void begin(int sda=-1 , int scl=-1 , uint32_t frequency=100000 );
See Also:
ホール効果センサー
ESP32 にはホール効果センサー (Hall Effect Sensors) が内蔵されています。簡単に言えば磁気センサーです。
ESP32-WROOM-32 では追加回路なしにこのホール効果センサーを使うことができます。
void setup() {
Serial.begin(115200 );
}
void loop() {
int v = hallRead();
Serial.println(v, DEC);
delay(200 );
}
このスケッチを書き込んでシリアルモニタを開いたら、ESP32-WROOM-32 の上で磁石の N 極を近付けたり、S 極を近付けたりしてみましょう。
※ [ファイル | スケッチの例 | ESP32 | HallSensor] にもサンプルスケッチがあります。
See Also:
タッチセンサー
ESP32 にはタッチセンサーが内蔵されています。テストスケッチは [ファイル | スケッチ例 | ESP32 | Touch] です。TouchRead を簡易的に動作させるには、IO4 にジャンパーワイヤーを接続してそれを触ってみてください。
ミノムシクリップでコインを挟んでも、ジャンパーワイヤーをバナナに刺してもイケます (本当)。
T0 IO4
T1 IO0
T2 IO2
T3 IO15
T4 IO13
T5 IO12
T6 IO14
T7 IO27
T8 IO33
T9 IO32
タッチセンサーに使えるピンは全部で 10 本です。うまくやれば 4 ピンで表面型静電容量方式タッチスクリーン がやれるのではないかと思います。
See Also:
EMAC (Ethernet Media Access Controller)
ESP32 には EMAC (Ethernet Media Access Controller) が搭載されており、MII または RMII インターフェイスによる有線 LAN モジュールの接続が可能です。
MII (Media Independent Interface)
このインターフェイスを持つチップには Texas Instruments 社の TLK110 があり、評価ボードもあります。
評価ボードはちょっと高いです。
See Also:
RMII (Reduced Media Independent Interface)
このインターフェイスを持つチップには Microchip 社の LAN8720A があります。このチップを用いた安価なボードは広く出回っています。
LAN8720 ETH Board
LAN8720 ETH Board を購入してみました (購入時価格: ¥295)。
このボードと ESP32-WROOM-32 との接続は以下のようになります。
1 PHY_POWER NC IO17*
2 EMAC_TXD1 TX1 IO22
3 EMAC_TXD0 TX0 IO19
4 EMAC_TX_EN TX_EN IO21
5 EMAC_RXD1 RX1 IO26
6 EMAC_RXD0 RX0 IO25
7 EMAC_RX_DV CRS IO27
8 EMAC_TX_CLK nINT/REFCLK IO0
9 SMI_MDC MDC IO23*
10 SMI_MDIO MDIO IO18*
11 GND GND GND
12 VCC VCC 3V3
13 GND GND GND
14 VCC VCC 3V3
* 任意に変更可能
外部クロックを IO0 から取るようになっていますが、ESP32-WROOM-32 の IO0 は起動時に LOW でなくてはなりません。この問題を解決する手法が考案されています。
未使用ピン (NC) にクロックの有効/無効信号を引き出してコントロールするというものです。
接続は以下のようになります。IO0 に 4.7kΩのプルアップ抵抗、IO17 (PHY_POWER) に 4.7kΩのプルダウン抵抗が必要です。抵抗の配置の関係でブレッドボードの上下に電源レーンがあった方が都合がいいので、以下の画像ではサンハヤトの SAD-101 を二枚連結して使っています。
スケッチ
スケッチは [ファイル | スケッチ例 | WiFi] にある
...なのですが、少々変更が必要となります。ETH_LAN8720_internal_clock の方を開き、
/*
This sketch shows how to configure different external or internal clock sources for the Ethernet PHY
*/
#include <ETH.h>
/*
* ETH_CLOCK_GPIO0_IN - default: external clock from crystal oscillator
* ETH_CLOCK_GPIO0_OUT - 50MHz clock from internal APLL output on GPIO0 - possibly an inverter is needed for LAN8720
* ETH_CLOCK_GPIO16_OUT - 50MHz clock from internal APLL output on GPIO16 - possibly an inverter is needed for LAN8720
* ETH_CLOCK_GPIO17_OUT - 50MHz clock from internal APLL inverted output on GPIO17 - tested with LAN8720
*/
#define ETH_CLK_MODE ETH_CLOCK_GPIO0_IN
// Pin# of the enable signal for the external crystal oscillator (-1 to disable for internal APLL source)
#define ETH_POWER_PIN 17
// Type of the Ethernet PHY (LAN8720 or TLK110)
#define ETH_TYPE ETH_PHY_LAN8720
// I2C-address of Ethernet PHY (0 or 1 for LAN8720, 31 for TLK110)
#define ETH_ADDR PHY1
// Pin# of the I2C clock signal for the Ethernet PHY
#define ETH_MDC_PIN 23
// Pin# of the I2C IO signal for the Ethernet PHY
#define ETH_MDIO_PIN 18
...
赤字の部分を書き換えます。コード中に I2 C という単語が出てきますが、このモジュールとの接続は I2 C ではなく SMI (Serial Management Interface) です。
ETH Started
ETH Connected
ETH MAC: xx:xx:xx:xx:xx:xx, IPv4: 192.168.1.25, FULL_DUPLEX, 100Mbps
connecting to google.com
HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Referrer-Policy: no-referrer
Location: http://www.google.co.jp/?gfe_rd=cr&dcr=0&ei=kuLQWvasOKL98AeW4ZGYDw
Content-Length: 271
Date: Fri, 13 Apr 2018 17:02:10 GMT
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.jp/?gfe_rd=cr&dcr=0&ei=kuLQWvasOKL98AeW4ZGYDw">here</A>.
</BODY></HTML>
closing connection
接続に成功すると上記のようなログがシリアルモニタに表示されます。
See Also:
SPIFFS (SPI Flash File System)
ESP32-WROOM-32 には 4MB のフラッシュメモリが内蔵されており、これは SPI で接続されています。スケッチをコンパイルしたバイナリ...いわゆるファームウェアはこのフラッシュメモリに格納されるのですが、余剰分のフラッシュメモリをストレージのように使う事ができます。この機能は SPIFFS と呼ばれています。
アップローダのインストール
SPIFFS にファイルを格納する方法はいくつかあります。
SPIFFS にファイルを作成するスケッチを書く
SD カードに格納されたファイルを読み、SPIFFS に転送するスケッチを書く
アップローダで SPIFFS にファイルを転送する
最も簡単な方法はアップローダを使う方法です。以下、アップローダのインストール方法です。
アップローダの最新版 を DL する。
アーカイブを解凍する。
<Arduino のインストールフォルダ>\tools\ESP32FS\tool に esp32fs.jar をコピーする (存在しないフォルダは作成)
Arduino IDE を再起動する。
[ツール] に ESP32 Sketch Data Upload が追加される。
See Also:
ファイルのアップロード方法
ファイルをアップロードするのは簡単です。
スケッチ (*.ino) のあるフォルダに data というサブフォルダを作成 する
data フォルダにアップロードしたいファイルをコピーする
[ツール | ESP32 Sketch Data Upload] でファイルをアップロードする
※アップロードの前にシリアルモニタやシリアルプロッタは閉じておきましょう。
スケッチでのファイル操作
ほぼ C 言語のファイル操作関数と同じなので難しくはないと思います。
#include "FS.h"
#include "SPIFFS.h"
const uint32_t BUF_SIZE = 255 ;
void setup() {
Serial.begin(115200 );
while (!Serial);
Serial.println("" );
SPIFFS.begin(true );
/* CREATE FILE */
File fp = SPIFFS.open("/TEST.TXT" , FILE_WRITE); // 書き込み、存在すれば上書き
char buf[BUF_SIZE + 1 ];
String s = "The quick brown fox jumps over the lazy dog.\r\n" ;
s.toCharArray(buf, BUF_SIZE);
for (int i=0 ; i<20 ; i++)
fp.write((uint8_t *)buf, BUF_SIZE);
fp.close();
/* READ FILE */
fp = SPIFFS.open("/TEST.TXT" , FILE_READ); // 読み取り
while (fp.read((uint8_t *)buf, BUF_SIZE) == BUF_SIZE)
Serial.print(buf);
fp.close();
/* DELETE FILE */
SPIFFS.remove("/TEST.TXT" );
SPIFFS.end();
}
void loop() {
}
SPIFFS は便利ですが、秒単位でログを取るような用途には向いていません (フラッシュメモリなので書き換え回数に上限があります)。
See Also:
Over The Air (OTA)
OTA は、簡単に言えば無線 LAN 経由でスケッチを書き込む機能 です。Delphi は関係ない です。
環境構築
OTA をやるのに必要なのは
これだけです。ESP-WROOM-02 の時のように Python は要らないと思います。
概要
最近の ESP32 ライブラリには OTA ライブラリが含まれています。
OTA 用スケルトンスケッチに無線 LAN アクセスポイントの SSID / Password を記述
OTA 用スケルトンスケッチをコンパイル、USB<->シリアル変換モジュール 経由でアップロード
OTA 用スケルトンスケッチをベースにしたスケッチをコンパイル、無線 LAN 経由でアップロード
このような理屈なので、同じ機能のスケッチを書いたとしても OTA 経由で転送したものの方がサイズが大きくなります。
セットアップ
まずは OTA 用スケルトンスケッチをコンパイルしてアップロードします。
[ファイル | スケッチの例 | Arduino OTA | Basic OTA]
スケッチの一部を書き換える
#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
const char * ssid = "あなたの AP の SSID" ;
const char * password = "SSID に対するパスワード" ;
void setup() {
...
(中略 )
...
Serial.println(WiFi.localIP());
}
void loop() {
ArduinoOTA.handle();
}
(自動プログラム が有効でない場合) IO0 ボタンを押しっぱなしにする。
(自動プログラム が有効でない場合) リセットボタン (EN ボタン) を押して離す。
スケッチをコンパイルして USB<->シリアル変換モジュール 経由でアップロード
(自動プログラム が有効でない場合) IO0 ボタンを離す。
アップロード完了
(自動プログラム が有効でない場合) リセットボタン (EN ボタン) を押す
シリアルモニタを開き 115200 で繋ぐと ESP32-WROOM-32 が取得した IP アドレスが見れる
Arduino IDE を再起動
次に任意のスケッチをコンパイルしてアップロードします。OTA 用スケルトンスケッチをベースにする必要があります。
[ファイル | スケッチの例 | Arduino OTA | Basic OTA]
[ファイル | 名前を付けて保存] で一旦保存
例は IO23 で L チカするスケッチ。
#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
const char * ssid = "あなたの AP の SSID" ;
const char * password = "SSID に対するパスワード" ;
void setup() {
...
(中略 )
...
// 以降に初期化コード
pinMode(23 , OUTPUT);
}
void loop() {
ArduinoOTA.handle();
// 以降に実装コード
digitalWrite(23 , HIGH);
delay(1000 );
digitalWrite(23 , LOW);
delay(1000 );
}
SSID / Password を記述
setup() の最後に目的の初期化コードを追記
loop() の最後に目的の実装コードを追記
[ツール | シリアルポート] の下部に OTA スケッチを書き込んだ ESP32-WROOM-32 が見えるのでそれを選択する。
スケッチをコンパイルしてアップロード。当然ながら、OTA 経由の場合には IO0 が HIGH でも (IO0 ボタンを押さなくても) 書き込める。
OTA で書き込めない場合にはウィルス対策ソフトやファイアーウォールを疑ってみて ください。OTA はデフォルトで 3232 番ポート を使用します。また、前回の OTA スケッチを変な設定で書き込んでしまったのかもしれません。設定をよく確認してから、スケルトンスケッチを USB<->シリアル変換モジュール 経由で書き込んでみてください。
See Also:
チップバグ
ESP32-WROOM-32 の revision 0 にはバグがあります 。バグ持ちかどうかを確認するには以下のスケッチを実行します。
void setup() {
Serial.begin(115200 );
while (!Serial);
Serial.printf("Revision: %d\r\n" , ESP.getChipRevision());
}
void loop() {
}
Arduino-ESP32 に付属の esptool.exe を実行する事でもリビジョンを確認できます。
[rev.0]
C:\Arduino\hardware\espressif\esp32\tools>esptool.exe --port COM8 flash_id
esptool.py v2.1
Connecting...
Detecting chip type... ESP32
Chip is ESP32D0WDQ6 (revision 0 )
Uploading stub...
Running stub...
Stub running...
Manufacturer: c8
Device: 4016
Detected flash size: 4MB
Hard resetting...
[rev.1]
C:\Arduino\hardware\espressif\esp32\tools>esptool.exe --port COM8 flash_id
esptool.py v2.1
Connecting...
Detecting chip type... ESP32
Chip is ESP32D0WDQ6 (revision 1 )
Uploading stub...
Running stub...
Stub running...
Manufacturer: c8
Device: 4016
Detected flash size: 4MB
Hard resetting...
大まかなリビジョンは外観からも判断できるようです。
1313 の刻印がある → 高確率で Rev.0。但し Rev.1 の事もある。
1313 の刻印がない → Rev.1
具体的なバグの内容については以下のドキュメントを参照してください。
何が困るの?
問題がなければそれでいいのですが、イロイロやっていると (多分) 遭遇するであろう問題は液晶ディスプレイや OLED を接続するとゴミが描画される というものではないかと思います。これについては回避策があります。
Arduino-ESP32 のインストールフォルダで esp32.peripherals.ld を探す (tools\sdk\ld にあるハズ)。
esp32.peripherals.ld をテキストエディタで開く
PROVIDE ( GPIO =... の行を書き換える。// でのコメントアウトはできないので、コメントアウトしたいのなら /* */ で括る事。
/* PROVIDE ( GPIO = 0x3ff44000 ); */
PROVIDE ( GPIO = 0x60004000 );
Arduino-ESP32 を更新した場合には、このファイルを忘れずにチェックしてください。
See Also:
ビルトイン BASIC
ESP32-WROOM-32 にはビルトイン BASIC が仕込まれています。ビルトイン BASIC を起動する方法は以下の通りです:
IO12 を 10kΩ抵抗でプルアップ (IO12 と 3V3 を10kΩ抵抗で繋ぐ)
電源 ON またはリセット
シリアルモニタを 115200 bps で開く (任意のターミナルエミュレータで構わない)
以下のようなメッセージが繰り返し出る (IO15 をプルダウンしている場合 には OK のみが繰り返し表示される) ので Enter を入力する。
ets Jun 8 2016 00:22:57
rst:0x10 (RTCWDT_RTC_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0x00
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
cmd len -1
Falling back to built-in command interpreter.
OK
>
ビルトイン BASIC が起動する。
about〔Enter〕とすると、このビルトイン BASIC が TinyBasic Plus 、そして ROM BASIC である事が判ります。
>about
ESP32 ROM Basic (c) 2016 Espressif Shanghai
Derived from TinyBasic Plus by Mike Field and Scott Lawrence
mem〔Enter〕でフリーエリアを確認できます。
help〔Enter〕で使えるコマンド (ステートメント) が確認できます。
>help
A very Basic ROM console. Available commands/functions:
LIST
NEW
RUN
NEXT
LET
IF
GOTO
GOSUB
RETURN
REM
FOR
INPUT
PRINT
PHEX
POKE
STOP
BYE
MEM
?
'
DELAY
END
RSEED
HELP
ABOUT
IOSET
IODIR
PEEK
ABS
RND
IOGET
USR
ファイル関係が実装されていないのがちょっと残念ですね。
BASIC 簡易リファレンス
'
' 〔<注釈文>〕
プログラム内に注釈を入れます。
→REM
?
? <式>
画面に文字列や数値を表示します。
→PRINT
ABOUT
ABOUT
ROM BASIC の詳細 (クレジット) を表示します。
ABS
ABS(式)
式の絶対値を返します。
BYE
BYE
ROM BASIC を終了します
DELAY
DELAY <ミリ秒>
プログラムを指定した時間だけ止めます。単位はミリ秒です(1,000ミリ秒=1秒)。
→delay()
END
END
プログラムを終了します
→STOP
FOR~NEXT
FOR <変数>=<初期値> TO <最終値> 〔STEP <増分>〕 <ループの内容> NEXT <変数>
FOR から NEXT までの指定されたループの内容を指定された回数だけ繰り返します。 NEXT の変数は省略できません。
GOSUB~RETURN
GOSUB <行番号> <処理> RETURN
指定した行にあるサブルーチンを呼び出します。RETURN でサブルーチンから戻ります。
GOTO
GOTO <行番号>
指定した行へジャンプします。
HELP
HELP
ヘルプ (ステートメント一覧) を表示します
IF
IF <条件> <文>
<条件> で条件判断を行い、その結果に応じて <文> を実行します。THEN ステートメントはありません。
INPUT
INPUT <変数>
入力したデータを指定した変数に代入します。
IODIR
IODIR <ピン番号>, <方向>
ピン番号の入出力を指定します。0 が入力で、1 が出力、2 が恐らく内部プルアップ有効な入力です。
→pinMode()
IOGET
IOGET(<ピン番号>)
指定したピンの値を読み取ります。その結果は HIGH (1) または LOW (0) となります。
→digitalRead()
IOSET
IOSET <ピン番号>, <値>
HIGH (1) または LOW (0) を、指定したピンに出力します。
→digitalWrite()
LET
LET <変数>=<値>
変数に値を代入します。LET は省略可能です。
LIST
LIST 〔<行番号>〕
メモリにあるプログラムリストを画面に表示します。
MEM
MEM
フリーエリア (空きメモリ) を表示します。
NEW
NEW
メモリにあるプログラムを消去し、すべての変数を初期化します。
PEEK
PEEK(<アドレス>)
指定されたアドレスの値を読み出します。
PHEX
PHEX <値>
整数値を16進表現の文字列に変換して表示します。
POKE
POKE <アドレス>, <値>
指定されたアドレスに値を書き込みます。
PRINT
PRINT <式>
画面に文字列や数値を表示します。
→?
REM
REM〔<注釈文>〕
プログラム内に注釈を入れます。
→'
RND
RND(<最大値>)
0..最大値の整数型乱数を返します。
RSEED
RSEED <シード>
RND() 関数の乱数系列を初期化します。
RUN
RUN 〔<行番号>〕
メモリにあるプログラムを実行します。
STOP
STOP
プログラムの実行を停止します。
→END
USR
USR(<アドレス>〔, <引数>〕)
アドレスから始まる機械語サブルーチンを実行します。引数の指定が可能で、戻り値も受け取れます。
書式の〔〕内は省略可能です。
A$ のような文字列変数は使えません。A-Z の一文字変数 (整数型) のみです。
配列変数 @() は実装されていません。
PRINT 文に書式は実装されていません。
INPUT 文にプロンプト文は実装されていません。
RSEED でシードを指定しようにもシードになりそうな値がないので、RSEED をしない方がよっぽどランダムかもしれません...PEEK() でシードを持ってこれるのかな?
Arduino 言語にある analogRead() / analogWrite() に相当するステートメント / 関数はありません。
サンプルとして http://p112.sourceforge.net/tbp112.html にあったHI/LOW GAME を移植してみました。
10 REM ****************************
20 REM *** PLAY THE HI/LOW GAME ***
30 REM ****************************
40 N=RND (100 ): C=0
45 PRINT "GUESS A NUMBER?"
50 INPUT G
60 C=C+1
70 IF G=N GOTO 110
80 IF G>N PRINT "LOWER"
90 IF G<N PRINT "HIGHER"
100 GOTO 50
110 PRINT "YOU GUESSED IT IN " , C, " TRIES!"
移植と言っても、ESP32 の TinyBasic Plus では INPUT 文にプロンプト文が指定できなかったので別途 PRINT 文を追加しただけです (行番号: 45)。
See Also:
AT コマンド
ESP32-WROOM-32 にプログラムを書き込んで使うのではなく、AT コマンドを使ってシリアル通信による外部制御を行う事もできます。ESP-WROOM-02 と違い、工場出荷時のファームではありません。
ファームウェア書き込みに必要なもの
AT コマンドファームを書き込むのに必要なものは以下の二つです。
※記事は最後まで読んだ方がいいと思います。
ファームウェア書き込み
Arduino IDE のシリアルモニタ等を開いていないか確認してください。ESP32-WROOM-32 のシリアルポートを開いているとファームウェア書き込みに失敗します。
Flash Download Tools を起動します。実行ファイルは Flash Download Tools のフォルダの中にある ESPFlashDownloadTool_xxxxxx .exe です (xxxxx はバージョン番号)。
[ESP32 DownloadTool] を選択します。
ESP32 DownloadTool が起動します。
[Download Path Config] でファームウェアとアドレスを指定します。左側にあるチェックボックスにはチェックを入れてください。ファームウェアは ESP32-WROOM-32 AT Bin を解凍したフォルダの中にあります。
bootloader.bin 0x1000 bootloader フォルダの中
partitions_at.bin 0x8000
phy_init_data.bin 0xf000
blank.bin 0x10000 おそらく必須
esp-at.bin 0x100000
[FLASH SIZE] を指定します。ESP32-WROOM-32 のフラッシュメモリは 4MB なので 32Mbit を指定します。
COM ポートとデータ転送レートを指定したら [START] ボタンを押してファームウェアを書き込みます。
書き込みが正常に終了すると、ステータスアイコンが FINISH になります。
ESP32-WROOM-32 をリセットまたは電源を切って再投入します。
AT コマンドの使い方
まずはシリアルモニタやターミナルソフトで ESP32-WROOM-32 に接続してみましょう。データ転送レートは 115200 で改行コードは CR+LF です。
最後までスクロールして、エラーが表示されていなければ AT コマンドが使える...のですが、このまま AT コマンドを入力しても何の反応もありません。実は AT コマンドは UART2 を使う 必要があります...つまり、別途 USB<->シリアル変換器 が必要となります。
接続は以下のようになります。
TXD IO16 (UART2: RXD)
RXD IO17 (UART2: TXD)
GND GND
USB<->シリアル変換 のポートで AT[ENTER] と入力してみます (データ転送レートは 115200 で改行コードは CR+LF です)。OK が返ってくれば正常動作しています。
AT+GMR[ENTER] でバージョン情報を表示できます。AT コマンドの詳細については以下の資料を参考にしてください。
ビルトイン BASIC が...
Flash Download Tools を使って AT コマンドファームウェアを導入すると、ビルトイン BASIC は起動しなくなってしまいます 。バックアップ を書き戻して IO12 をプルアップしてもビルトイン BASIC は起動しません。これはフューズビット CONSOLE_DEBUG_DISABLE が 1 に設定されてしまうからのようです。
C:\ESP32> espefuse.py --port COM14 summary
espefuse.py v2.2-dev
Connecting......
Security fuses:
FLASH_CRYPT_CNT Flash encryption mode counter = 0 R/W (0x0)
FLASH_CRYPT_CONFIG Flash encryption config (key tweak bits) = 0 R/W (0x0)
CONSOLE_DEBUG_DISABLE Disable ROM BASIC interpreter fallback = 1 R/W (0x1)
ABS_DONE_0 secure boot enabled for bootloader = 0 R/W (0x0)
ABS_DONE_1 secure boot abstract 1 locked = 0 R/W (0x0)
JTAG_DISABLE Disable JTAG = 0 R/W (0x0)
DISABLE_DL_ENCRYPT Disable flash encryption in UART bootloader = 0 R/W (0x0)
DISABLE_DL_DECRYPT Disable flash decryption in UART bootloader = 0 R/W (0x0)
DISABLE_DL_CACHE Disable flash cache in UART bootloader = 0 R/W (0x0)
BLK1 Flash encryption key
= 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W
BLK2 Secure boot key
= 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W
BLK3 Variable Block 3
= 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W
Efuse fuses:
WR_DIS Efuse write disable mask = 0 R/W (0x0)
RD_DIS Efuse read disablemask = 0 R/W (0x0)
CODING_SCHEME Efuse variable block length scheme = 0 R/W (0x0)
KEY_STATUS Usage of efuse block 3 (reserved) = 0 R/W (0x0)
Config fuses:
XPD_SDIO_FORCE Ignore MTDI pin (GPIO12) for VDD_SDIO on reset = 0 R/W (0x0)
XPD_SDIO_REG If XPD_SDIO_FORCE, enable VDD_SDIO reg on reset = 0 R/W (0x0)
XPD_SDIO_TIEH If XPD_SDIO_FORCE & XPD_SDIO_REG, 1=3.3V 0=1.8V = 0 R/W (0x0)
SPI_PAD_CONFIG_CLK Override SD_CLK pad (GPIO6/SPICLK) = 0 R/W (0x0)
SPI_PAD_CONFIG_Q Override SD_DATA_0 pad (GPIO7/SPIQ) = 0 R/W (0x0)
SPI_PAD_CONFIG_D Override SD_DATA_1 pad (GPIO8/SPID) = 0 R/W (0x0)
SPI_PAD_CONFIG_HD Override SD_DATA_2 pad (GPIO9/SPIHD) = 0 R/W (0x0)
SPI_PAD_CONFIG_CS0 Override SD_CMD pad (GPIO11/SPICS0) = 0 R/W (0x0)
DISABLE_SDIO_HOST Disable SDIO host = 0 R/W (0x0)
Identity fuses:
MAC MAC Address = xx:xx:xx:xx:xx:xx R/W
CHIP_VERSION Chip version = 0 R/W (0x0)
CHIP_PACKAGE Chip package identifier = 0 R/W (0x0)
Flash voltage (VDD_SDIO) determined by GPIO12 on reset (High for 1.8V, Low/NC for 3.3V).
...確か ESP32 では ON にしたフューズビットを OFF にする事はできなかったような気が。
See Also:
ビルトイン BASIC も AT コマンドも使いたい
[Flash Download Tools] を使わずに AT コマンドファームを書き込めば、フューズビット CONSOLE_DEBUG_DISABLE は立たないようです。
オリジナルのファームをバックアップ する。
ESP32-WROOM-32 AT Bin を解凍し、ESP32_AT_BIN というフォルダごと Arduino インストールフォルダ\hardware\espressif\esp32\tools に保存する。
以下のスクリプトを Flash_AT_Firmware.cmd という名前で Arduino インストールフォルダ\hardware\espressif\esp32\tools に保存する (esptool.exe の行は一行なので注意)。
@echo off
SET COM_PORT=COM4
esptool.exe --chip esp32 --port %COM_PORT% --baud 921600 write_flash 0x1000 ESP32_AT_BIN\bootloader\bootloader.bin 0xf000 ESP32_AT_BIN\phy_init_data.bin 0x100000 ESP32_AT_BIN\esp-at.bin 0x8000 ESP32_AT_BIN\partitions_at.bin 0x10000 ESP32_AT_BIN\blank.bin
Flash_AT_Firmware.cmd を管理者として実行する。
要は "esptool を使って書き込め" という事なのですが、「ビルトイン BASIC なんてどうでもいいやー」という方は気にする必要はありません。
CONSOLE_DEBUG_DISABLE が立ってしまった ESP32-WROOM-32 で上記手順を踏んでもフラグが元に戻るわけではありません。
オリジナルファームに戻すには、バックアップしておいたファームをリストア します。
AT コマンドファームが書き込んであっても IO12 がプルアップされていればビルトイン BASIC が起動します。
Tips
BLE ライブラリが不正と怒られる
Arduino-ESP32 のインストールフォルダにある libraries\BLE フォルダが空なので、ここに ESP32 BLE for Arduino をインストールする必要があります。
https://github.com/nkolban/ESP32_BLE_Arduino/ から [Clone or download] ボタンを押し、zip アーカイブを取得。
解凍したアーカイブの中身を <Arduino-ESP32 インストールフォルダ>\libraries\BLE にコピー。
階層は以下のようになる。
ライブラリマネージャからもインストールできますが、その場合には Arduino-ESP32 のインストールフォルダにある libraries\BLE という空フォルダ (あれば) は削除した方がいいと思います。
将来はどうなるかわかりませんが、現状 (2017/10/15 現在) では上記手順を踏む必要があるようです。
A fatal error occurred: MD5 of file does not match data in flash! ってエラーが出る!
ビルトイン BASIC を試したまま、IO12 のプルアップ抵抗を外していない とか?
get.exe (get.py) を実行してもツールが取得されない (SSL エラーになる)
Windows の場合、get.exe を管理者権限で実行してみてください。また、get.exe をファイアーウォールから除外してみてください。それでもちゃんと動作しない場合には、手動で DL してみてください。
espressif\esp32\package にある package_esp32_index.template.json をテキストエディタで開き、DL すべきファイルを調査する。Windows なら以下のようなファイルを DL する。
ToolChain : https://dl.espressif.com/dl/xtensa-esp32-elf-win32-1.22.0-75-gbaf03c2-5.2.0.zip
ESPTool : https://dl.espressif.com/dl/esptool-4dab24e-windows.zip
mkSPIFFS : https://github.com/igrr/mkspiffs/releases/download/0.2.1/mkspiffs-0.2.1-windows.zip
上記 URL はサンプルなので最新版とは限りません。package_esp32_index.template.json を必ずチェックしてください。
アーカイブ自体は espressif\esp32\tools\dist に保存する。
それぞれのアーカイブを espressif\esp32\tools の所定の位置へ展開する。
サイズの割にはダウンロードに時間が掛かります。
簡易温度計
ダイ温度は temperatureRead() で調べる事ができます。
void setup() {
Serial.begin(115200 );
while (!Serial);
}
void loop() {
float degree = temperatureRead();
Serial.print(degree, 1 );
Serial.println("℃" );
delay(1000 );
}
temperatureRead() の戻り値はセルシウス度 (℃) です。ダイ温度なので高めの温度が出ます。
ここにある情報が役に立って、「調べる手間が省けたからオマイに飯でもおごってやるよ」 というハートウォーミングな方がいらっしゃいましたら、下のボタンからどうぞ。