Raspberry Pi(ラズパイ)では、GPIOを通じて電気信号を送受信することで、様々なデバイスを制御することができます。本記事では、基本的なLEDとスイッチについて、Pythonプログラムで制御する方法を解説します。LEDにステータスを表示させたり、スイッチが押されたら何らかの動作をさせるなど、自分が好きなように動作をプログラミングすることが可能になります。
更新日 : 2025年10月6日GPIOとは
GPIO(General Purpose Input/Output)とは、Raspberry Pi上に搭載されている信号ピンのことです。
GPIOを通じて電気信号を送受信することで、様々なデバイスを制御することが可能になります。例えば、LEDを光らせたり、スイッチが押されたかどうか確認したり、センサーから気温を取得する、といった具合です。
GPIOはPythonプログラムから制御することもできます。つまり、コードを書くことであなたが好きなようにLED、スイッチ、センサーなどのデバイスを制御できるのです!
以下が40ピンのGPIOのピン配置です。PowerやGroundと表記されているピンは電源なので信号の送受信には使えません。GPIO xxとなっているピンを使用します。プログラムからはGPIO番号を指定することでどのピンを使用するかが決まります。

出典 : Raspberry Pi GPIO
LEDを制御する仕組み
GPIOからLEDを制御する仕組みを見ていきましょう。今回は、「RPZ-IR-Sensor」拡張基板を例に解説します。
まずLEDの繋がっているGPIOを「出力」モードにします。これは好きな値をGPIOから出力(送信)できるということです。好きな値と言っても、実際に送信できるのは0か1の2種類と決まっています。(このような仕組みをデジタル回路と呼びます)
LEDの制御はシンプルで、0を出力すると消灯、1を出力すると点灯させることができます。(回路構成によっては逆の場合もあります)
| GPIOモード | GPIOの値 | LED |
|---|---|---|
| 出力 | 0 | 消灯 |
| 出力 | 1 | 点灯 |
なぜそうなるのでしょうか?RPZ-IR-SensorのLEDの回路は以下の通りです。GPIOにLEDが接続され、その先がGND(電圧0V)となっています。

GPIOから0を出力すると、電気的には0Vの電圧になります。するとLEDに電流が流れず消灯します。
一方、GPIOから1を出力すると、電気的には3.3Vの電圧になります。するとLEDを通じてGND(電圧0V)へ電流が流れて点灯するのです。


なお、抵抗Rは電流が過剰に流れて部品が破損するのを防ぐために挿入しています。回路を自作する場合は必ず挿入してください。
LEDを光らせるサンプルコード
PythonプログラムでLEDを光らせるプログラムを実行してみましょう。
Pythonのプログラミング、実行方法については以下の記事を参考にしてください。

Raspberry PiでPythonプログラミング入門
Python(パイソン)とは世界的に人気のあるプログラミング言語の一つです。Pythonを使えばほぼどんなプログラムも実現できると言っても過言ではなく、GPIOピンを使って、センサーや拡張基板と通信することもできます。本記事では、プログラミング初心者の方向けに、Pythonのコードの記述と実行方法、文法の基礎を解説しています。
こちらのサンプルコードは、「RPZ-IR-Sensor」拡張基板の緑色LEDのGPIO番号(17)となっています。他のLEDや拡張基板については、こちらの表を参考に「gpio_led = 17」の部分を使用する番号に書き換えてください。
サンプルコードを実行して、指定したLEDが5秒間点灯すれば成功です!
#!/usr/bin/env python3
from gpiozero import LED # gpiozeroモジュールを使用
import time
gpio_led = 17 # LEDがつながっているGPIO番号 必要に応じて変更
led = LED(gpio_led) # LEDの準備 GPIOを出力に設定
led.on() # GPIOから1を出力してLED点灯
time.sleep(5) # 5秒待機
led.off() # GPIOから0を出力してLED消灯gpiozeroモジュールではLED直感的に操作するための命令が用意されており、on()でGPIOに1を出力して点灯させ、off()でGPIOに0を出力して消灯させています。
gpiozeroの使用方法を詳しく知りたい方や、LED以外のデバイスの使い方は公式マニュアルを参照してください。
スイッチの状態を読み取る仕組み
次に、GPIOからスイッチが押されているかどうかを取得する仕組みを見ていきましょう。
まずスイッチの繋がっているGPIOを「入力」モードにします。これでGPIOを使って値を受信することができます。実際には受信できる値は0か1の2種類に決まっています。(このような仕組みをデジタル回路と呼びます)
スイッチの状態取得はシンプルで、スイッチが押される(ON)と0、離す(OFF)と1が入力されます。(回路構成によっては逆の場合もあります)
| GPIOモード | GPIOの値 | スイッチ |
|---|---|---|
| 入力 | 0 | ON |
| 入力 | 1 | OFF |
なぜそうなるのでしょうか?RPZ-IR-Sensorのスイッチの回路は以下の通りです。GPIOにスイッチが接続され、その先がGND(電圧0V)となっています。

