
こんにちは、メカ旦那です!

旦那~、Arduinoで電子工作してたらプルダウン、プルアップという言葉が出てきました…これ何ですか?…

プルダウンとは電子回路においてどの部品とも繋がらずHIGHかLOWか不明な状態を、意図的にLOWにすることです。逆に、プルアップはHIGHにすることです。スイッチ入力回路やマイコン・ICのGPIO出力でよく出てきますので、その観点で解説します!
プルダウンとは?
スイッチ入力回路
プルダウンとは電子回路においてどの部品とも繋がらずHIGHかLOWか不明な状態を、意図的にLOWにすることです。
例えば、下図のようにArduino(マイコン)を使って、スイッチを押す間LEDが点灯する回路を作ります。Arduinoの3ピンでスイッチの信号を受け取り(入力ピン)、7ピンでLEDへ命令信号を送信します(出力ピン)。

/* ボタンを押している状態だけLED点灯、離したら消灯 */
void setup() {
pinMode(3, INPUT); //3ピンを入力ピンにする
pinMode(7, OUTPUT); //7ピンを出力ピンにする
}
void loop() {
if(digitalRead(3)== HIGH){ //もし3ピンがHIGHなら
digitalWrite(7,1); //7ピンをHIGHにする
}
else { //もし3ピンがLOWなら
digitalWrite(7,0); //7ピンをLOWにする
}
}
この時スイッチを押すと、入力ピンは5Vピンと回路ができ、HIGH(電位が5V) になります。

ここで、スイッチから指を離したら入力ピンはどうなるでしょうか。
入力ピンは5Vピンとの回路が切断されます。またGNDピンとも接続されていないため、状態が不明になってしまいます。迷子みたいになっちゃうわけですね。電子回路界隈では「浮いている」「開放」とも言います。

入力ピン(3ピン)の状態が不明だと、下記のようにif文の条件になっていた時、{}内の処理が上手く作動しなくなります。
if(digitalRead(3)== HIGH){ //もし3ピンがHIGHなら
digitalWrite(7,1); //7ピンをHIGHにする
}
else { //もし3ピンがLOWなら
digitalWrite(7,0); //7ピンをLOWにする
}
そこで、入力ピンを抵抗を通じてGNDと回路を作ることで、スイッチを押していない時はLOW(電位が0V)になるようにします。

このように 電子回路においてどの部品とも繋がらず電位が不明な際に、意図的にLOWにすることをプルダウンと言います。
この状態でボタンを押すと5 Vと回路ができ、入力ピンはHIGHとなります。つまり、ボタンを押した時はHIGH、押していない時はLOWとしっかり認識できるので、回路が上手く作動するんですね。

用途
先ほどの通り、「押したらHIGH、押していない時はLOW」の入力回路を作りたい時は、プルダウンが使われます。プルダウンの用途としては以下が挙げられます。
プルアップとは?
スイッチ入力回路
プルアップとは電子回路においてどの部品とも繋がらずHIGHかLOWか不明な状態を、意図的にHIGHにすることです。
先ほどのプルダウンでは「スイッチ入力で押したらHIGH、押していない時はLOWの回路を作りたい時」に使用しましたが、プルアップは逆に「スイッチ入力で押したらLOW、押していない時はHIGHの回路を作りたい時」に使用します。この場合プルダウン回路とは逆向きに電流を流す必要があります。つまり、下記のように作り変える必要があります。

if(digitalRead(3)== LOW){ //もし3ピンがLOWなら
digitalWrite(7,1); //7ピンをHIGHにする
}
マイコンのGPIO出力回路
プルアップはスイッチ入力回路でも用いられますが、どちらかと言えばマイコンやICのGPIO出力回路でよく利用されます。
一般的にマイコンから信号出力する際、プッシュプル、オープンドレイン(コレクタ)の2種類があります。プッシュプルはLOW,HIGH両方とも出力できますが、オープンドレインはLOWは出力できてもHIGHはできません。HIGHを出力するために接続する抵抗がプルアップ抵抗になります。

プルアップ抵抗値としては4.7〜10 kΩが一般的です。ただし接続するモジュールやセンサには最初からプルアップ抵抗が実装されていることがあります。 その抵抗値が4.7〜10 kΩの場合、外付けは不要です(抵抗値がこれより低かったり高かったりすると通信が不安定になる可能性がある為、その場合は外付けした方が無難です。)。

え、プルアップ抵抗がいらないプッシュプルの方が便利じゃないですか~
なんでオープンドレインなんかあるんですか?

実はオープンドレインにも色んなメリットがあるんですよ!
用途
プルアップの用途としては以下が挙げられます。
I2C通信について気になる方は下記記事もぜひご覧ください!
各マイコンの注意点
基本的にプルアップ、プルダウンは抵抗を外付け接続する事で有効化できますが、一部のマイコンには最初から接続されており、それを初期状態や関数(内部プルアップ機能)で使うことができます。電子工作でよく用いられるマイコンを中心に解説します。
Arduino Uno R3

Arduino Uno R3 は初期状態では全GPIOがハイインピーダンス(HIGHでもLOWでも無い状態)ですが、関数を使う事でプルアップを有効化する事ができます(内部プルアップ)。
やり方としては、pinMode関数で入力ピンをINPUT_PULLUPにします。
//内部プルアップの関数
pinMode(pin, INPUT_PULLUP);
プルアップ抵抗値は約20~50kΩとなります。ちなみにプルダウンは付いていないので外付け接続が必要です。
Raspberry Pi

ラズパイは初期状態で全GPIOがプルアップ、プルダウンのどちらかです。
例えばI2C通信が割り当てられるGPIO2,3は最初からプルアップになっています。I2Cはオープンドレイン方式のため普通はプルアップ抵抗が必要ですが、ラズパイは不要になります。
ラズパイは関数で内部プルアップ/ダウン両方使う事ができます。ただしI2C、SPI、UARTなど通信系ピンの設定を変えると不具合に繋がる可能性があるため避けた方が良さそうです。
抵抗値は約50kΩです。
//内部プルアップの関数
GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
//内部プルダウンの関数
GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
まとめ
まとめると、
になります。
ぜひ覚えておきましょう!
コメント