Raspberry Pi PR

【ラズパイ】Raspberrypi5でボタン(GPIO入力)を使う方法【gpiozero】

記事内に商品プロモーションを含む場合があります

はじめに

Raspberrypi5でボタン(タクトスイッチ)を使う方法を解説します。

回路はボタン(タクトスイッチ)のみのシンプルな回路で、言語にはPython、ライブラリにはRaspberryPi 5の公式ドキュメントに紹介されている「gpiozero」を使います。

これまで、PWMのライブラリとして「RPi.gpio」を紹介してきましたが、2024年3月現在、Pi5ではRPi.gpioが使えない状態が続いています。
そのため、今回は現時点で使用可能な「gpiozero」を使う方法を解説します。

gpiozero公式リファレンス: https://gpiozero.readthedocs.io/en/latest/

環境

この記事で使用する環境は以下の通りです。

環境 バージョンなど 備考
RaspberryPi 最新の「5」を使用します
RaspberryPi OS Debian version 12 (bookworm) 64bit版です
言語 Python 3.11.2
ライブラリ gpiozero

RaspberryPi 5との接続

RaspberryPi 5とタクトスイッチを以下のように接続します。

RaspberryPi 5 とボタンを接続する方法を解説した画像
RaspberryPi 5 とボタンを接続する方法を解説したFrizingのイラスト

RaspberryPi 5のGPIO回路にはS/Wで切り替えできる、プルアップ・プルダウン抵抗が実装されています(公式の解説)。
そのため、今回の回路ではプルアップ抵抗を省いたシンプルな回路構成にしています。

ピンアサイン

RaspberryPi 公式のGitHubより引用

使用する部品

RaspberryPi 5

RaspberryPi 5本体です。技適や流通経路が不安な方は、日本の老舗店マルツオンライン(楽天)のページが安心です(現在は4GB版のみの販売)。

※ どの購入先でも、本体に電源やケーブルは含まれていないので注意してください

RaspberryPi 5 用電源

スマホ用(PD対応品)も使用できますが、仕様によってはUSBの出力電流が制限されたり、電源が落ちたりすることもあります。5V5A対応品の使用がおすすめです。

公式品は少々値段が高いので、私は以下から購入・使用しています。

サーボモータ(ラジコンサーボ) SG90

冒頭でも紹介した、RaspberryPiシリーズで使えるサーボモータ(ラジコンサーボ)です。 人気のため、コピー品も多いようです。私は以下の正規販売元のページから購入しました。

¥820 (2023/08/25 06:08時点 | Amazon調べ)

ブレッドボード(ハーフサイズ)

サンハヤト製のブレッドボードです。今回は簡単な回路なので小さいサイズのものを使っています。

ジャンプワイヤ (オス-メス タイプ)

RaspberryPiで使う場合は、以下のオスーメスタイプがおすすめです。

エネループ

使い捨ての乾電池もいいですが、エネループなら4本充電時の電気代が約1円。モーター・ポンプなどの電池が消耗しやすい実験・工作におすすめです。

※ はじめて使う方は充電器とのセットがおすすめです

電池ボックス

電源に使用する乾電池用のボックスとスナップです。記事では単4を使っていますが、容量の大きい単3タイプをお勧めします。単3でも単4でも電圧は変わりません。

プログラム概要

今回のプログラムの概要は以下の通りです。

  • ボタンオブジェクトの生成
  • ボタン(タクトスイッチ)の読み取り
  • ボタン(タクトスイッチ)の押下待ち

実行結果

後述するプログラムの実行結果は以下の通りです。

実行すると、1秒おきに3回ボタンの状態を出力します。その後ボタンの押下待ちを行い、ボタンが押されたら終了します。

ボタンは押されていません
ボタンが押されています
ボタンが押されています
ボタンが押されるまで待機します
ボタンが押されました

実行方法

上述した全体コードを保存したディレクトリで、以下のコマンドを実行します。

sudo python gpiozero_button.py

全体コード

全体コードは以下の通りです。詳細な内容は後述する「コードのポイント」で解説します。

from gpiozero import Button
from time import sleep

# ボタンのオブジェクトの生成
button = Button(13)

for i in range(3):
    # ボタンが押されている
    if button.is_pressed:
        print("ボタンが押されています")

    # ボタンが押されていない
    else:
        print("ボタンは押されていません")

    sleep(1)



print("ボタンが押されるまで待機します")

button.wait_for_press()

print("ボタンが押されました")

コードのポイント

Button オブジェクトの作成

RPi.gpioなど多くのライブラリは「ピン」に着目したプログラムの構造をとっていますが、gpiozeroでは、「モノ(部品)」に着目した名称や構造をとっています。

そのため、ボタン(タクトスイッチ)を操作する際は、その名の通り「Button」型のオブジェクトを生成します。かっこ内には使用するピンの名称(GP13などの数字部分)を指定します。

# ボタンのオブジェクトの生成
button = Button(13)

タクトスイッチの読み取り

is_pressedプロパティで、「ボタンが押されているか」を取得できます。取得タイミングは、コードが実行された瞬間なので注意してください。

for i in range(3):
    # ボタンが押されている
    if button.is_pressed:
        print("ボタンが押されています")

    # ボタンが押されていない
    else:
        print("ボタンは押されていません")

    sleep(1)

ボタンの押下待ち

wait_for_press関数で、ボタンが押されるまで待機します。

print("ボタンが押されるまで待機します")

button.wait_for_press()

print("ボタンが押されました")

その他の関数など

その他にも、when_pressedプロパティでの割り込み設定など、Button型には、便利なプロパティ・関数がたくさんあります。詳細な内容については以下の公式ドキュメントをご覧ください。

まとめ

Raspberrypi5でボタン(タクトスイッチ)を使う方法を解説しました。

gpiozeroライブラリは、ボタンの押下待ちやis_pressedプロパティなど、名称が直感的で、使いやすいように設計されているのかなり使いやすいライブラリだと思います。

回路も超シンプルに作成できるので、みなさんもぜひ使ってみてください。

参考になればうれしいです。

おすすめの最新書籍

今月号の日経Interfaceは「Linuxチューニング術50」

今月号のInterfaceは『Linux チューニング術 50』です。

Linuxを組み込んだ機器を”本格的”に作ろうとすると「起動を早くしたい」「いきなり電源を切られてもデータを守りたい」など、対応が必要なチューニングはおおいですよね。

今回の記事は、「カーネルをいじらない」方法でチューニングを行う方法が解説されています。

こういった”実用的”な特集はレアですし、知っておいても損はない情報だと思います。

私も仕事でこの手の問題に何度も遭遇していますが、こういったOSレベルの難しそうな設定を、さらっとできちゃう人はかっこいいですよね。

興味のある方は、以下のリンクから確認できます。

質問・要望 大歓迎です

「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。

使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。

ABOUT ME
えす
現役のソフトウェアエンジニアです。 C++ C# Python を使ってます。10年ちょい設計/開発部門にいましたが、今はQAエンジニアっぽいことをしています。

COMMENT

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

Index