Raspberry Pi PR

RaspberryPi(ラズパイ)でGPIOを使う方法【RPi.GPIO】

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

はじめに

RaspberryPi (ラズパイ)でGPIOを使う方法を解説します。回路はLEDとタクトスイッチ、プログラム言語は「Python」ライブラリに「RPi.GPIO」を使用します。

記事内では懐かしの「RaspberryPi2」を使っていますが「RaspberryPi2〜4」「Raspberry Zeroシリーズ」なら解説と同じ方法でGPIOが使えます。

環境

環境 バージョンなど 備考
RaspberryPi 2 Model B RaspberryPi 2/3/4  Zero各種でも使えます
OS RaspberryPi OS (bullseye) 32bit版です
Python 3.9.2 OS プリインストールのバージョンです
ライブラリ RPi.GPIO

タクトスイッチとLEDの接続

RaspberryPiのGPIOピンに、タクトスイッチとLEDをそれぞれ接続します。抵抗は直結防止のために手元にあった220Ωを使っています。LEDの明るさが変わるだけなので、220Ω以上の抵抗を使っても問題ありません。

タクトスイッチは「GPIOでの入力検知」、LEDは「GPIOの出力確認」に使います。

LEDとタクトスイッチのつなぎかたを説明する画像

LEDはRaspberryPiに電源を入れると点灯します(プログラム実行で消灯)

ピンアサイン

RaspberryPi 公式のGitHubより引用

使用する部品

今回の回路では以下の部品を使用します。

RaspberryPi 4 (8GBモデル)

解説はRaspberryPi 「2」 ですが、今買うなら、性能が大幅アップした「4」がおすすめです。 後継機なのでピンアサインは同一で、解説と同じように使えます。

ブレッドボード

サンハヤト性のブレッドボードです。少々堅めの指し心地ですが、などの品質も高く、おすすめの一品です。

LED

一般的な砲弾型のLEDでOKです。以下のようなセットで買っておくと、購入の手間がはぶけます。

タクトスイッチ

ブレッドボードで使えるものであればOKです。

プログラム概要

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

  1. GPIOの番号指定の設定をする。
  2. GPIOピンの入出力設定をする。
  3. タクトスイッチが押されたら、LEDを点灯させる。

実行結果

タクトスイッチを押すと、以下のようにLEDが点灯します。プログラムについては全体コードコードのポイントをご覧ください。

プログラムの実行結果の画像(タクトスイッチを押す前)
プログラムの実行結果の画像(タクトスイッチを押した後)

全体コード

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

# GPIOという名前でRPi.GPIOのライブラリを使います
import RPi.GPIO as GPIO
import time

# GPIOのピン番号指定を「BCM」に設定します
GPIO.setmode(GPIO.BCM)

# 設定を確認します
mode = GPIO.getmode()

# BCMの場合は「11」が返ります
print(mode)

# GPIO番号に名前をつけます
LED    = 14
TactSw = 15