スイッチが押されると、スイッチの両端(上記1と2)が導通します。するとGPIOがGNDと同じ0Vの電圧になります。電気的に0Vは、0の入力を意味しています。
一方、スイッチを離すと、スイッチの両端が切断されます。GPIOは電気的にはどこにもつながりませんが、「内部プルアップ」機能を有効にしておくことで、こういった状況で3.3Vの電圧にすることができます。電気的に3.3Vは1の入力を意味しています。


スイッチが押されたか判定するサンプルコード
Pythonプログラムでスイッチが押されたか判定するプログラムを実行してみましょう。
こちらのサンプルコードは、「RPZ-IR-Sensor」拡張基板の赤色スイッチGPIO番号(5)となっています。他のスイッチや拡張基板については、こちらの表を参考に「gpio_sw = 5」の部分を使用する番号に書き換えてください。
スイッチを押したままサンプルコードを実行して「Pressed」と表示され、スイッチを押さずに実行したら「Not Pressed」と表示されれば成功です!
#!/usr/bin/env python3
from gpiozero import Button # gpiozeroモジュールを使用
import time
gpio_sw = 5 # スイッチがつながっているGPIO番号 必要に応じて変更
sw = Button(gpio_sw, pull_up=True) # スイッチの準備 GPIOを入力にして内部プルアップ有効
time.sleep(0.1) # スイッチの状態が安定するまで0.1秒待機
# スイッチが押されていた(GPIOに0が入力)場合
if sw.is_pressed:
print('Pressed')
# スイッチが押されていない(GPIOに1が入力)場合
else:
print('Not Pressed')gpiozeroモジュールではスイッチの状態について直感的な記述が可能になっており、押されてGPIOに0が入力されているとsw.is_pressedがTrue、スイッチが押されずGPIOに1が入力されているとsw.is_pressedがFalseになるため、if文でスイッチの状態を判別することができます。
gpiozeroの使用方法を詳しく知りたい方や、Button以外のデバイスの使い方は公式マニュアルを参照してください。
応用例サンプルコード
最後のサンプルコードはLEDとスイッチを組み合わせた応用例です。これまで通り、使用するLEDとスイッチに合わせて「gpio_led = 17」と「gpio_sw = 5」の番号を書き換えてください。
以下の動作をすれば成功です!
- スイッチを押さずに実行 ⇨ LEDが1秒点灯して消灯
- スイッチを押したまま実行 ⇨ LEDが5秒点灯して消灯
#!/usr/bin/env python3
from gpiozero import LED, Button # gpiozeroモジュールを使用
import time
# LEDとスイッチのGPIO番号
# デフォルトはRPZ-IR-Sensorの緑LEDと赤SW
# 必要に応じて変更
gpio_led = 17
gpio_sw = 5
# LEDの準備
led = LED(gpio_led)
# スイッチの準備、プルアップに設定
sw = Button(gpio_sw, pull_up=True)
time.sleep(0.1) # スイッチの状態が安定するまで待機
# スイッチが押されていた場合(ON)
if sw.is_pressed:
led.on() # LED点灯
time.sleep(5) # 5秒待機
led.off() # LED消灯
# スイッチが離されていた場合(OFF)
else:
led.on() # LED点灯
time.sleep(1) # 1秒待機
led.off() # LED消灯 拡張基板のGPIO番号
RPZ-PIRSのGPIO番号
RPZ-PIRSはRGB LEDなので、組み合わせによって色が変わります。例えば、緑+赤で黄色、などです。詳しくは製品ページの使い方を参照して下さい。
| GPIO | LED/スイッチ |
|---|---|
| GPIO17 | RGB LED緑 |
| GPIO18 | RGB LED赤 |
| GPIO22 | RGB LED青 |
| GPIO5 | スイッチ赤 |
| GPIO6 | スイッチ黒 |

