« ★★タイニーBASIC GPIO+AnalogIOの簡易拡張成功 | トップページ | ★★★タイニーBASIC GPIO+AnalogIO拡張 PWM高速化・ADC高精度化 »

2024年4月 6日 (土)

ESP32 WROOM/WROVER GPIO16,17使用可否実機検証

先日拡張したTinyBasicの開発に使った手持ちのボードではGPIO16,17ピンが出ておらず、GPIO操作対象外としてました。
他のボードを調べていたら、普通のESP32-DevKitC-32EやESP32-DevKitC-VEでは、外部ピンとして出ているのが分かりました。
ボードにより、ピンあるならTinyBasicでの操作対象にしておくべきとの思いが浮かんできました。

今回、秋月電子から開発キットのESP32-DevKitC-32EとESP32-DevKitC-VEを購入したので、TinyBasicでGPIO16,17の操作を試し、使えるか検証してみました。

結論を表にまとめてみました。

開発キット 搭載モジュール PSRAM・FLASH GPIO16,17用途 GPIO16,17使用可否
ESP32-DevKitC-VE WROVER 8M PSRAM有
8M FLASH有
PSRAM制御に使用
 CS#、SRAM_CLK
不可
NC
ESP32-DevKitC-32E WROOM PSRAM無し
4M FLASH有
フリー

使用可

TinyBasic GPIO+AnalogIO版へのフィードバックとしては、GPIO16,17を操作対象としておき、
WROVERモジュールを使っている場合は実際には使えない事に注意」程度にしようと思います。

---------------------------------------

2024-4-21追記
ArduinoIDEでのタイニーBASICの書き込みの際に出力画面に出るメッセージには、chip型番、搭載メモリ情報、CPUクロック、MACアドレスなどの情報が書き出されているのに気づきました。今後のタイニーBASICの拡張・プログラム領域拡大・スタック深さ拡大などで、参考になりそうなので、以下にメッセージ例を添付。