# タクトスイッチ用のピンを
# 「In」+ 「プルダウン」に設定します
GPIO.setup(TactSw, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

# LED用のピンを「Out」に設定します
GPIO.setup(LED,GPIO.OUT)

# スタートの表示です
print("Start")


# 1000回繰り返します
for i in range(1000):

    # タクトスイッチが押された状態を取得します
    isOn = GPIO.input(TactSw)

    # 押されたら、LEDを点けます
    if isOn == True:
        GPIO.output( LED,True )

    # 押されていない場合は消します
    else :
        GPIO.output( LED,False )

    # 0.1秒待機します
    time.sleep(0.1)

print("done.")

# GPIOの設定を解除します
GPIO.cleanup(LED)
GPIO.cleanup(TactSw)

コードのポイント

ピン番号の指定方法の設定

ピン番号の指定方法をsetmode関数で設定します。

種類は「GPIO〇〇の番号を指定する”BCM”」「物理的なピン番号を指定する”BOARD”」の二種類があります。今回は「GPIO〇〇を指定する、BCMの方式」を使います。

# GPIOのピン番号指定を「BCM」に設定します
GPIO.setmode(GPIO.BCM)

# 設定を確認します
mode = GPIO.getmode()

# BCMの場合は「11」が返ります
print(mode)

設定した指定方式はgetmode関数で確認できます。未設定の場合は「-1」が返ります。

名称 指定 設定 getmode()
BCM RPi.GPIO.BCM GPIO〇〇と記載のある番号 11
BOARD RPi.GPIO.BOARD 基板のピン番号(1~40) 10
未設定 -1

GPIOの設定(入力)

GPIOピンは入力/出力のどちらにも使えるので、setup関数で入力/出力のどちらで使うかを設定します。

# GPIO番号に名前をつけます
LED    = 14
TactSw = 15

# タクトスイッチ用のピンを
# 「In」+ 「プルダウン」に設定します
GPIO.setup(TactSw, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

setup関数では「ピン番号」「入出力の指定」「プルアップ/プルダウン設定」などが指定できます。今回は以下のように設定して、タクトスイッチの入力検知に使います。

ピン番号は「15」などのように直接記載してもいいですが、ピン番号用の変数を作成しておくと、指定の間違いが減らせて便利です。

内容 設定 説明
ピン番号 15 GPIO15 (BCM形式です)
入出力指定 RPi.GPIO.IN 入力用に設定
プルアップ RPi.GPIO.PUD_DOWN スイッチOFFの場合は、OFF側に設定

プルアップ/プルダウンはざっくり言うと、スイッチが押されていない場合のピンの状態をを設定するのに使います。

プルアップ

 別のところからピンに電気を流しておく方式です。

プルダウン

 GNDとつなげて、ピンに電気が流さない方式です。

プルダウン/プルアップ引数を設定をすると、ピンの回路が自動的に上記状態に切り替わります。

「GPIO2」「GPIO3」は、電気的に「常にプルアップ」になるように内部回路が組まれています。S/Wでの変更はできないので別のピンを使ってください。

GPIOの設定(出力)

出力もsetup関数を使って設定します。プルアップ/ダウンも設定できますが、今回の回路では不要なので設定していません。

# LED用のピンを「Out」に設定します
GPIO.setup(LED,GPIO.OUT)

内容 設定 説明
ピン番号 14 GPIO14 (BCM形式です)
入出力指定 RPi.GPIO.OUT 出力用に設定

タクトスイッチの状態取得(GPIO入力)

input関数を使ってタクトスイッチ(入力のGPIO)の状態を取得します。引数には「取得したいピンの番号」を指定します。

    # タクトスイッチが押された状態を取得します
    isOn = GPIO.input(TactSw)

input関数は「ピンに電気が流れているか?」を返す関数です。

今回の回路は、「タクトスイッチが押されている間」、電源(3V3)からGP14ピンに電気が流れるようにしています。

そのため、input関数はタクトスイッチを押している間、「True(電気が流れている)」を返します。

反対に、タクトスイッチが「押されていない」場合は、GP14ピンに電気は流れません。そのためinput関数は「False(電気が流れていない)」を返します。

上記仕組みを利用することで、GPIOでタクトスイッチの状態を確認しています。

LEDの点灯操作(GPIO出力)

output関数を使って、LEDの点灯/消灯を行います。引数には「出力操作したいピン番号」「出力のON/OFF)」を指定します。

下のコードでは、前述したタクトスイッチが押されている時は、LEDへの出力をON(True)、押されていない場合は、LEDへの出力をOFF(False)にしています。

    # 押されたら、LEDを点けます
    if isOn == True:
        GPIO.output( LED,True )

    # 押されていない場合は消します
    else :
        GPIO.output( LED,False )

GPIOの解放

cleanup関数で使用したピンの後片づけをします。

引数で指定されたピンは、強制的に「入力」で使う設定になり、内部のプルアップ/プルダウン設定も解除されます。

# GPIOの設定を解除します
GPIO.cleanup(LED)
GPIO.cleanup(TactSw)

まとめ

RaspberryPiでGPIOを使う方法を解説しました。

GPIOはシンプルですが、いろいろな回路やデバイスに使えます。今回の回路でも、タクトスイッチの代わりに、ドア(マグネット)センサを繋げると、同じ回路・プログラムで開閉検知ができるようになります。

ぜひいろいろなセンサーをつなげて、遊んでみてください。参考になればうれしいです。

お知らせ

今月号のInterfaceは『RaspberryPi 5』特集

今月号ののInterfaceは「RaspberryPi 5」特集!

実験などを通じた性能測定や特徴・変更点の解説。新規に追加されたI/Oボード「RP1」の特徴と謎。Pi5のはじめかたやLinuxコマンド入門などが特集されています。

3月25日発売です。

質問・要望 大歓迎です

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

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

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

POSTED COMMENT

  1. sou より:

    ラズパイ4でPython3で

    import RPi.GPIO as GPIO

    問題なく動いてましたが、ラズパイ4とPicoをUSBでつないでラズパイPico(MicroPython)で同じプログラムを動作しようとしたところ
    ImportError: no module named ‘RPi’
    となり動かないのですが何が悪いのでしょうか?
    よろしくお願いいたします。

    • えす より:

      souさん

      コメントありがとうございます。えすです。

      ご質問いただいたエラーは、モジュール(ライブラリ)が使用できない場合に表示されるエラーです。

      PythonとMicroPythonでは、使えるモジュール(ライブラリ)が異なるので「RPi」は使えません。

      Picoでは代わりに「machine」というライブラリで、GPIOを操作できますので、そちらを使ってみてください。

      「machine」ライブラリの使い方は、以下の記事で詳しく解説しているので、よろしければご覧ください。

      https://tech-and-investment.com/raspberrypi-pico-12-gpio/

COMMENT

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