前回、Raspberry Pi4Bで簡単なLチカをやってみました。
※PythonでLED点滅の記事はこちら↓
今回は、「タクトスイッチ」を使ってLチカをやってみたいと思います。
必要な材料は下記の通りです。
・Raspberry Pi 4B
・LED
・タクトスイッチ
・150Ω抵抗
・10KΩ抵抗
・ジャンピングワイヤー(オス-メス×4 オスーオス×1)
今回は、タクトスイッチを押した時のみLEDが点灯する仕様にしますので、はっきりいってラズパイで制御しなくても可能ではありますが、「GPIOのインプット」を利用した制御にしますので、そういった観点で見てもらえると良いと思います。
また、電子回路でよく出てくる「プルダウン」「プルアップ」についても触れていきたいと思います。
回路構成
GPIO配列図
一応載せておきます。
回路図
ラズパイのGPIOから3.3Vを取り出し、タクトスイッチで回路を開閉させてGPIO17をHIGH、LOWさせます。(GPIO IN)
GPIO4は、GPIO17がHIGHの時のみ、3.3Vが出力されるようにします。(GPIO OUT)
つまり、タクトスイッチがONの場合、LEDが点灯する回路です。
配線図
プルダウンとプルアップについて
プルダウンとプルアップは、色々な用途で利用されますが、今回は「ICなどの動作不良を防ぐ」目的で使います。
回路構成は異なりますが、動作不良を防ぐという目的では同じです。
簡単に言えば、回路の一部が浮いている(どこにもつながっていない状態)である場合、例えばそれがICの一端であった場合に、環境の影響で電位が生じてしまう事があります。プルダウンとプルアップを利用すれば、それを防ぐ事が可能です。
プルダウン
図のように、GPIOとGND間に10KΩ抵抗を挟みます。
GPIOは抵抗を介してGNDと繋がっているので、環境の影響を受けにくくなります。抵抗を介してGNDに落ちるので、電位差が生じにくくなっているのです。
タクトスイッチをONにすると、GPIOと抵抗は並列で構成されているので、GPIOに3.3Vが印可されます。10KΩの方には、ほぼ電流が流れないので問題はありません。
プルアップ
プルダウンと異なるのは、タクトスイッチがOFFで3.3VがGPIOに印可されている事です。
3.3VとGPIOの間に10KΩがあるので、一見電圧降下でGPIOに電源が印可されないと思いがちですが、GPIOの先にはCPU内部へとつながっており、そこには更に大きな抵抗値を持っているため、3.3VはGPIOに印可される仕組みです。
10KΩと1MΩを直列に配置し、3.3Vかけると考えると分かりやすいです。電流値は0.03A程度です。つまり、1MΩの方にほぼ3.3Vが印可される訳です。
タクトスイッチON時は、GNDとつながるので電圧が0Vになります。プルダウンと逆ですね。もちろん環境の影響を受ける事はありません。
プログラム
Python
Thonnyで作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import RPi.GPIO as GPIO from time import sleep GPIO.setmode(GPIO.BCM) GPIO.setup(4,GPIO.OUT) GPIO.setup(17,GPIO.IN) while True: if GPIO.input(17)==GPIO.HIGH: GPIO.output(4,GPIO.HIGH) else: GPIO.output(4,GPIO.LOW) sleep(0.01) |
6行目の初期化処理に追加で、GPIO17をインプットとして使う宣言をします。
ループ本文には、分岐条件のif文を使います。
10行目は、GPIO17が「HIGH」であるか、の分岐になります。==は変数に入れるのではなく、同じ内容であるかという記述になります。
つまり、今回の場合ではタクトスイッチをONにすると、17がHIGHになります。真の値となるので、11行目のGPIO4のアウトプットが「HIGH」になる動作をします。これがLED点灯です。
ループなのでタクトスイッチを押し続けると、10行目と11行目が繰り返し実行され、LEDが点灯し続けます。
反対にタクトスイッチをOFFすれば、ifの分岐で偽の値となるため、12行目のelseに進みます。
そして13行目のGPIO4の出力が「LOW」になり、LEDは消灯します。
最後のsleep(0.01)に関しては、プログラムを走り続けると他の計算処理が遅くなる(タスク処理が出来なくなる)ので、一瞬プログラムを止めている記述になります。ループ毎に一旦休ませてる感じですね。
こんな感じの動作になります。↓
まとめると、GPIO17のインプット(タクトスイッチ)のHIGH、LOW、でGPIO4のアウトプットHIGH、LOW,を制御するプログラムになります。
冒頭に書いた通り、プログラムで制御する事でもない機能ですが、GPIOのインプットで、他のGPIOのアウトプットを制御する基本的な事を学べると思います。
次回は、タクトスイッチを使ったLチカの最終、「トグル」をやってみようと思います。