プロローグ
物理があんまり得意でなかったので、電流が流れていないのに電圧が生じているという事象に頭がこんがらがっている。
そのせいでタイトルがラノベのように長くなってしまったが、がんばって理解したい。
プルアップ抵抗
回路
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
プルダウン抵抗
回路
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);
}
}
...
内部プルアップ抵抗
ボタン回路の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);
...
内部プルダウン抵抗
次はプルダウン。うっかりショートさせてしまうのではないかという恐怖に襲われる。
回路
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);
...
エピローグ
新たな部品セットが発掘されたので今回からLEDの抵抗には330Ωを使用。
次回はこのままタクトスイッチを使ってバウンシングを確認したり割込みを試してみたりとかしたい。
参考文献
ここのクイズのおかげで何とか理解できた気がする。ありがたい。だからもうしばらく残しておいてほしい。



