Raspberry Pi GPIOピンでプッシュボタンを使用する方法

もしあなたがRaspberry PiでLEDを使ったことがあるなら、GPIO出力がどのように機能するかを知っているでしょう。コードは一般目的入出力(GPIO)ピンを通して電気を流し、LEDを通過させて物を光らせます。しかし、逆のことを試したことはありますか?プッシュボタンを使えば、正確にその逆のことができます。このチュートリアルでは、GPIOピンを入力ピンに変え、あなたが押すすべてのボタンを聞く方法を示します!
目次
- プッシュボタンの仕組み
- 4ピンプッシュボタン
- Raspberry Pi GPIOピンでのプッシュボタンの使用
- プッシュボタンの使い方
- プッシュボタンのハードウェア
- インポートコマンド
- セットアップコマンド
- ループコマンド
- よくある質問
さらに読む: Raspberry Piで点滅LEDを作る方法
プッシュボタンの仕組み
プッシュボタンはスイッチの一種です。2つの別々の導電ピンがあり、互いに分離されているため、完全な回路を防ぎます。プッシュボタンを押すと、実際には2つのピンを押し合わせて回路を完成させます。しかし、手を離すと、スプリングのようなメカニズムがピンを再び分離します。

さらに読む: Raspberry Piをビデオ会議ステーションにする方法
4ピンプッシュボタン
センサーキットに含まれる典型的なプッシュボタンは4つのピンを持ち、それぞれのピンは他のピンから分離されています。ボタンエリアのすぐ下には金属製の動くプレートがあり、プッシュボタンが押されると下に下がり、他のすべてのピンを接続します。

4ピンプッシュボタンの内部には2つのプレートがあります。それぞれは2つの外部ピンに接続されています。両方のプレートは互いに分離されており、ボタンの下にある金属プレートを押すことでのみ接続できます。

ある意味で、プッシュボタンには常に2つのピンが接続されています。4ピンプッシュボタンを押すと、すべての4つのピンが接続されます。
さらに読む: Raspberry PiでArduinoをプログラムする方法
Raspberry Pi GPIOピンでのプッシュボタンの使用
今回は、Raspberry Pi GPIOピンがプッシュボタンからのボタン押下を検出するようにします。電気がそれを通過すると、Raspberry Piは動作中であることを知らせるメッセージを表示します。
必要なもの
- プッシュボタン(4ピン)
- 抵抗(100Ωから1000Ωの間のものが機能するはずです)
- ジャンパーワイヤー
- ボルテメーター(オプション)
- Raspberry Pi
- モニターとキーボード(またはSSH)
さらに読む: Raspberry Pi 4にWindows 11をインストールする方法
プッシュボタンの使い方
- お好みのコードエディタを開き、以下のコードを貼り付けます:
import RPi.GPIO as GPIO
from time import sleep
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
while True:
if GPIO.input(7) == GPIO.HIGH:
print("Pin 7 is HIGH!")
elif GPIO.input(7) == GPIO.LOW:
print("Pin 7 is LOW...")
sleep(0.15)「rpi-pushbutton.py」として保存します(またはファイル拡張子が同じであれば好きな名前で保存できます)。
回路を構築します。プッシュボタンの1つのピンをピン7に接続し、抵抗を並列に接続します。この抵抗の反対側にGNDピン(ピン6、7、14、20、25、30、34、または39)にジャンパーワイヤーを接続し、別のプッシュボタンピンの3.3Vピン(ピン1または17)にもう1本のジャンパーワイヤーを接続します。

ヒント: 正しいピン番号を見つけるには、Raspberry Piを持ち、GPIOピンが右上隅に位置するようにします。左上のピンがピン1で、その右側がピン2です。ピン1の下がピン3で、その右がピン4、というように続きます。

- Raspberry Piの電源を入れ、ターミナルを開きます。
cdを使用してPythonスクリプトのディレクトリに移動し、python3 rpi-pushbutton.pyと入力します。異なるファイル名を使用した場合は、「rpi-pushbutton」の代わりにその名前を使用してください。

- ターミナルに
Pin 7 is LOW...という新しい行のテキストが0.15秒ごとに表示されるはずです。ボタンを押すと、新しい行はPin 7 is HIGH!になります。
GNDと3.3Vピンを切り替えると、抵抗の3.3Vとプッシュボタンの反対側のGNDを接続することになり、プッシュボタンの論理が逆転します。常にPin 7 is HIGH!を出力し、ボタンを押すとPin 7 is LOWになります。

さらに読む: 2024年にチェックすべき最高のRaspberry Piの代替品
プッシュボタンのハードウェア
プッシュボタンは2種類の抵抗を使用します:プルアップ抵抗とプルダウン抵抗。3.3Vが抵抗に接続されているものはプルアップ抵抗です。これは電圧を上に引き上げます。一方、プルダウン抵抗はGNDピンが接続されていることで電圧を下に引き下げます。
抵抗なしでプッシュボタンを使用することもできますが、その場合GPIOピンはフロート状態になります。フロート状態のGPIOピンは直接的な電荷を受け取らず、周囲の電荷を探します。例えば、近くに強い電磁場があると、それを測定するだけになります。

