はじめに
RaspberryPi4でGPIOを使う方法を解説します。回路はLEDとタクトスイッチ、プログラム言語は「Python」ライブラリに「RPi.GPIO」を使用します。
記事では「RaspberryPi4」を使用していますが「RaspberryPi2~4」「RaspberryPi Zeroシリーズ」でも解説と同じように使えます。
RaspberryPi5の場合は「RPi.GPIO」ライブラリが使えないので、代わりこちらの方法をご覧ください。
~ この記事の内容 / Contents ~
環境
環境 | バージョンなど | 備考 |
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です。

プログラム概要
今回のプログラムの概要は以下の通りです。
- GPIOの番号指定の設定をする。
- GPIOピンの入出力設定をする。
- タクトスイッチが押されたら、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はシンプルですが、いろいろな回路やデバイスに使えます。今回の回路でも、タクトスイッチの代わりに、ドア(マグネット)センサを繋げると、同じ回路・プログラムで開閉検知ができるようになります。
ぜひいろいろなセンサーをつなげて、遊んでみてください。参考になればうれしいです。

おすすめ書籍
電子工作からサーバー構築まで、これ一冊で完全制覇!
RaspberryPi 5 がついに登場し、その進化に胸躍らせている方も多いのではないでしょうか?
「でも、実際に何をすればいいのかわからない…」
そんな悩みをお持ちの技術好きのあなたに、ぜひ手に取っていただきたいのが「電子工作&サーバー構築徹底解説! ラズパイ5完全ガイド」です。
本書は、ラズパイ 5 のポテンシャルを最大限に引き出すための実践的なノウハウが満載。ラズパイの基礎から応用、電子工作からサーバー構築まで、幅広い内容を網羅しているので、まさに「これさえ買っておけばOK」な一冊。Amazonでもラズパイ関係でNo.1の売れ行きになっています。
難しい技術用語も図解や写真を豊富に使い、初心者でも理解しやすいように丁寧に解説。ステップバイステップで解説しているので、迷うことなく読み進めることができます。
読み終わるころには、スマートホームのアイデアがどんどん湧いてきたり、オリジナルの電子工作で生活がより便利になったり、高性能な自宅サーバーで家族みんなが快適にインターネットを楽しめるようになったり…、きっと作りたいものが山ほどできているはずです。
本書が、あなたのラズパイ 5 で生まれるアイデアの助けになればうれしいです。

質問・要望 大歓迎です
「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。
使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。
ラズパイ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/