Raspberry Pi PR

RaspberryPiでGPIOを使う方法【RPi.GPIO】

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

はじめに

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

記事では「RaspberryPi4」を使用していますが「RaspberryPi2~4」「RaspberryPi Zeroシリーズ」でも解説と同じように使えます。

RaspberryPi5の場合は「RPi.GPIO」ライブラリが使えないので、代わりこちらの方法をご覧ください。

環境

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

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

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

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

ブレッドボード部分の実物の配線の画像
配線(ブレッドボード部分)
全体の配線を写した画像
配線(全体)
全体配線のイメージ図と説明

RaspberryPi 4

ブレッドボード
  1番ピン 3V3 Power 電源ライン
  6番ピン GND GNDライン
17番ピン GPIO23 スイッチのGND側
18番ピン GPIO24 LEDのアノード側

ピンアサイン

RaspberryPi 公式のGitHubより引用

使用する部品

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

RaspberryPi 4 (8GBモデル)

スイッチやLEDをつなげて使うなら、価格が下がった「RaspberryPi4」がおすすめです。

ブレッドボード

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

LED

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

タクトスイッチ

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

プログラム概要

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

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

実行結果

後述のプログラムを実行してタクトスイッチを押すと、以下のようにLEDが点灯します。

プログラムを実行して、タクトスイッチを押すと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    = 23
TactSw = 24

# タクトスイッチ用のピンを
# 「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)

実行方法

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

sudo python simpleGpio.py

コードのポイント

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

ピン番号の指定方法を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    = 23
TactSw = 24

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

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

GPIOの番号は「24」などのように直接記載してしまうこともできますが、一旦変数に入れておくと便利です。

回路の修正などで使うピンを変える場合に、プログラムの変更箇所が1か所で済むようになります。

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

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

プルアップ

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

プルダウン

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

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

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

GPIOの設定(出力)

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

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

内容 設定 説明
GPIO番号 23 GPIO23 (BCM形式)
入出力指定 RPi.GPIO.OUT 出力用に設定

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

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

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

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

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

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

反対に、タクトスイッチが「押されていない」場合は、GP23に電気は流れません。そのため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は『仕事のChatGPT』!

今週号の日経Interfaceは「仕事のChatGPT」。
イントロとして、ChatGPTをはじめとした大規模言語モデル(LLM)の現在や、エンジニア向け生成AIの活用法。その後の内容で、ChatGPTを使ったPythonでゲームの作り方や生成AIを使ったシステムの製作例が学べます。

全ての内容はここでは紹介しきれないので、詳細は以下のAmazonページをご覧ください。

5月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/

Index