プログラミングと日々思ったことなど

ブログ名通りです。仕事でプログラミングをはじめました。

タクトスイッチを使った電子工作【ラズパイ】

勉強になりました:


https://www.fabshop.jp/lesson3-controlling-led-with-switch/


【電子工作】プルアップ回路とプルダウン回路とは?(危険回路についても) - Qiita


マイコン入門 LEDの点灯・消灯制御方法【入出力ポート機能】

参考書通りにタクトスイッチを動かしてみようと色々やっていたのですが、うまく行かないので色々調べました。

まず①通りに行いました。
f:id:boa0203:20191007154624j:plain:w300
f:id:boa0203:20191007154651j:plain:w300

抵抗が見合った大きさになっているのかが心配ですが、ちゃんと動きました。
①のプログラムの中で、以下のような分岐があります。

if GPIO.input(BtnPin) == GPIO.LOW:
print ('...led on')
GPIO.output(LedPin, GPIO.LOW)
else:
print ('led off...')
GPIO.output(LedPin, GPIO.HIGH)

ここがよくわからなかった。
①記事の中で、プルアップ抵抗をプログラム上で設定しており、ボタンが押されていない時には3.3Vがかかっている。そのため、ボタンを押さなければ入力はHigh(3.3V)になっているのでelseにいくといったような説明があります。

プルアップ抵抗というのは、②の記事の内容がわかりやすいのでみて欲しいです。
ショート回路(ボタンの抵抗値がないためショートしてしまう)・オープン回路(インプットがボタンが押されていない時にどこにもいけなくなってしまう)の説明があります。
ショート回路・オープン回路にならないために、抵抗をかませる(→プルアップ・プルダウン抵抗)が必要なのです。

プルアップ・プルダウン抵抗は理解し、疑問は再び①のプログラム分岐に戻ります。

if GPIO.input(BtnPin) == GPIO.LOW:
print ('...led on')
GPIO.output(LedPin, GPIO.LOW)
else:
print ('led off...')
GPIO.output(LedPin, GPIO.HIGH)

プルアップ抵抗を設定しているので、スイッチを押さなければ常に3.3Vが流れているのはわかりました。
しかしLOWの時、(スイッチが押されたとき)にLEDは光ります。
LOWの時は0Vになっているのに、何故outputにGPIO.LOWを入れると光るのでしょうか。

そこで③を見ます。
③でLEDの光る構造がわかります。
LEDは電位差が生じることにより、電源から電流が放出されマイコン側に流れ込みLEDが点灯します。
常に流れているのは3.3Vで、GPIOの出力を0Vにする。
そこで電位差が生じるので電流が流れてLEDが点灯する、という理解を今しています。

ここまで調べた後、参考書のタクトスイッチを動かしてみました。
プルアップ抵抗を変えるとちゃんと動作したので、良かったです。