PythonでRaspberry PiのGPIO、LED、スイッチ制御

Raspberry Pi(ラズパイ)では、GPIOを通じて電気信号を送受信することで、様々なデバイスを制御することができます。本記事では、基本的なLEDとスイッチについて、Pythonプログラムで制御する方法を解説します。LEDにステータスを表示させたり、スイッチが押されたら何らかの動作をさせるなど、自分が好きなように動作をプログラミングすることが可能になります。

更新日 : 2024年2月22日

GPIOとは

GPIO(General Purpose Input/Output)とは、Raspberry Pi上に搭載されている信号ピンのことです。

GPIOを通じて電気信号を送受信することで、様々なデバイスを制御することが可能になります。例えば、LEDを光らせたり、スイッチが押されたかどうか確認したり、センサーから気温を取得する、といった具合です。

GPIOはPythonプログラムから制御することもできます。つまり、コードを書くことであなたが好きなようにLED、スイッチ、センサーなどのデバイスを制御できるのです!

以下が40ピンのGPIOのピン配置です。PowerやGroundと表記されているピンは電源なので信号の送受信には使えません。GPIO xxとなっているピンを使用します。プログラムからはGPIO番号を指定することでどのピンを使用するかが決まります。

GPIOピン配置
出典 : Raspberry Pi GPIO

LEDを制御する仕組み

GPIOからLEDを制御する仕組みを見ていきましょう。今回は、「RPZ-IR-Sensor」拡張基板を例に解説します。

まずLEDの繋がっているGPIOを「出力」モードにします。これは好きな値をGPIOから出力(送信)できるということです。好きな値と言っても、実際に送信できるのは0か1の2種類と決まっています。(このような仕組みをデジタル回路と呼びます)

LEDの制御はシンプルで、0を出力すると消灯、1を出力すると点灯させることができます。(回路構成によっては逆の場合もあります)

GPIOモードGPIOの値LED
出力0消灯
出力1点灯
GPIOとLEDの対応

なぜそうなるのでしょうか?RPZ-IR-SensorのLEDの回路は以下の通りです。GPIOにLEDが接続され、その先がGND(電圧0V)となっています。

LEDの回路図

GPIOから0を出力すると、電気的には0Vの電圧になります。するとLEDに電流が流れず消灯します。

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

LED消灯
LED点灯

なお、抵抗Rは電流が過剰に流れて部品が破損するのを防ぐために挿入しています。回路を自作する場合は必ず挿入してください。

スイッチの状態を読み取る仕組み

次に、GPIOからスイッチが押されているかどうかを取得する仕組みを見ていきましょう。

まずスイッチの繋がっているGPIOを「入力」モードにします。これでGPIOを使って値を受信することができます。実際には受信できる値は0か1の2種類に決まっています。(このような仕組みをデジタル回路と呼びます)

スイッチの状態取得はシンプルで、スイッチが押される(ON)と0、離す(OFF)と1が入力されます。(回路構成によっては逆の場合もあります)

GPIOモードGPIOの値スイッチ
入力0ON
入力1OFF
GPIOとスイッチの対応

なぜそうなるのでしょうか?RPZ-IR-Sensorのスイッチの回路は以下の通りです。GPIOにスイッチが接続され、その先がGND(電圧0V)となっています。

スイッチの回路

スイッチが押されると、スイッチの両端(上記1と2)が導通します。するとGPIOがGNDと同じ0Vの電圧になります。電気的に0Vは、0の入力を意味しています。

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

スイッチON
スイッチOFF



GPIOを制御するPythonモジュール

実際にPythonプログラムでLED、スイッチを制御する方法を解説していきます。

Pythonのプログラミング、実行方法については以下の記事を参考にしてください。

Raspberry PiでPythonプログラミング入門

Python(パイソン)とは世界的に人気のあるプログラミング言語の一つです。Pythonを使えばほぼどんなプログラムも実現できると言っても過言ではなく、GPIOピンを使って、センサーや拡張基板と通信することもできます。本記事では、プログラミング初心者の方向けに、Pythonのコードの記述と実行方法、文法の基礎を解説しています。

PythonでGPIOを制御するには、GPIO用のモジュールを使用します。いくつか種類があるのですが、本記事では以下の3つを使う方法をそれぞれ解説します。

  • gpiozero
  • RPi.GPIO
  • pigpio

これから学習する方や新たにプログラムを作成する場合はgpiozeroを推奨します。gpiozeroは開発が活発でRaspberry Pi公式でも推奨されています。

RPi.GPIOとpigpioは残念ながらRaspberry Pi 5で動作しなくなりました。Raspberry Pi 4以前のモデルでは引き続き利用可能です。

拡張基板の準備とGPIO番号

