【ラズパイ電子工作】スイッチのON/OFF状態を読み取る方法

【ラズパイ電子工作】スイッチのON/OFF状態を読み取る方法

ラズベリーパイは基板上に「GPIO」と呼ばれる、ラズベリーパイ上で作成したプログラムから信号の入力・信号の出力といった制御をすることができるピンが存在します。

信号の入力とは「スイッチのON/OFF」「温度計で室温の計測」といった、ラズベリーパイの外の情報を入力(インプット)してプログラム上で使用することです。

対して、信号の出力とは「LEDを点灯させる」「モータを回す」といった、ラズベリーパイで制御した結果を外に出力(アウトプット)することです。

この記事では、ラズベリーパイのGPIOピンを用いてスイッチのON/OFF状態を読み取り、実行結果に”0” or ”1”として表示させる方法について解説します。

注意
この記事中に記載されている内容はソースコード含めて電気設計人が自己流で行ったものです。一般的な方法とは相違がある可能性がありますので予めご了承ください。

1. 完成イメージ(スイッチのON/OFF状態を読み取る)

この記事で完成するものは以下のようになります。

10_完成イメージ

↑はラズベリーパイでPythonを実行するアプリケーション「Thonny(トニー)」の実行結果を映しています。(ちょっと見えにくいですが…)

今回はスイッチが押されている時に”1”押されていないときに”0”を1秒間隔で表示するようにしています。

↓スイッチが押されていないとき

11_実行結果1

↓スイッチを途中で押したとき

11_実行結果2
メモ
プログラム実行中、スイッチ状態の読み取りは無限に繰り返します。

2. 使用する部品

今回使用する部品は以下の通りです。

ラズベリーパイ本体(モデル3B+)

20_ラズベリーパイ3B+

『Raspberry Pi 3 Model B+』を使用します。※2019年12月時点で最新はRaspberry Pi 4になります。

ブレッドボード

20_ブレッドボート

LEDや抵抗といった各種部品や(後述する)ジャンパ線などを穴に差し込み、部品間を電気的に接続する板(ボード)です。

電子工作をする上で必須の部品です。

ジャンパ線

20_ジャンパ線

ブレッドボートに差し込み、電子部品の間を電気的に接続します。

↑の写真では両側が「ピン」になっており、ブレッドボートの穴に差し込んで使用します。

タクトスイッチ

20_タクトスイッチ

スイッチを押すと、内部の回路が繋がり電流を流します。

↑のタクトスイッチの場合、黒い部分を指などで押します。

メモ
電気的に繋がっている状態を「導通している」と表現することもあります。

オススメの電子工作セット

電子工作をするため、これまで解説した部品の他にもスイッチやセンサなど、色々な部品が必要になってきます。個々で購入するには手間がかかるため、最初はセット品を購入することをおススメします。

電気設計人
電気設計人

私は以下のセット品を購入しました!

また、これからラズベリーパイを購入する場合、ラズベリーパイ本体を含めたセット品を購入することをおススメします。

ラズベリーパイ本体を収めるケースや、OSをインストールするためmicroSDカードなど必要なものを個々に購入する手間を省くことができます。

3. 回路図・配線の様子

ラズベリーパイのGPIOピンを用いてスイッチのON/OFF状態を読み取り、実行結果に”0” or ”1”として表示させる回路を解説します。

回路図

回路図は以下のようになります。

30_回路図

ラズベリーパイの3.3Vをタクトスイッチの片側に接続します。(赤いジャンパ線)

ラズベリーパイのGPIO 23番ポートをタクトスイッチのもう一方に接続します。(白いジャンパ線)

配線の様子

配線の様子です。こんな感じになりました。

31_配線の様子

↑では、フラットケーブルでGPIOの全ピンをブレッドボードに接続しています。回路図と実際の配線は異なる部分がありますがご了承ください。

※電気的には「回路図」と同じ意味です。

4. プログラム(Python)

ラズベリーパイのGPIOピンを用いてスイッチのON/OFF状態を読み取り、実行結果に”0” or ”1”として表示させるプログラム(Python)は以下のようになります。

ソースコード

#必要なモジュールをインポート
import RPi.GPIO as GPIO             #GPIO用のモジュールをインポート
import time                         #時間制御用のモジュールをインポート
import sys                          #sysモジュールをインポート

#ポート番号の定義
Sw_pin = 23                         #変数"Sw_pin"に23を格納

