ESP32のpinMode()について調べた

INPUT, OUTPUT, INPUT_PULLUPしかないと思っていたら、ANALOGとか他にもあったのね、、、

現時点の情報になりますので、最新情報はM5StickC非公式日本語リファレンスを確認してください。

概要

標準のArduinoとESP32ではpinMode()の設定値が違いますので注意しましょう!

利用する前に正しい設定値で設定してから使いましょう。PINによって初期値が違いますので、たまたま動いていたものを、他のPINに移動したら動かなくなったなどのトラブルになりやすいです。

モードの組み合わせ要素

入出力(INPUT, OUTPUT, ANALOG)

INPUTかOUTPUTかで入力用なのか、出力用なのかを選びます。ただしアナログ処理に関しては別途ANALOGという選択肢があります。

ANALOGを選ぶとADCの割当を行っているので、アナログ出力のDACはOUTPUTを指定するような気がしますが、実際にはANALOGでもアナログ出力が可能でした。

プル(PULLUP, PULLDOWN)

プルアップの場合には、電源から内部プルアップ抵抗を経由して、PINに接続されます。通常はHIGHで、そのPINに接続したスイッチやケーブルなどがGNDに接続されるとLOWになります。ノイズに強いことと、複数の機材が接続しているときでもGNDに落とせば誰かがシグナルを出しているのかがわかりやすいので使われています。

プルダウンの場合には、GNDに内部プルダウン抵抗を経由して、PINに接続されます。通常はLOWで、そのPINに接続したスイッチやケーブルなどが電源に接続されるとHIGHになります。こちらもノイズがのってもGNDに流れるので、ノイズの影響を受けにくくなります。

無指定の場合には、どちらでもありません。GNDや電源に接続されている場合には正しい数値になりますが、なにも接続されていない場合には電気が流れる先がないので、センサーに残っている、変な値を取得することになります。

プルダウンも、プルアップも回路上に本来不要な電気がすこし流れることになるので、電力的にはすこしロスになります。ただし、通常は気にするほどの量ではないと思います。

また、プルダウンとプルアップはどちらも同じような効果の回路ですが、一般的にはプルアップがよく使われています。過去はプルダウンを利用したほうがよいICが多かったのですが、現状は慣習としてプルアップを利用している場合が多いです。

オープンドレイン(OPEN_DRAIN)

I2Cなどで使われており、LOWは0Vになるが、HIGHは何もしない(ハイインピーダンス)の状態です。

そのPIN以外がプルアップでHIGHにしている回路に対して、LOWにしたい場合に利用します。HIGHのときに出力をしないのは、すでにプルアップされているのでHIGHの出力が意味がないからです。また、接続先がLOWになっている場合に、出力したHIGHの電力が無駄になるからです。

設定可能なモード

  • INPUT
  • OUTPUT
  • PULLUP(単独指定不可)
  • INPUT_PULLUP
  • PULLDOWN(単独指定不可)
  • INPUT_PULLDOWN
  • OPEN_DRAIN(単独指定不可)
  • OUTPUT_OPEN_DRAIN
  • SPECIAL
  • FUNCTION_1
  • FUNCTION_2
  • FUNCTION_3
  • FUNCTION_4
  • FUNCTION_5
  • FUNCTION_6
  • ANALOG

上記の中でSPECIALとFUNCTION系は特殊なモードで、UARTやSPIを初期化するときに利用するモードみたいですが、普通は使うことはないはずです。

INPUT_PULLUPは(INPUT | PULLUP)の指定になるので、実質的に利用するのは下記の6種類になります。

  • INPUT
  • INPUT_PULLUP
  • INPUT_PULLDOWN
  • OUTPUT
  • OUTPUT_OPEN_DRAIN
  • ANALOG

まとめ

実際のところ、INPUT, OUTPUT, INPUT_PULLUP, ANALOG以外は、実質利用しないみたいです。ANALOGがちゃんと取得できるようになったので良かったです。

コメント