Raspberry Pi(ラズパイ)では、GPIOを通じて電気信号を送受信することで、様々なデバイスを制御することができます。本記事では、基本的なLEDとスイッチについて、Pythonプログラムで制御する方法を解説します。LEDにステータスを表示させたり、スイッチが押されたら何らかの動作をさせるなど、自分が好きなように動作をプログラミングすることが可能になります。
Raspberry Pi OS Version 2020-08-20対応
更新日 : 2021年1月14日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」、「RPi TPH Monitor」拡張基板を例に解説します。
まず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は電流が過剰に流れて部品が破損するのを防ぐために挿入しています。回路を自作する場合は必ず挿入してください。
スイッチの状態を読み取る仕組み
次に、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の入力を意味しています。
一方、スイッチを離すと、スイッチの両端が切断されます。電気的にはどこにもつながりませんが、「内部プルアップ」機能を有効にしておくことで、こういった状況で3.3Vの電圧にすることができます。電気的に3.3Vは1の入力を意味しています。


GPIOを制御するPythonモジュール
実際にPythonプログラムでLED、スイッチを制御する方法を解説していきます。
Pythonのプログラミング、実行方法については以下の記事を参考にしてください。

Raspberry PiでPythonプログラミング入門
Python(パイソン)とは世界的に人気のあるプログラミング言語の一つです。Pythonを使えばほぼどんなプログラムも実現できると言っても過言ではなく、GPIOピンを使って、センサーや拡張基板と通信することもできます。本記事では、プログラミング初心者の方向けに、Pythonのコードの記述と実行方法、文法の基礎を解説しています。
PythonでGPIOを制御するには、GPIO用のモジュールを使用します。いくつか種類があるのですが、本記事では以下の2つを使う方法をそれぞれ解説します。
- RPi.GPIO
- pigpio
RPi.GPIOは下準備なしに簡単に使用できるモジュールの1つで、初心者の方におすすめです。
pigpioはpigpiodと呼ばれるサービスに仲介させることで、より精度の高い波形を出力できるモジュールです。こちらも簡単な準備をするだけで利用できます。
拡張基板の準備とGPIO番号
これ以降のサンプルコードは、「RPZ-IR-Sensor」の緑色LED(GPIO17)と赤スイッチ(GPIO5)のGPIO番号となっています。他のLED、スイッチや、「RPi TPH Monitor」を使う場合は、GPIO番号を以下の表に合わせて変更してください。
GPIO | LED/スイッチ |
---|---|
GPIO5 | LED黄 |
GPIO6 | LED緑 |
GPIO22 | スイッチSW1 |
GPIO23 | スイッチSW2 |
GPIO24 | スイッチSW3 |
GPIO | LED/スイッチ |
---|---|
GPIO17 | LED緑 |
GPIO18 | LED黄 |
GPIO22 | LED青 |
GPIO27 | LED白 |
GPIO5 | スイッチ赤 |
GPIO6 | スイッチ黒 |
RPi.GPIOモジュールを使う方法
RPi.GPIOを使用してLED、スイッチを制御するサンプルコードです。以下の動作をすれば成功です!
- スイッチを押さずに実行 ⇨ LEDが1秒点灯して消灯
- スイッチを押したまま実行 ⇨ LEDが5秒点灯して消灯
最後の後処理については、LEDを点灯したままにしておきたいような場合は実行しなくても構いません。
#!/usr/bin/env python3
import RPi.GPIO as GPIO # RPi.GPIOモジュールを使用
import time
# LEDとスイッチのGPIO番号
# デフォルトはRPZ-IR-Sensorの緑LEDと赤SW
# 必要に応じて変更
gpio_led = 17
gpio_sw = 5
# GPIO番号指定の準備
GPIO.setmode(GPIO.BCM)
# LEDピンを出力に設定
GPIO.setup(gpio_led, GPIO.OUT)
# スイッチピンを入力、プルアップに設定
GPIO.setup(gpio_sw, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# スイッチの状態を取得
sw = GPIO.input(gpio_sw)
# スイッチが押されていた場合(ON)
if 0==sw:
GPIO.output(gpio_led, 1) # LED点灯
time.sleep(5) # 5秒待機
GPIO.output(gpio_led, 0) # LED消灯
# スイッチが離されていた場合(OFF)
else:
GPIO.output(gpio_led, 1) # LED点灯
time.sleep(1) # 1秒待機
GPIO.output(gpio_led, 0) # LED消灯
# 後処理 GPIOを解放
GPIO.cleanup(gpio_led)
GPIO.cleanup(gpio_sw)
pigpioモジュールを使う方法
pigpioを使う場合は、Pythonプログラムを実行する前に、サービスを実行しておく必要があります。以下のコマンドを実行します。
sudo service pigpiod start
Raspberry Pi起動時にpigpiodを自動で立ち上げたい場合は以下を実行します。
sudo systemctl enable pigpiod.service
pigpioを使用してLED、スイッチを制御するサンプルコードです。以下の動作をすれば成功です!
- スイッチを押さずに実行 ⇨ LEDが1秒点灯して消灯
- スイッチを押したまま実行 ⇨ LEDが5秒点灯して消灯
#!/usr/bin/env python3
import pigpio # pigpioモジュールを使用
import time
# LEDとスイッチのGPIO番号
# デフォルトはRPZ-IR-Sensorの緑LEDと赤SW
# 必要に応じて変更
gpio_led = 17
gpio_sw = 5
# pigpioの準備
pi = pigpio.pi()
# LEDピンを出力に設定
pi.set_mode(gpio_led, pigpio.OUTPUT)
# スイッチピンを入力、プルアップに設定
pi.set_mode(gpio_sw, pigpio.INPUT)
pi.set_pull_up_down(gpio_sw, pigpio.PUD_UP)
# スイッチの状態を取得
sw = pi.read(gpio_sw)
# スイッチが押されていた場合(ON)
if 0==sw:
pi.write(gpio_led, 1) # LED点灯
time.sleep(5) # 5秒待機
pi.write(gpio_led, 0) # LED消灯
# スイッチが離されていた場合(OFF)
else:
pi.write(gpio_led, 1) # LED点灯
time.sleep(1) # 1秒待機
pi.write(gpio_led, 0) # LED消灯
# pigpioから切断
pi.stop()
まとめ
Raspberry PiのGPIOからLED、スイッチを制御する仕組みと、Pythonプログラムで実際に動かす方法の解説は以上です。本記事は、LEDとスイッチのみについてでしたが、PythonとGPIOを使えば様々なデバイスの動作をプログラミングすることが可能になり、Raspberry Piの活用の幅が広がります。
本記事で利用した拡張基板の購入先、パッケージの種類は以下を参照して下さい。

スイッチでRaspberry Piの電源をON/OFF (RPZ-PowerMGR)
RPZ-PowerMGRを使って、スイッチでRaspberry Pi(ラズパイ)の電源ON/OFFする方法の解説です。ケーブルの抜き挿しやログインして操作しなくても電源ON/OFFできるほか、リモートやプログラムからシャットダウンした際に自動で電源OFFすることもできます。不要な時は電源を切ることで省電力化が可能です。

Raspberry Piをスイッチでシャットダウン (LEDで完了確認)
スイッチを押すだけでRaspberry Pi(ラズパイ)をシャットダウンする方法を解説しています。また、LEDでシャットダウン完了を分かりやすく確認できるようにします。シャットダウン操作をする手間や、完了して電源を落としていいか分かりにくい問題を解決します。

PythonとpigpioでRaspberry Piの赤外線制御 (家電、エアコン、照明、テレビなどを制御するホームIoT)
Pythonとpigpioを使ってRaspberry Piで赤外線の送受信を行う方法について解説しています。サンプルプログラムを用意しているので、簡単に受信、登録、送信動作をさせることができるほか、データ解析も可能です。赤外線を使ってエアコン、照明、テレビなどの家電を制御することが可能になります。