Raspberry Pi

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より引用

使用する部品

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

ブレッドボード

指定はないですが、半ざしなどのトラブルが少ない、サンハヤト製をおすすめします。以下の長いタイプなら、スペースが広くて配線・デバッグが楽になります

あきばお〜楽天市場支店
¥945 (2022/09/18 00:07時点 | 楽天市場調べ)

LED

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

タクトスイッチ

ブレッドボードで使えるものならOKです。

抵抗

お手持ちのものでOKです。ない方は一度セットで揃えてしまうと送料と時間が節約できます。

¥1,500 (2022/02/22 10:06時点 | Amazon調べ)

プログラム概要

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

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

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

UdemyにRaspberryPiの講座があります

実はUdemyで『RaspberryPi』『Pico』『Arduino』の基礎/実践講座が見れます。無料もあるので「動画で学びたい」「本は読み尽くした」という方は以下のリンクをご覧ください。

⇒ RaspberryPiの講座一覧はこちら

以下の記事で、RaspberryPi・RaspberryPi Picoのおすすめ講座3選も解説しています。

GPIOが出来たら「PWM」にチャレンジ

GPIOが使えたら、次は「PWM」にチャレンジしてみましょう。PWMはGPIOの出力を、自動・連続でON/OFFしてくれる機能です。興味のある方は以下の記事をご覧ください。

応援・要望お待ちしてます

ブログを見ていて「この辺を詳しく知りたい」「このライブラリの使い方を知りたい」「こんなことで困ってる」...etc があれば、コメント・問い合わせ・Twitterで教えてください。質問・ご要望に合わせて解説記事を作ります。

ブログを気に入っていただけたり、「応援してもいいよ」という方がいたら、ブログやSNSでの紹介をお願いします。 あたたかい応援は、中の人の更新の大きな励みになります。

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

COMMENT

メールアドレスが公開されることはありません。