RPi.GPIOライブラリの基本的な使いかたはコチラにまとめてあります。
今回は、説明不足だったRPi.GPIOライブラリのsetupメソッドについて補足しておきます。
GPIOを出力として使用する場合
GPIOを出力として使用する場合、setupメソッドのinitial引数で初期値を設定できます。
import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) channel = 4 GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH) # GPIO.HIGHはTrue, 1 と同義 GPIO.setup(channel, GPIO.OUT, initial=GPIO.LOW) # GPIO.LOWはFalse, 0 と同義
- initials=GPIO.HIGH なら 1
- initials=GPIO.LOW なら 0
が出力されます。
GPIOを入力として使用する場合
GPIOを入力として使用する場合、setupメソッドのpull_up_down引数でプルアップ抵抗、プルダウン抵抗を指定出来ます。
わたしを含め電子工作初心者には「プルアップ抵抗?プルダウン抵抗?」という感じです。
プルアップ抵抗は、ある配線と “Hi” に相当する電圧レベル(例えば 5V)との間に挿入され、その配線に入力が無い場合(OFF状態)のときに “Hi” レベルの電圧をかける働きをする。そして、プルアップ抵抗が接続されている配線を “Low” レベルに接続(ON状態:電位0Vの接地と接続)する操作をすれば配線は0Vになる。
プルダウン抵抗(プルダウンていこう、英: pull-down resistor)は、プルアップ抵抗とは反対に、入力がない場合に “Low” レベルの電圧(通常、電位0V)にしておくために使われる。
—Wikipediaより
つまり
プルダウン抵抗を有効にしておくと、回路が繋がってない状態でGPIOはLowになって、回路が繋がったらGPIOはHiになる
こういうことです。
プルアップ抵抗、プルダウン抵抗の設定のしかたは
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP) # プルアップ抵抗を有効化 GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # プルダウン抵抗を有効化
このように書きます。
プルアップ抵抗、プルダウン抵抗を使ってみる
せっかくなので、プルアップ抵抗とプルダウン抵抗にどんな違いがあるのかテストしてみます。
左側のタクトスイッチを含む回路は
P17(3.3V電源) – タクトスイッチ – P19(GPIO10)
で、右側のタクトスイッチを含む回路は
P21(GPIO09) – タクトスイッチ – P39(GND)
です。
現状ではどちらの回路も繋がっておらず、タクトスイッチを押したら回路が繋がります。
左側の回路は3.3V電源に繋がっているので、P19(GPIO10)をプルダウン抵抗によってLow(0V)にすれば回路が繋がったときに電流が流れるはずです。
一方、右側の回路はGNDに繋がっているので、P21(GPIO09)をプルアップ抵抗によってHi(3.3V)にすれば回路が繋がったときに電流が流れるはずです。
では、実際にこの回路をPythonの対話型シェルで操作しながらGPIOの電圧を測ってみます。
まずは
import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) # pin setting left_switch_pin = 19 right_switch_pin = 21 GPIO.setup(left_switch_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(right_switch_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
こんな感じでP19(GPIO10)のプルダウン抵抗とP21(GPIO09)のプルアップ抵抗を有効にして、それぞれの値を測ってみます。
# タクトスイッチを押してないときの状態 GPIO.input(left_switch_pin) >>> 0 # GPIO.LOW, Falseと同義 GPIO.input(right_switch_pin) >>> 1 # GPIO.HIGH, Trueと同義
それぞれ回路が繋がってない状態でプルダウン抵抗を有効にしたP19(GPIO10)はGPIO.LOWに、プルアップ抵抗を有効にしたP21(GPIO09)はGPIO.HIGHになってます。
次に、タクトスイッチを押した状態でもう一度それぞれの値を測ってみます。
# タクトスイッチを押したまま再計測 GPIO.input(left_switch_pin) >>> 1 # GPIO.HIGH, Trueと同義 GPIO.input(right_switch_pin) >>> 0 # GPIO.LOW, Falseと同義 GPIO.cleanup()
回路が繋がった状態ではWikipediaの説明にあるとおり、プルダウン抵抗を有効にしたP19(GPIO10)はGPIO.HIGHに、プルアップ抵抗を有効にしたP21(GPIO09)はGPIO.LOWになりました。
プルアップ抵抗、プルダウン抵抗が必要な理由
プルアップ抵抗(プルダウン抵抗)を有効にしていると、回路が繋がっていない状態でもGPIOの値はGPIO.HIGH(GPIO.LOW)に固定されるため、回路が安定します。
ですが、プルアップ抵抗(プルダウン抵抗)を無効にしていると、回路が繋がっていない状態のGPIOの値はGPIO.HIGH(GPIO.LOW)固定されないため、回路が不安定な状態になります。
それにより誤動作を引き起こす可能性があるようです。
また、左側の回路のようなケースでは、プルダウン抵抗を無効にした状態でタクトスイッチを押して回路を繋いでしまうと、GPIOに大電流が流れてしまいRaspberry Piが壊れるおそれもあるようです。
この辺まだ電子回路勉強中なのでピンと来ないんですが、そうなんでしょうね…w
RPi.GPIOの入出力設定(setupメソッド)についてはこれくらい知ってればひとまず大丈夫だと思います。
Raspberry Piを使って電子工作をしてみたいと思っているかたにはこの本がオススメです(初心者向け)。
Raspberry PiへOSをインストールするところから基本的な電子デバイスの操作、PCやスマホからの制御といった高度な内容まで広く網羅されています。
電子工作は中学校の授業以来でしたが、電流、電圧、オームの法則など基本的な予備知識についても解説されていて最初の一冊には良いかなと思います。
新書なのでコスパも良いですw
この本のレビューも書いていますので、気になる方はご覧ください。
コメント
Python初心者です。
一つ聞きたいことがあります。
「initial=GPIO.HIGH」の部分はなぜ「initial」という変数にわざわざ代入しているのですか?ただ単に「GPIO.HIGH」という記載だけでよいような気もするのですがPythonの仕様でそうなっているのですか。
このGPIO.HIGHは定数だと思うのですが。
鈴木さん、はじめまして。
「initial=GPIO.HIGH」についてですが、GPIO.setup関数のinitial引数にGPIO.HIGHを設定するということを明示的に記述しているだけですので、鈴木さんがお考えのとおり「GPIO.HIGH」と記述するだけでも問題ありません。