もう1つの小さなtidビット:AVRやUnoなどのArduino ATmega328ベースのボードなど、明示的な「オープンドレイン」モードを持たないマイクロコントローラーの場合、この「オープンドレイン」モードはラッパー関数を記述することでシミュレートできます。これは、送信時にピンを単に「出力LOW」に0
設定し、送信時にピンを「入力LOW」(高インピーダンスモード、内部プルアップ抵抗がオンではない)に設定します1
。これにより、同じ効果が得られます。これらの最新の32ビットARMコアマイクロコントローラーには、さらに多くのオプションがあります。
また、上記にリンクされたSTM32リファレンスマニュアルの p146には、次のように記載されています[私の追加は角括弧で囲まれています]:
–オープンドレインモード:出力レジスタの「0」はN-MOS をアクティブにします(これにより、ピンをGNDに接続することによりLOWをアクティブに駆動します)。出力レジスタの「1」はポートをHi-Z(P- MOSがアクティブになることはありません)[高インピーダンスモード-プルアップ抵抗またはプルダウン抵抗のないフローティング入力と同じ]
–プッシュプルモード:出力レジスタの「0」はN-MOSをアクティブにします(ピンをGNDに接続してLOWをアクティブにします)。出力レジスタの「1」はP-MOSをアクティブにしますVCCへのピン]
Arduinoコードでは、「ラッパー関数」は次のように実装できます。
digitalWriteOpenDrain(byte pin, bool state)
{
// Actively drive LOW
if (state==LOW)
{
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
}
// High impedance mode
// (note that an internal or external pull-up resistor can optionally be added if you like, according to your requirements)
else //state==HIGH
{
pinMode(pin, INPUT);
digitalWrite(pin, LOW);
}
}
または簡略化:
digitalWriteOpenDrain(byte pin, bool state)
{
digitalWrite(pin, LOW);
// Actively drive LOW
if (state==LOW)
{
pinMode(pin, OUTPUT);
}
// High impedance mode
// (note that an internal or external pull-up resistor can optionally be added if you like, according to your requirements)
else //state==HIGH
{
pinMode(pin, INPUT);
}
}
Arduinoで内部プルアップ抵抗をオンにするには、次の操作を実行できることに注意してください。
pinMode(pin, INPUT_PULLUP);
または(同じこと):
pinMode(pin, INPUT);
digitalWrite(pin, HIGH);
追加の読み物: