Arduino 言語における ESP-WROOM-32 の入出力関数

気づけばもう一年以上経っていますね。このページは更新されませぬ m(_ _)m

DEKO さんのページ見ておけば間違いないです。どうぞ:

 https://ht-deko.com/arduino/esp-wroom-32.html




 …このページを見た人がいるという事を知ってなお自棄になって消したい気持ちもあったり、拙くて申し訳なかったなぁという気持ちもあったり、参考になった人そうでない人もありがとうございました。







このページは私があまりにも WROOM-32 の入出力が分からないからメモしています。あくまでもメモです。



次の入出力関数の使い方を調べました知りました

 DAC 出力 dacWrite

 アナログ入力 analogRead

 PWM 出力 ledcWrite

 シグマデルタ出力 sigmaDeltaWrite

 ホールセンサ hallRead




ピンの名前・役割・機能

 まずよく使うの挙げておきましょう。

SPI ( MOSI, MISO, SCLK ) = { GPIO 23, 19, 18 };

※ SS とか CS って端子は個体識別のためのピンなので任意です。デフォルトでは GPIO 5 ですがスケッチで指定してある場合はほかのピンです。

I2C ( SDA, SCL ) = { GPIO 21, 22 };

DAC ( DAC1, DAC2 ) = { GPIO 25, 26 };


 最も大切なのは ESP-WROOM-32 というモジュールでは GPIO 6~11 が内部フラッシュにつながっているので使えないよ!というお話ですね。digitalWrite してみると分かりますけど、6 か 7 を使うと再起動して以降無限ループします。

 で、さて。固定役割のない一見フリーなピンがモジュールの左側に並んでますね。これを無作為に選んでテキトーに使おうとすると GPIO 34~37 が読み取り専用という落とし穴にはまりますね。TFT 動かなくて悩んでた事がありました。ほんとに自由に使えるピンって GPIO 4, 13, 14, 16, 17, 27, 32, 33 くらいかな。

※ GPIO 36 は Low Noise Amplifier の VP、37 は VN という名前が与えられていて特殊な端子っぽいですね。そういえばこのアプリケーションまだ調べてないです。LNA と謳っているその効果のほどは。


参考図1

ツイッターで知りました この ↓ 画像

Arduino (328P) では GPIO から取れる電流が 40 mA MAX ですが、ESP32 (WROOM-32) では最大で 12 mA MAX までしか取れないところに注意です。6 mA 程度に抑えておくのがオススメとのこと。取り出せる電流をすべて取るというのは電源と GND をショートさせているのと同じ意味になりますので注意です。LED つなぐなら単純計算で 510Ω 以上ですね。単純というのは半導体は Vf があるんで式 (Vin-Vf) / mA でないと、って事で赤色 LED なら Vf=2.1 くらいで 200Ω くらいだから~といってもハラハラドキドキ綱渡りするのはここじゃなくても良いかなぁと。1k でも 10k でも LED 光りますよね。明るくしたい時はトランジスタ使ったりしてめんどくさがらないのが吉ですよね。野暮ったい話ですね。ヤーネ)。


参考図2

この ↓ 画像で Wire のデフォルトピンを知りました。ただこの図は(参考図1が正しいとすると)ADC + s + n で s= ADC1: "", ADC2: "1"; という書き方をしているようです。間違えてると思った…

