ArduinoスケッチでESPをオープンドレイン出力させる方法

ラズパイだとGPIOのオープンドレイン出力はできなさそうでしたが、Arduinoでは簡単にできるようです。
今回は、ArduinoスケッチでESP WROOM02のGPIOをオープンドレイン出力させて見たいと思います。
オープンドレインとは
通常、GPIOの出力はCMOS出力とかプッシュプル出力とか呼ばれる形式になっています。
回路図で描くとこうなります。

上側のMOSスイッチがオンすると出力がHigh(3.3V)に、下側がオンするとLow(0V)になります。
オープンドレインは、下側のMOSだけがある状態です。
MOSのドレインがどこにも繋がっていないのでオープンドレインと言われます。

MOSがオンすればLow、オフすればハイインピーダンスとなります。
オープンドレインの用途
- レベルシフト
- ワイヤードOR
- 信号の割り込み、リセット
などがあります。
レベルシフト
High電圧を異なる電圧に乗り換えて、出力先のデバイスに合わせることができます。

ESPの場合、電源電圧(3.3V)より高い電圧へのレベルシフトはできません。
電源側へ電流が回り込んで、最悪破壊してしまいます。
ワイヤードオア
複数のオープンドレインを接続してNORを構成することができます。

マイコンの場合、ワイヤードORを使うメリットはほとんど無いかと思います。
コチラの記事が参考になります。
外部サイトワイヤードORとは?回路例と禁止されている接続方法
信号の割り込み、リセット
電圧をモニタしている箇所へ接続し、異常時などのトリガーでオープンドレインをオンさせて強制的にLowにさせることができます。

工作で使うことは無いと思いますが、製品開発でフェールセーフの論理を組む時などにはよく使います。
コードの書き方
pinModeをOUTPUT_OPEN_DRAINにすることでオープンドレイン出力にすることができます。
10msごとにオン・オフを繰り返すスケッチを書いてみました。
#define OD_PIN 14
void setup() {
pinMode(OD_PIN, OUTPUT_OPEN_DRAIN);
}
void loop() {
digitalWrite(OD_PIN, LOW);
delay(10);
digitalWrite(OD_PIN, HIGH);
delay(10);
}
LOWでMOSがオンとなって出力がLOW、HIGHでMOSがオフとなって出力がHi-Zとなります。
回路図、接続図
出力がオープンドレインになっていることを確かめるために、このような回路で電圧をモニタします。

オープンドレインになっていれば、High電圧は1.65Vになるはずです。
もしCMOS出力のままなら、High電圧は3.3Vになります。
オシロで波形を確認すると、このようにHigh電圧が1.65Vになっていたので、オープンドレインになっていることを確認できました!