そのため、参照点が必要です。GPIOピンをデフォルトで0V(GND)に接続すると、ボタンが押されていない間は0Vを測定します。しかし、そうしないと、GPIOピンの値はどこにでもあり得ます - 負のボルトでさえ!
フロートピンは面白いことができます。ピンをフロート状態にしておくと、空気中の電圧差を感知し、指がピンの近くを動く影響さえ測定できます。それはまるで電磁的存在センサーのようなものです。
しかし、Raspberry Piでそれを行うことはできません。役立つためにはアナログピンが必要ですが、Raspberry Piにはそれがありません。
プッシュボタンのコード
これを理解すると、ピン7が3.3Vまたは0Vが通過するかを感知することを理解する必要があります。3.3Vを感知すると、HIGHとして報告します。しかし、0Vを感知すると、LOWになります。
コードを3つの部分に分けましょう:インポートコマンド、セットアップコマンド、ループコマンド。
インポートコマンド
2つのインポートコマンドを使用しています:
import RPi.GPIO as GPIO
from time import sleepimport RPi.GPIO as GPIOはRPi.GPIOモジュールをインポートし、Raspberry PiのGPIOピンで操作を行うことを可能にします。最後にas GPIOを追加することで、PythonにGPIOと入力することがRPi.GPIOと同じであることを伝えています。他の文字列に置き換えても、適切にフォーマットされていればコードは動作します。
一方、from time import sleepはPythonのtimeモジュールの一部だけをインポートします。これにより、sleep()関数を使用できます。
セットアップコマンド
RPi.GPIOモジュールの3つのコマンドを使用して、いくつかの設定を修正します。
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)RPi.GPIOモジュールは、Pythonスクリプトを起動するとすぐにGPIOピンを使用することに関する警告メッセージを表示します。GPIO.setwarnings(False)はそれを防ぎます。
GPIO.setmode(GPIO.BOARD)はRPi.GPIOモジュールの別のコマンドです。Pythonに「BOARD」ピン配置を使用していることを伝えます。RPi.GPIOには2種類のピン配置があります:BOARDとBCM。BOARDはピン番号を使用してピンを選択できます。BCM(「Broadcom」の略)は、個々のBroadcom SOCチャネルでピンを選択できます。BOARDは、どのRaspberry Piボードを使用しても常に同じで、使いやすいです。BCMピン配置は、使用するモデルによって変わる可能性があります。
最後に、GPIO.setup(7, GPIO.IN)はピン7を入力ピンとして設定します。.setup()関数を使用し、7を選択しようとしているピンとして読み取ります。GPIO.INは、それを入力ピンとして設定しようとしていることを意味します。
さらに読む: Arduinoの初心者向けガイド
ループコマンド
組み込みシステムは通常、数行のコードを使用し、それを無限にループします。異なるプログラミング言語は異なる方法を使用しますが、概念は同じです:何らかのループを使用します。Pythonの場合、それはwhile True:です。
while True:
if GPIO.input(7) == GPIO.HIGH:
print("Pin 7 is HIGH!")
elif GPIO.input(7) == GPIO.LOW:
print("Pin 7 is LOW...")
sleep(0.15)while True:はコードを無限にループさせます。その中に置いたすべてのものは、ボードに電気が供給されている限り永遠に実行されます。
if GPIO.input(7) == GPIO.HIGH:はif文です。これは、入力ピンであるピン7がHIGHとして読み取られた場合、内部のすべてを実行することを示しています。
print("Pin 7 is HIGH!")はif文の内部にあります。これは単にコンソールにPin 7 is HIGH!と表示するだけです。これを任意の文字列、数字、またはそれを含む変数に置き換えることができます。
次はelif GPIO.input(7) == GPIO.LOW:です。これは基本的にif GPIO.input(7) == GPIO.HIGH:と同じですが、最初の部分が異なります:ifの代わりにelifを使用しています。elifはElse Ifの略です。これは、上のすべてのコードが偽を返した場合、Pythonがこのelse-if文を実行することを示しています。
最後に、sleep(0.15)はコードを0.15秒間一時停止させます。なぜコードを一時停止させるのか?主にパフォーマンスの問題のためです。Raspberry Piは出力コードを非常に速く送信するため、GUIが少し遅れることになります。SSH経由でRaspberry Piを使用している場合は、さらに顕著です。時間が経つにつれて遅延が目立つようになります。コードを一時停止させることで、パフォーマンスの問題を回避できます。
さらに読む: Visual Studio Codeを使用してPlatformIO経由でArduinoをプログラムする方法
よくある質問
Raspberry Piのピンをホットスワップするのは安全ですか?
ホットスワップ、つまりRaspberry Piのピンを電源が入ったまま交換することは、一般的に悪いアイデアです。切り替える前に電源を外す方が常に安全です。
4ピンプッシュボタンは3ピンプッシュボタンよりも優れていますか?
機能的には基本的に同じです。しかし、4つのピンがあることで、4ピンプッシュボタンを別のプッシュボタンに直列回路で配線することができます。
Raspberry Piの任意のピンを入力ピンにできますか?
Raspberry Piには40ピンがありますが、そのうち27ピンだけがGPIOです。GPIOピンのみを入力ピンと出力ピンにプログラムできます。ほとんどのIDEでは、非GPIOピンを入力ピンに再プログラムすることはできません。
すべての写真とスクリーンショットはTerenz Jomar Dela Cruzによるものです