これ以降のサンプルコードは、「RPZ-IR-Sensor」の緑色LED(GPIO17)と赤スイッチ(GPIO5)のGPIO番号となっています。他のLED/スイッチを使いたい場合や、別の拡張基板である「RPZ-PIRS」、「RPi TPH Monitor」、「RPZ-CO2-Sensor」を使う場合は、GPIO番号を以下の表に合わせて変更してください。

RPZ-PIRSのGPIO番号

RPZ-PIRSはRGB LEDなので、組み合わせによって色が変わります。例えば、緑+赤で黄色、などです。詳しくは製品ページの使い方を参照して下さい。

GPIOLED/スイッチ
GPIO17RGB LED緑
GPIO18RGB LED赤
GPIO22RGB LED青
GPIO5スイッチ赤
GPIO6スイッチ黒
RPZ-PIRSのGPIO番号
RPZ-PIRS拡張基板
RPZ-IR-SensorのGPIO番号
GPIOLED/スイッチ
GPIO17LED緑
GPIO18LED黄
GPIO22LED青
GPIO27LED白
GPIO5スイッチ赤
GPIO6スイッチ黒
RPZ-IR-SensorのGPIO番号
RPZ-IR-Sensor拡張基板
RPi TPH MonitorのGPIO番号
GPIOLED/スイッチ
GPIO5LED黄
GPIO6LED緑
GPIO22スイッチSW1
GPIO23スイッチSW2
GPIO24スイッチSW3
RPi TPH MonitorのGPIO番号
RPi TPH Monitor拡張基板
RPZ-CO2-SensorのGPIO番号

RPZ-CO2-SensorはRGB LEDなので、組み合わせによって色が変わります。例えば、緑+赤で黄色、などです。詳しくは製品ページの使い方を参照して下さい。

GPIOLED/スイッチ
GPIO17RGB LED緑
GPIO18RGB LED赤
GPIO22RGB LED青
GPIO5スイッチ赤
GPIO6スイッチ黒
RPZ-CO2-SensorのGPIO番号
RPZ-CO2-Sensor拡張基板

gpiozeroモジュールを使う方法

RPi.GPIOを使用してLED、スイッチを制御するサンプルコードです。以下の動作をすれば成功です!

  • スイッチを押さずに実行 ⇨ 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消灯

gpiozeroではより直感的な記述が可能になっており、led.on()とすると1を出力、led.off()とすると0を出力してくれます。

また、スイッチが押されて0が入力されているとsw.is_pressedがTrue、スイッチが押されず1が入力されているとsw.is_pressedがFalseになるため、if文でスイッチの状態を判別することができます。

gpiozeroの使用方法を詳しく知りたい方や、LEDとButton以外のデバイスの使い方は公式マニュアルを参照してください。

Pythonのプログラムの動かし方が分からない場合は、以下の記事で解説しています。

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)
time.sleep(0.1) # スイッチの状態が安定するまで待機

# スイッチの状態を取得
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 systemctl start pigpiod

Raspberry Pi起動時にpigpiodを自動で立ち上げたい場合は以下を実行します。

$ sudo systemctl enable pigpiod

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)
time.sleep(0.1) # スイッチの状態が安定するまで待機

# スイッチの状態を取得
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の活用の幅が広がります。

本記事で利用した拡張基板の購入先、パッケージの種類は以下を参照して下さい。

Pythonは拡張性が高く、習得することで様々なアプリケーションが作成可能です。作業の自動化、カメラで撮影&画像解析、Webサービス、AIなどが一例です。本格的に学びたい方は、書籍を活用してみても良いと思います。

定期撮影ラズパイカメラをモバイルバッテリーで長期運用 (RPZ-PowerMGR)

Raspberry Pi(ラズパイ)と純正カメラを使用して、定期的に撮影するタイムラプス機能を実装する方法を解説します。RPZ-PowerMGR拡張基板を使うことで、指定時刻に起動し、撮影後は自動的にシャットダウン&電源OFFします。待機時の消費電力をカットすることで、モバイルバッテリーで長期運用が可能になります。

ラズパイで赤外線制御 (家電、エアコン、照明、テレビなどを制御するホームIoT)

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

RPZ-IR-Sensor (Raspberry Pi用 温度/湿度/気圧/明るさ/赤外線 ホームIoT拡張ボード)

動作をプログラミング可能な、Raspberry Pi/Zero(ラズパイ)用ホームIoT拡張ボードです。温度、湿度、気圧、明るさセンサー、赤外線送受信機能を搭載。温度が上がったらエアコンをオンにする、暗くなったら照明を点灯する、外出先から家電の操作をする、気温や日照時間を記録する、といった使い方が可能です。LEDにステータスを表示したり、スイッチを押したら特定の処理をすることもできます。