マイクロビットとタクトスイッチでプルダウン抵抗について触れてみる



マイクロビットとタクトスイッチで、タクトスイッチのボタンを押したらマイクロビットのディスプレイにチェックのアイコンが表示されるようにしてみます。

タクトスイッチ(黒色): パーツ一般 秋月電子通商-電子部品・ネット通販





続いて、フラッシングするコードを作成します。

MakeCodeであれば、



にし、MicroPythonであれば、

from microbit import *

while True:
    if pin0.read_digital() == 1:
        display.show(Image.YES) 
    else:
        display.clear()

にします。


このコードで冒頭の動画のようにタクトスイッチのボタンを押したら、マイクロビットのディスプレイにチェックが表示され、ボタンを話したらアイコンが消えます。




今回の回路で10kΩの抵抗を使用していることの詳細を見ていきます。

今回の回路は

のようになっています。

何故、GNDの手前で10kΩの抵抗が必要なのでしょうか?



はじめに3.3Vから直接GPIO 0に繋いだ時を考えてみます。



ボタンの押下の有無で、回線が繋がったり外れたりと不安定でよろしくありません。


続いて、



3.3VとGPIO 0の他にGNDの方にも電流を流せるようにします。

これで一見大丈夫なように見えますが、


ボタンの押下でGNDの方に電流が流れてしまいます。

この時に流れる電流はオームの法則を用いて考えてみると、抵抗が 0 であるため、I = V / Rで 抵抗のRが限りなく 0 になるため、電流(I)は電圧(V)の大きさが何であれ大電流が流れることになり、回路がショートしてマイコンが破損します。


ここで回路がショートしないように



GNDの前に抵抗を挟んで、大電流が発生しないようにします。

この時に使用した抵抗の事をプルダウン抵抗と呼びます。




マイクロビットの仕様を読んでみますと、タクトスイッチを用いた時にマイコンに大電流が流れないように必要に応じてプル設定が自動で行われます。

get_pull - 入出力端子 — BBC micro:bit MicroPython 1.0.1 ドキュメント


今回試したコードを少し改修して、自動で設定されるプル設定についてを見ていきます。


from microbit import *

# 定数PULL_UPで定義されている値を調べておく
print("NO_PULL:"+str(pin0.NO_PULL))
print("PULL_DOWN:"+str(pin0.PULL_DOWN))
print("PULL_UP:"+str(pin0.PULL_UP))

# ダミーでPIN0で1度値を読み取ってみる。この処理をしないと下の行のget_pullができない
_dummy = pin0.read_digital()

pull_setting = pin0.get_pull()
print("PIN0 PULL SETTING:"+str(pull_setting))

while True:
	if pin0.read_digital() == 1:
		display.show(Image.YES)
	else:
		display.clear()

上記コードをフラッシングした後、マイクロビットを動かしてみると、

NO_PULL:2
PULL_DOWN:1
PULL_UP:0
PIN0 PULL SETTING:0

が出力されました。


まだ触れていませんが、今回のコードではプルアップ抵抗が自動で設定されていました。


今回のコードを抵抗なしで対応する場合は、

from microbit import *

# PIN0のプル設定をプルダウンにする
pin0.set_pull(pin0.PULL_DOWN)

pull_setting = pin0.get_pull()
print("PIN0 PULL SETTING:"+str(pull_setting))

while True:
	if pin0.read_digital() == 1:
		display.show(Image.YES)
	else:
		display.clear()

にすると良いです。