RPZ-IR-SensorのGPIO番号
| GPIO | LED/スイッチ |
|---|---|
| GPIO17 | LED緑 |
| GPIO18 | LED黄 |
| GPIO22 | LED青 |
| GPIO27 | LED白 |
| GPIO5 | スイッチ赤 |
| GPIO6 | スイッチ黒 |
RPi TPH MonitorのGPIO番号
| GPIO | LED/スイッチ |
|---|---|
| GPIO5 | LED黄 |
| GPIO6 | LED緑 |
| GPIO22 | スイッチSW1 |
| GPIO23 | スイッチSW2 |
| GPIO24 | スイッチSW3 |
RPZ-CO2-SensorのGPIO番号
| GPIO | LED/スイッチ |
|---|---|
| GPIO17 | RGB LED緑 |
| GPIO18 | RGB LED赤 |
| GPIO22 | RGB LED青 |
| GPIO5 | スイッチ赤 |
| GPIO6 | スイッチ黒 |
まとめ
Raspberry PiのGPIOからLED、スイッチを制御する仕組みと、Pythonプログラムで実際に動かす方法の解説は以上です。本記事は、LEDとスイッチのみについてでしたが、PythonとGPIOを使えば様々なデバイスの動作をプログラミングすることが可能になり、Raspberry Piの活用の幅が広がります。
本記事で利用した拡張基板は以下のとおりです。
- Raspberry Pi用 人感/明るさセンサー/赤外線 拡張基板「RPZ-PIRS」
- Raspberry Pi用 温度/湿度/気圧/明るさ/赤外線 ホームIoT拡張基板「RPZ-IR-Sensor」
- Raspberry Pi用 温度/湿度/気圧/赤外線 ホームIoT拡張基板「RPi TPH Monitor」
- Raspberry Pi用 二酸化炭素センサー/リレー 拡張基板「RPZ-CO2-Sensor」
Pythonは拡張性が高く、習得することで様々なアプリケーションが作成可能です。作業の自動化、カメラで撮影&画像解析、Webサービス、AIなどが一例です。本格的に学びたい方は、書籍を活用してみても良いと思います。
- Python 1年生 体験してわかる!会話でまなべる!プログラミングのしくみ
- ジブン専用パソコン Raspberry Piでプログラミング: ゲームづくりから自由研究までなんだってできる!
- Raspberry Piクックブック 第3版

BME280センサーとラズパイで気温、湿度、気圧を測定する
Indoor Corgiのセンサー制御ソフトウェア「cgsensor」を利用して、BME280センサーで気温、湿度、気圧を測定する方法を解説します。コマンドラインツールを使って1行もコードを書かずに測定や記録ができるほか、Pythonパッケージを使えばご自身のプログラムから簡単にセンサーを制御できます。

ステッピングモーターを指定速度/回転数で回転させる (Raspberry Pi + RPZ-Stepper)
一般的なステッピングモータードライバーでは、所望の速度に合わせたパルスをリアルタイムで出力し続けるひつようがあります。RPZ-Stepperは、速度指定モードに設定することで、自動的にステッピングモーターを回転させ続けることができ、Raspberry Piでは別の処理を行うことも容易です。途中で速度を変更も可能で、指定したパラメーターに応じて自動で加減速します。速度を細かく制御しながら回転し続けるようなアプリケーションを実現できます。

Raspberry Pi Zero用 三脚&カメラマウントキット「RPZ-CamMountKit」
Raspberry Pi(ラズパイ) Zeroシリーズと純正のHQ/V3/V2カメラモジュールを三脚に固定するマウントキットです。三脚を利用することで、カメラの向きの調整が容易になるほか、固定場所の幅が広がります。RPZ-PIRS拡張基板の人感センサーとカメラの方向を合わせるように設計しており、人や動物が通った際に撮影するような応用が可能です。


