2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Raspberry Pi 3 でタクトスイッチを使った簡単な回路でプルアップ抵抗とプルダウン抵抗をちゃんと理解したい

2
Last updated at Posted at 2026-07-07

プロローグ

物理があんまり得意でなかったので、電流が流れていないのに電圧が生じているという事象に頭がこんがらがっている。
そのせいでタイトルがラノベのように長くなってしまったが、がんばって理解したい。

プルアップ抵抗

回路

3.3V ──[10kΩ]──┬── GPIO18
               │
             (ボタン)
               │
              GND

3.3V ── [330Ω] ── (LED) ── GPIO17

ボタンがOFFの時はボタン側回路には電流が流れないので10KΩ抵抗の両端の電位差はなく両方3.3VなのでGPIO18は3.3V(HIGH)となる。
ボタンをONにすると電流が流れるので10KΩ抵抗の両端に電位差が生じてGPIO18側は0V(LOW)になる。

ソースコード

#include <stdio.h>
#include <wiringPi.h>

#define LED_PIN_BCM 17
#define BUTTON_PIN_BCM 18

int main(void) {
    if (wiringPiSetupPinType(WPI_PIN_BCM) == -1) {
        printf("setup wiringPi failed.");
        return 1;
    }

    pinMode(LED_PIN_BCM, OUTPUT);
    pinMode(BUTTON_PIN_BCM, INPUT);
    digitalWrite(LED_PIN_BCM, HIGH);    // Led off

    while (1) {
        // Button pressed
        if (digitalRead(BUTTON_PIN_BCM) == LOW) {
            // Led on
            digitalWrite(LED_PIN_BCM, LOW);
        } else {
            // Led off
            digitalWrite(LED_PIN_BCM, HIGH);
        }
    }

    return 0;
}

実行

$ gcc ./button1.c -o button1 -lwiringPi
$ ./button1

pull-up.png


プルダウン抵抗

回路

3.3V ─(ボタン)──┬── GPIO18
                │
              [10kΩ]
                │
               GND

3.3V ── [330Ω] ── (LED) ── GPIO17

ボタンがOFFの時はボタン側回路には電流が流れないので10kΩ抵抗の両端の電位差はなく両方0VなのでGPIO18は0V(LOW)となる。
ボタンをONにすると電流が流れて10kΩ抵抗の両端に電位差が生じGPIO18側は3.3V(HIGH)になる。

ソースコード

ボタンが押された判定がさっきと逆になる。

    ...

    while (1) {
        // Button pressed
        if (digitalRead(BUTTON_PIN_BCM) == HIGH) {
            // Led on
            digitalWrite(LED_PIN_BCM, LOW);
        } else {
            // Led off
            digitalWrite(LED_PIN_BCM, HIGH);
        }
    }

    ...

pull-down.png


内部プルアップ抵抗

ボタン回路の10kΩ抵抗をやめてGPIOに備わっている内部プルアップ/プルダウン抵抗を使用する。
まずはプルアップから。

回路

GPIO18 ── (ボタン) ── GND

3.3V ── [330Ω] ── (LED) ── GPIO17

GPIO18は内部で3.3Vへ弱くプルアップされる。

ソースコード

pullUpDnControl(BUTTON_PIN_BCM, PUD_UP); を追加しただけ。

    ...

    if (wiringPiSetupPinType(WPI_PIN_BCM) == -1) {
        printf("setup wiringPi failed.");
        return 1;
    }

    // pull up
    pullUpDnControl(BUTTON_PIN_BCM, PUD_UP);

    pinMode(LED_PIN_BCM, OUTPUT);
    pinMode(BUTTON_PIN_BCM, INPUT);

    ...

internal_pull-up.png


内部プルダウン抵抗

次はプルダウン。うっかりショートさせてしまうのではないかという恐怖に襲われる。

回路

3.3V ── (ボタン) ── GPIO18

3.3V ── [330Ω] ── (LED) ── GPIO17

GPIO18は内部でGNDへ弱くプルダウンされる。

ソースコード

pullUpDnControl() の第2引数にPUD_DOWNを指定。

    ...

    if (wiringPiSetupPinType(WPI_PIN_BCM) == -1) {
        printf("setup wiringPi failed.");
        return 1;
    }

    // pull down
    pullUpDnControl(BUTTON_PIN_BCM, PUD_DOWN);

    pinMode(LED_PIN_BCM, OUTPUT);
    pinMode(BUTTON_PIN_BCM, INPUT);

    ...

internal_pull-down.png


エピローグ

新たな部品セットが発掘されたので今回からLEDの抵抗には330Ωを使用。
次回はこのままタクトスイッチを使ってバウンシングを確認したり割込みを試してみたりとかしたい。

参考文献

ここのクイズのおかげで何とか理解できた気がする。ありがたい。だからもうしばらく残しておいてほしい。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?