PR
スポンサーリンク

【初心者】プルダウン、プルアップとは?イラストを使ってわかりやすく解説!

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

メカ坊や
メカ坊や

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

メカ旦那
メカ旦那

プルダウンとは電子回路においてどの部品とも繋がらずHIGHかLOWか不明な状態を、意図的にLOWにすることです。逆に、プルアップHIGHにすることです。スイッチ入力回路やマイコン・ICのGPIO出力でよく出てきますので、その観点で解説します!

プルダウンとは?

スイッチ入力回路

プルダウンとは電子回路においてどの部品とも繋がらずHIGHかLOWか不明な状態を、意図的にLOWにすることです。

例えば、下図のようにArduino(マイコン)を使って、スイッチを押す間LEDが点灯する回路を作ります。Arduinoの3ピンでスイッチの信号を受け取り(入力ピン)、7ピンでLEDへ命令信号を送信します(出力ピン)。

回路図はfritzingを用いて作成しています
/* ボタンを押している状態だけ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」の回路を作りたい時
  • ある信号線において、電源起動時、待機時、未接続時にデフォルトでLOWにしたい場合。「起動時に勝手に信号線がHIGHになると困る」回路では、プルダウンで確実に0Vからスタートさせます。

プルアップとは?

スイッチ入力回路

プルアップとは電子回路においてどの部品とも繋がらずHIGHかLOWか不明な状態を、意図的にHIGHにすることです。

先ほどのプルダウンでは「スイッチ入力で押したらHIGH、押していない時はLOWの回路を作りたい時」に使用しましたが、プルアップは逆に「スイッチ入力で押したらLOW、押していない時はHIGHの回路を作りたい時」に使用します。この場合プルダウン回路とは逆向きに電流を流す必要があります。つまり、下記のように作り変える必要があります。

  • 5VピンはGNDピンに (GNDピンは5Vピンに) 接続し直す
  • -極+極に (+極は-極に) 接続し直す
  • プログラム中のif文の条件をHIGHからLOWに変える。
    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Ωの場合、外付けは不要です(抵抗値がこれより低かったり高かったりすると通信が不安定になる可能性がある為、その場合は外付けした方が無難です。)。  

メカ坊や
メカ坊や

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

メカ旦那
メカ旦那

実はオープンドレインにも色んなメリットがあるんですよ!

オープンドレインのメリット
  • 異なるロジックレベルに対応できる。
    • マイコンやICのIO最大電圧(ロジックレベル)は1.8V、3.3V、5V等様々あります。ロジックレベルが低いIC→高いICへ信号送信すると、相手がHIGHと認識できない可能性があります。逆に高いIC→低いICへ送信すると、相手が過電圧で故障する恐れがあります。オープンドレインの場合、プルアップ抵抗を相手のロジックレベルと同じ電圧に接続すれば、異なるレベル同士でも通信が可能になります。
  • 通信相手が同じ信号線を駆動しても故障しない
    • 例えば同じ信号線であるICが5Vを、相手のICが0Vを出力すると、抵抗値が限りなく低いために大電流が流れ、双方が壊れてしまいます。オープンドレインの場合、複数のICが同時に出力しても0Vしかないため、壊れる恐れはありません。どれか1つがLOWを出力したら全体がLOWになります。
オープンドレインのデメリット
  • 通信速度が遅くなる
    • HIGHを出力する時、プッシュプルは電源電圧からMOSFET経由で電流が流れる事で素早く出力でき、高速通信が可能になります。一方でオープンドレインは電源電圧から比較的抵抗値が高い抵抗を経由して電流を流すため、出力が少し遅くなります。その為、オープンドレイン方式のI2C通信より、プッシュプル方式のSPI通信の方が速度は速くなります。

用途

プルアップの用途としては以下が挙げられます。

  • スイッチ入力で「押したらLOW、押していない時はHIGH」の回路を作りたい時
  • マイコンのGPIO出力がオープンドレイン(コレクタ)になる時。具体的にはI2C通信が挙げられる。

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)

まとめ

まとめると、

  • プルダウン
    電子回路が切断され電位が不明になった際に、意図的にLOWにすること。
  • プルアップ
    電子回路が切断され電位が不明になった際に、意図的にHIGHにすること。
  • 一部のマイコンには最初からプルアップ抵抗が接続されており、それを初期状態や関数(内部プルアップ機能)で使うことができる。

になります。

ぜひ覚えておきましょう!

メカ旦那

旧帝大工学部を卒業後、電気制御設計職をしています。生産設備や産業用ロボット等、様々な開発に取り組んでいます。電験三種も保持しています。イラストや画像を用いて電気・電子・制御をわかりやすく解説します!

メカ旦那をフォローする
Arduino基礎知識
スポンサーリンク

コメント