(引用元:https://github.com/espressif/arduino-esp32 )



DAC (アナログ出力)


2 チャンネルの DAC を持っています。8 bit です。ピンは GPIO25 と GPIO26 のみです。

関数

 ・void dacWrite( pin, value );

値の範囲は 8 bit なので 0~255 です。

※ PWM は動作電圧を細切れにして疑似的に強弱を表現する方法ですが、

DAC は本当に数 mV ~ 3 V のような直流の電圧を出力できます。

 

 ・#define digitalPinToDacChannel( pin );

25 だと 0 を、26 を指定すると 1 を、それ以外だと -1 というピン番号における DAC チャンネルを返す定数?関数?のようです。
ほかにも digitalPinHasPWM( pin ), digitalPinToAnalogChannel( pin ) , digitalPinToTouchChannel( pin ) といった、リファレンスを見れば分かるものがいくつか同様の形態で実装されているようです。





ADC (アナログ入力)


6 本 + 10 本で二系統 16 本の SAR (逐次比較型) ADC を持っています。解像度は 12 bit です。ピンは参考図2のほうが分かりやすいですね。18 本と説明のあるものもありますが、これは下記 LNA を含めた重複したピンの本数なので論理本数と言えそうですが、物理的には 16 本です。

欠番がある理由、通し番号でない意味、それから analogRead と何が違うのか、の調べがまだつかずにいます…

超低ノイズアンプ(LNA)

 ADC の 0 と 3 のシルク印刷は Sensor_VP(GPIO36)、Sensor_VN(GPIO39) となっており、「Ultra Low Noise Analog Pre-Amplifier」という機能が備わっています。

回路図を見るに内部 (ESP32 の端子 → ESP-WROOM-32 の端子) で

    SensorCAPP - 270pF - SensVP

    SensorCAPN - 270pF - SensVN

というふうになっているようです。よくわかりません。


でもって VN、VP って何かと思っていたんですけど Positive / Negative でしょうね、おそらく。

欠番

 規則性がありますね。0, (1, 2), 3, (4, 5), 6, .. となっていて、内部で三本使っているのでは、とか思えません?…かね…。気になってたんですがどうでもいいですね ()

関数

 ・int analogRead( pin );

戻り値は 0~4095 (12 bit) の正の整数です。指定のピンへ入力できる電圧の範囲は 0.0~3.3 V です(動作電圧が 3.3 V)。
参考:
http://ht-deko.com/arduino/esp-wroom-32.html#05

 ・int hallRead();

オンチップ ホールセンサの値が得られます。戻り値は正負、整数です。
ピン Sensor_VN と Sensor_VP を短絡して LNA (LowNoiseAmplifier) を無効にして使います。//memo: まるで正常に見えない下辺あたりのまばらな値を返す。内部センサらしいので続調査…
端子は何も余計な事しなくていいみたいです。

Twitter@ht_deko さん情報ありがとうございました。




LEDC (デジタル出力)


16 本の LED PWM チャンネルを持っています。ピンは任意の GPIO です。

80 MHz のリアルタイムクロックで動いているそうです。Duty の解像度(正確性)は 16 bit。LEDC は全ての GPIO ピンで利用可能です。

LEDC のサンプルファイルは Arduino IDE の [ ファイル ] - [ スケッチ例 ] - [ ESP32 ] - [ AnalogOut ] - [ LEDCSoftwareFade ] から開く事が出来ます。


このへんもよくわからないので こちら をご覧くださいm(_ _)m

関数

 ・void ledcSetup( ch: 0~15, freq, resolutionBits: 1~16 );

LEDC 周波数は解像度に依存するとのことです。サンプルのコメントを見るぶんにはタイマーの精度のようです。


 ・void ledcAttachPin( pin, ch: 0~15 );

指定のピンで指定の LEDC チャンネルを使えるようにします。
//memo: 1 ch 多ピン制御と切り替えの確認


 ・void ledcWrite( ch, duty: 0~255 );

指定のチャンネルへ、指定の duty 比で PWM 出力します。


 ・void ledcWriteNote( ch, note, octave );

これはなんだか MIDI っぽいですね。


 ・int ledcRead( ch );

ledcWrite で出力している duty 値を返します。


 ・double ledcReadFreq( ch );

ledcSetup で指定した freq を返します。
//memo: と思うんですが、意味不明な値が帰ってきます。要調査。


 ・void ledcDetachPin( pin );

指定のピンを LEDC 出力から解放します






SigmaDelta (出力)


8 チャンネルの SigmaDelta を持っています。

SigmaDelta というのは Wikipedia を読む限りでは解像度を高めてノイズを減らすデジタル信号処理技術だという印象を持ちました。アナログに近づくためのデジタル信号処理という感じでしょうか。

関数

 ・void sigmaDeltaSetup( ch: 0 ~ 7, freq: 1220 ~ 312500, duty: 0 ~ 255 );

 ・void sigmaDeltaAttachPin( pin, ch );

 ・void sigmaDeltaWrite( ch, duty );

 ・void sigmaDeltaDetachPin( pin );

・8 つのうちの任意の ch を指定の引数でセットアップ
・任意のピンに、その ch をアタッチ
・その ch へ書き込む

・ピンを解放

という感じで指定のチャンネルに対して読み書きをするモデルのようです。ピンを解放するだけなのでチャンネルのセットアップ内容は生き残っているという意味でしょうね。

 ・uint8_t sigmaDeltaRead( ch )

sigmaDeltaWrite( ch ) で現在出力中の duty 比の値を返します。

Twitter@DenshiClub さん、ご指摘ありがとうございました。


更新

180401 最後の手入れをしたけどそれでも散らかりっぱなしです 0(:3 )〜 _('、3」 ∠ )_

170315 懸念、LNA 項へ追記、hallRead を修正

170303 IR、SDIO、SD、I2C、UART、モーターPWM へスケルトンの追加。キャパシタの懸念の項を追加。ADC 追記。全体の構成を微調整。


0コメント

  • 1000 / 1000

月札秋幌の電気日記

思うのは電気の良さです。