ESP32-DevKitC-32E
(ESP32-WROOM-32E)
最大1310720バイトのフラッシュメモリのうち、スケッチが754525バイト(57%)を使っています。
最大327680バイトのRAMのうち、グローバル変数が78836バイト(24%)を使っていて、ローカル変数で248844バイト使うことができます。
esptool.py v4.5.1
Serial port COM6
Connecting....
Chip is ESP32-D0WD-V3 (revision v3.1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 省略
ESP32-DevKitC-VE
(ESP32-WROVER-E)
最大1310720バイトのフラッシュメモリのうち、スケッチが772921バイト(58%)を使っています。
最大327680バイトのRAMのうち、グローバル変数が78924バイト(24%)を使っていて、ローカル変数で248756バイト使うことができます。
esptool.py v4.5.1
Serial port COM5
Connecting....
Chip is ESP32-D0WD-V3 (revision v3.1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 省略

ESP32-D0WD-V3(チップ内FLASH/PSRAM無し)を搭載し、内蔵SRAMが327,680バイト等分かります。(データシートでは520KB SRAMとの記載ですが)。
尚、ArduinoIDEのツールメニュー、FlashのPartition Schemeでは、"Default 4MB with spiffs(1.2MB APP/2.5MB SPIFFS)"を指定しているので、アプリには1.2MB(1310720バイト)を割り当てている条件下でのメッセージです。

Photo_20240421093701
余談ですが、タイニーBASICを載せても、内蔵RAMのリソースは余裕たっぷりなので、もっとプログラム領域を広げるとか、配列要素数やスタック数を増やすとかできそうです。

#define SIZE_LIST 1023 //List buffer size
#define SIZE_ARRY 32 //Array area size
#define SIZE_GSTK 6 //GOSUB stack size(2/nest)
#define SIZE_LSTK 15 //FOR stack size(5/nest)


----------------------------------------

以下、今回調査の詳細です。

 


 

各ボード毎のGPIO16,17ピンの有無

Photo_20240408193701 実際、手持ちで実機検証に使っているFreenove社ESP32-WROVER-Eの開発ボード(写真右)は、カメラモジュールがボード上のコネクタに繋げられる仕様で、カメラ用途で8MBのPSRAMを搭載し多用するためか、GPIO4と5に間にはGPIO16,17が無くGND 2つに代わっています(左図赤枠部分)。またボードのピンの数は、片側20ピン、両側で40ピンと多いです。

秋月のESP32-DevKitC-32E(写真左)と、ESP32-DevKitC-VE(写真中央)では、GPIO16,17が端子に出ています(左図青枠部分)。ピン数は片側19、両側38。純正DevKitCも秋月同様GPIO16,17が出ています。

この事から、手持ちの方が特殊で、通常の開発ボードでを配慮すると、TinyBasicでは操作対象にしておくべきと考え、今回実機で検証しています。

 

PSRAMとFLASHの有無に着目しての比較すると、

ESP32-DevKitC-32E(ESP32-WROOM-32Eモジュール搭載)は PSRAM搭載無しFLASH(4MB)搭載有り
ESP32-DevKitC-VE (ESP32-WROVER-Eモジュール搭載)は  PSRAM(8MB)搭載有りFLASH(8MB)搭載有り

です。以下、Espressif社のDevKitCのWebより抜粋
Photo_20230628203701_20240406172801

今回以下の2者で実機でGPIOを操作して、波形で比較してみました。
ESP32-DevKitC-32E ⇒ 波形出力OK
ESP32-DevKitC-VE   ⇒ 波形出ずNG、全く反応なし

以下、GPIO16,17テストプログラムとオシロ波形です。黄色CH1がGPIO16、青色CH2がGPIO17です。


GPIO16,17テストプログラム

ボード:ESP32-DevKitC-32E

(モジュール:ESP32-WROOM-32)
PSRAM無し:波形出力OK

ボード:ESP32-DevKitC-VE

(モジュール:ESP32-WROVER-E)
PSRAM搭載:波形出ず、全く反応なし

100 REM ---- GPIO16,17 TEST ----
110 PIN_MODE 16,3; PIN_MODE 17,3
200 REM
210 DIGITAL_WRITE 16,1
220 DIGITAL_WRITE 17,1
230 DELAY_MS 100
300 DIGITAL_WRITE 16,0
310 DIGITAL_WRITE 17,0
320 DELAY_MS 100
400 GOTO 210
Img_0227 Img_0226

上記実機検証結果より、ESP32-DevKitC-VEでは全く反応しません。記事の後半でNCを確認。

2024-4-7追記 WROVERであっても、モジュール選択やPSRAM利用設定を変えればどうなるか調べてみました。
・ボードマネージャーでESP32 dev module を選択すると、ツールにPSRAMの項目が現れ、disableかenableが選択できます。
 ここでdisableを選択し、コンパイルして書き込んでも、状況は改善せず全く反応しません。(下図左)
・ボードマネージャーでESP32 wrover moduleを選択すると、ツールにPSRAMの項目すら出てきません。(下右図)
DevWrover

雑感:

今回、GPIO16,17だけですが、開発ボードでのピンの有無に気づいて、実際に入手。
TinyBasicで試しで操作してみたら、今度は別の問題に引っ掛かり、調べて検証し、やっと状況が判明。
と言う感じでした。まあボード毎の制約事項の理解は深まりました。

なかなか、一歩づつ ステップバイステップ って感じですかね。
やってみないと分からないし、疑問を持って調べないと必要な情報には辿り着かないし、最初から注意・制限事項を熟知しておくなんて出来ないし、まあ世の中こんなもんなのでしょう。

ただ、TinyBasicインタープリタをESP32に書けば、TeraTermからの操作ですし、コマンドラインからの直接操作やプログラムの実行で、簡単便利で気楽にIOが操作出来るのって、とっても良い検証環境にもなるって事が、自分でも実感できました。

------------------------------------

WROVERでGPIO16,17がPSRAMを制御している情報です。

・ESP32フォーラム記事の抜粋
(*1)Unable to use gpio 16 and 17 - ESP32 Forum
GPIO16 and 17 may be used for communication with flash or PSRAM, depending on particular chip or module that you have on your development board.
For example see the datasheet of ESP32-WROVER-E module.

Esp32wrovereflashpsram
WROVERのデータシートで最新情報を確認。
下図が15ページ Fig.7がモジュールのリファレンスデザインの回路図で、GPIO16がPSRAMのCS#へ、GPIO17がPSRAMのSRAM_CLKへしっかり繋がっています。
Photo_20240406212001
2024-4-13追記
WROVERのデータシートの周辺回路図 Fig.9を見ると、IO16,17が並んでいるはずの、IO4とIO5の間がNCになっています。
モジュール内でPSRAMと繋がるので、外からは使えない様に、NCにしているのでしょう。
なるほど、今回テスト的にGPIO16,17を強制的に動かしてみたつもりでも、NCなので波形には何の反応も現れない訳ですね。

Photo_20240415072501

2024-4-13追記
WROVERのモジュールは、GPIO16,17がNCとなっているのが本当か、確かめてみました。
単純に、GPIO16,17をOUTPUTに設定し、共に0を出力、GPIO36,39のADC入力へ接続し、ADC変換結果を読み取るものです。
ブレッドボード上で、配線を伸ばしてノイズを拾いやすくしておきました。
以下、テストプログラムと、ブレッドボード配線の写真、100ms毎10回のADC変換結果です。
結果は、予想通り、ADC結果は暴れているので、本当にNCとなっている様な結果が得られました。

100 REM ------ GPIO16,17 ADC INPUT Test ------
110 PIN_MODE 16,3; PIN_MODE 17,3
120 DIGITAL_WRITE 16,0; DIGITAL_WRITE 17,0
130 PIN_MODE 36,192; PIN_MODE 39,192
140 ANALOG_SET_PIN_ATTENUATION 36,3
150 ANALOG_SET_PIN_ATTENUATION 39,3
200 FOR I=0 TO 10
210 PRINT #5,ANALOG_READ 36,#5,ANALOG_READ 39
220 DELAY_MS 100
230 NEXT I

 

Img_0247

1回目の実行結果
Photo_20240415092601

2回目の実行結果
Photo_20240415092701_20240417121601

-------------------------------

2024-4-10追記
一方、ESP32-WROOM-32Eの内部回路情報 Fig.5を見ると、PSRAMは無いですし、内蔵FLASHへはGPIO16,17は接続していない様です。
Photo_20240410113801

2024-4-13追記
ESP32-WROOM-32Eの周辺回路情報 Fig.7を見ると、IO16に注意書きがありました。
PSRAM内蔵のESP32-D0WDR2-V3等では、IO16を10KΩでPullUp、他の用途では使用不可とあります。

Photo_20240415065201

余り気にするべき所ではないかも知れませんが、以下の図が気になるので、念のため確認として調べました。
R11 0(NC)と言う書き方が、オープンなのかショートなのか自分的には混乱しています。
WROVERの回路なので、GPIO17をSRAM_CLKとして、SCK/CLKをFLASH_CLKとして用い、R11は未実装と言う意味で(NC)としているとは思いますが...
Photo_20240417120401
WROOMには、上記回路は見当たりませんが、FLASHは搭載されているので、FLASHとSRAMのクロックを兼用するための接続の目的が過去にあったのかもと思えてしまいます。
であるならば、WROOMのFLASHアクセスにGPIO17の影響は本当にないのか? が気になってしまう訳です。
WROOMの実機テストでDIGITAL_WRITEではGPIO16,17は普通に波形が出せましたが、それはTinyBasicでユーザープログラムの実行中に確認したものでしかなく、FLASHのアクセスはしてなかったので、ハードウェア的に動かしっ放しにできるはずのPWM出力を、GPIO16,17へ出し続け、[esc]でユーザープログラムの走行を止め、その状態でSAVEやLOADでFLASHのアクセスを行い、問題が発生するかどうか調べました。

WROOMにTinyBasicを載せ、GPIO16,17へPWMを出したまま、SAVE→NEW→LOADを繰り返してみました。書き込んだユーザープログラムが化けるとか、動作がおかしくなるとかの支障はみられませんでした。

関係ないはずと信じてはいたものの、確認するまでは安心できなかったのですが、今回WROOMなら、GPIO16,17は試した限りでは問題なく使えるのが分かってよかったです。


 

続報あればまた。

 

« ★★タイニーBASIC GPIO+AnalogIOの簡易拡張成功 | トップページ | ★★★タイニーBASIC GPIO+AnalogIO拡張 PWM高速化・ADC高精度化 »

電子工作:ESP32」カテゴリの記事

電子工作:ESP32 TinyBasic」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

« ★★タイニーBASIC GPIO+AnalogIOの簡易拡張成功 | トップページ | ★★★タイニーBASIC GPIO+AnalogIO拡張 PWM高速化・ADC高精度化 »