#GPIOの設定
GPIO.setmode(GPIO.BCM)              #GPIOのモードを"GPIO.BCM"に設定
#GPIO23を入力モードに設定してプルダウン抵抗を有効にする
GPIO.setup(Sw_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

#while文で無限ループ
#GPIO23の入力を読み取る
while True:
    try:
        print(GPIO.input(Sw_pin))           #GPIO23が「ONで"1"」「OFFで"0"」
        time.sleep(1)                       #5秒間待つ
    except KeyboardInterrupt:               #Ctrl+Cキーが押された
        GPIO.cleanup()                      #GPIOをクリーンアップ
        sys.exit()                          #プログラムを終了

GPIO 23番ポートを入力モードに設定後、while文で無限ループして1秒間隔でGPIO 23番ポートの状態を読み取り、電流が流れている場合は”1”電流が流れていない場合は”0”を表示しています。

プログラムの解説

#必要なモジュールをインポート
import RPi.GPIO as GPIO             #GPIO用のモジュールをインポート
import time                         #時間制御用のモジュールをインポート
import sys                          #sysモジュールをインポート

2行目~4行目で、GPIOピンを用いてスイッチのON/OFF状態を1秒間隔で読み取るために必要な「モジュール」を宣言します。

#ポート番号の定義
Sw_pin = 23                         #変数"Sw_pin"に23を格納

変数”Sw_pin”に23を格納します。後からGPIOのポート番号を変更する場合はここを変更します。

#GPIOの設定
GPIO.setmode(GPIO.BCM)              #GPIOのモードを"GPIO.BCM"に設定
#GPIO23を入力モードに設定してプルダウン抵抗を有効にする
GPIO.setup(Sw_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

GPIOの設定を行います。

GPIO.setmode(GPIO.BCM)は、GPIO.setmode()を用いてGPIOをポート番号で扱う方法に設定します。

GPIO.setup(Sw_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)は、GPIO 23番ポートの内部にある抵抗をプルダウン抵抗に設定します。

メモ
プルダウン抵抗を設定していない場合、スイッチが押されていないとき、GPIOは電源にもGNDにも接続されていない状態になるため「値が不安定」になり、スイッチの状態を正しく読み取れない可能性があります。
#while文で無限ループ
#GPIO23の入力を読み取る
while True:
    try:
        print(GPIO.input(Sw_pin))           #GPIO23が「ONで"1"」「OFFで"0"」
        time.sleep(1)                       #5秒間待つ
    except KeyboardInterrupt:               #Ctrl+Cキーが押された
        GPIO.cleanup()                      #GPIOをクリーンアップ
        sys.exit()                          #プログラムを終了

「while文」は条件を指定して、その条件が真の時に繰り返し処理を行うものです。

Python
while 条件式:
    繰り返し処理を行うコード

↑の「条件式」にtrueを指定することにより、条件式は常に真となりwhile文は無限に繰り返します。

メモ
無限に繰り返すことを、無限ループと表現したりします。

ただし、このままではプログラム実行中に無限ループから抜け出す方法がありません。そこでwhile文の中にある「try文」と「except文」を使用します。

このtry-except文を用いることにより、while文の処理は以下のようになります。

Python
while True:
    try:
        繰り返し処理を行うコード
    except KeyboardInterrupt:               #Ctrl+Cキーが押された
        GPIO.cleanup()                      #GPIOをクリーンアップ
        sys.exit()                          #プログラムを終了

except KeyboardInterrupt:は、キーボードのCtrl + Cキーが押された時にwhile文の繰り返し処理から抜けて「GPIOのクリーンアップ」と「プログラムの終了」の処理を行います。

Ctrl + Cキーが押されていないとき、try:文の中の処理を繰り返し行います。(以下で解説)

print(GPIO.input(Sw_pin))は、GPIO 23番ポートの状態を読み取り”1”or”0”を表示します。

もう少し噛み砕くとGPIO.input(Sw_pin)は、GPIO 23番ポートに電流が流れていれば場合”1”となり、流れていなければ”0”となります。

この場合のprint()関数は、実行結果にGPIO.input(Sw_pin)の値を表示させているだけです。

Python
print(表示する変数)
    変数の値を表示するコード

time.sleep(1)は、何もせずに1秒間待ちます。この処理を行うために2行目でtimeモジュールをインポートしています。

while文の中(18,19行目)で、GPIO 23番ポートの状態を読み取り⇒0.5秒待つ処理を無限に繰り返します。

5. おわりに

ラズベリーパイのGPIOピンを用いてスイッチのON/OFF状態を読み取り、実行結果に”0” or ”1”として表示させる方法を解説しました。

まだまだラズベリーパイ初心者の私ですが、以下の参考書が大変参考にさせて頂いております。

2冊とも初学者にも易しい内容になっており、ゼロからラズベリーパイを始める方にもオススメできる参考書です。

1 COMMENT

久林

失礼致します、アマゾンの広報担当の久林と申します。BLOGにてお客様のレビューをご拝見させて頂きました、つきましてはお客様に弊社のラズベリーパイ4ケースレビューを投稿して頂きたく存じます。レビュー用機材に関しましては無償にて提供させて頂きます。御返事お待ちしております。どうぞよろしくお願いします

返信する

久林 へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です