Raspberry Pi PR

【ラズパイ】Raspberrypi5でPWMを使う方法【gpiozero】

記事内に商品プロモーションを含む場合があります

はじめに

Raspberrypi5でPWMを使う方法を解説します。
LEDと抵抗のみのシンプルな回路を使い、PWM信号によってLEDの調光(明るさの変更)を行います。
言語にはPython、ライブラリにはPi5の公式ドキュメントでも紹介されている「gpiozero」を使用します。

これまで、PWMのライブラリとして「RPi.gpio」を紹介してきましたが、2024年3月現在、Pi5ではRPi.gpioが使えない状態が続いています。
そのため、今回は現時点で使用可能な「gpiozero」を使う方法を解説します。

gpiozero公式リファレンス: https://gpiozero.readthedocs.io/en/latest/

【基礎知識】PMW

PWMは、Pulse Width Modulationの略で、GPIOと同じON/OFF信号を指定した周期」で「くり返し」出力できる仕組みです。

この仕組みを使うと、入力の電圧は変えずに、ONのパルス幅(毎周期のONの幅)を変えるだけで、任意の電圧を作ることができます。

PWMの仕組みを説明した画像

PWMでは以下の内容が変更できます。

  1. 周期(周波数):1秒間に何回ON/OFFさせるか
  2. Duty比 : 1周期中のON/OFF時間の割合

上記の仕組みは、モーターやスピーカーなど、いろいろな用途に使用されており、LEDに使うと簡単に光の明暗操作(調光)をすることができます

環境

この記事で使用する環境は以下の通りです。

環境 バージョンなど 備考
RaspberryPi 最新の「5」を使用します
RaspberryPi OS Debian version 12 (bookworm) 64bit版です
言語 Python 3.11.2
ライブラリ gpiozero

RaspberryPi 5との接続

RaspberryPi 5とLEDを以下のように接続します。抵抗は直結防止のためなので、1kΩでなくてもOKです。

Pi5とLEDを接続した実際のボードの画像
接続のイラストの図
ピン番号 RaspberryPi Pico 側 回路側
33 GP12 LED アノード ( 足の長い方)
6 GND 抵抗

※ 上記回路はGPIOの記事と同じものです。

ピンアサイン

RaspberryPi 公式のGitHubより引用

使用する部品

この記事で使用する部品は以下の通りです。

RaspberryPi 5

RaspberryPi 5本体です。技適や流通経路が不安な方は、日本の老舗店マルツオンライン(楽天)のページが安心です(現在は4GB版のみの販売)。

※ どの購入先でも、本体に電源やケーブルは含まれていないので注意してください

RaspberryPi 5 用電源

スマホ用(PD対応品)も使用できますが、仕様によってはUSBの出力電流が制限されたり、電源が落ちたりすることもあります。5V5A対応品の使用がおすすめです。

公式品は少々値段が高いので、私は以下から購入・使用しています。

サーボモータ(ラジコンサーボ) SG90

冒頭でも紹介した、RaspberryPiシリーズで使えるサーボモータ(ラジコンサーボ)です。 人気のため、コピー品も多いようです。私は以下の正規販売元のページから購入しました。

¥820 (2023/08/25 06:08時点 | Amazon調べ)

ブレッドボード(ハーフサイズ)

サンハヤト製のブレッドボードです。今回は簡単な回路なので小さいサイズのものを使っています。

LED

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

抵抗

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

プログラム概要

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

  • PWM型のLEDオブジェクトを生成する
  • LEDをオフ(消灯)にする
  • LEDを半分の明るさにする
  • LEDを最大の明るさにする

実行結果

後述するプログラムの実行結果は以下の通りです。実行するとLEDが1秒おきに「消灯」→「半分の明るさで点灯」→「最大の明るさで点灯」と変化します。

プログラムを実行して消灯している時の画像
消灯
プログラムを実行して、半分の明るさで点灯している時の画像
半分の明るさで点灯
プログラムを実行して、最大の明るさで点灯している時の画像
最大の明るさで点灯

全体コード

全体コードは以下の通りです。詳細な内容は後述する「コードのポイント」で解説します。

from gpiozero import PWMLED
from time import sleep

# PWMで操作できる「PWMLED」オブジェクトを生成する
led = PWMLED(13)

while True:
    # ONの幅をゼロにする
    led.value = 0 
    sleep(1)

    # ONの幅を半分にする
    led.value = 0.5  # half brightness
    sleep(1)
    
    # ONの幅を全部にする
    led.value = 1  # full brightness
    sleep(1)

# LEDを点滅させます
# led.blink(1.0, 1.0, 0,0, 3, False)

実行方法

上述した全体コードを保存したディレクトリで、以下のコマンドを実行します。

sudo python gpiozero_pwmled.py

コードのポイント

PWMLEDオブジェクトの生成

RPi.gpioなど多くのライブラリは「ピン」に着目したプログラムの構造をとっていますが、gpiozeroでは、「モノ(部品)」に着目した名称や構造をとっています。

そのためPWMでのLEDを操作する際は「PWMLED」型のオブジェクトを生成し、かっこ内には使用するピンの名称(GP13などの数字部分)を指定します。

# PWMで操作できる「PWMLED」オブジェクトを生成する
led = PWMLED(13)

LEDをオフにする

PWMLEDオブジェクトのvalueプロパティを「0」にするとLEDを消灯できます。

valueプロパティはPWMのONの幅を0~1.0で表すもので、0にするとONの幅がゼロなり、LEDが消灯します。

    # ONの幅をゼロにする
    led.value = 0 
    sleep(1)

LEDを半分の明るさにする

valueプロパティを「0.5」にすると、ONの幅が半分になり、LEDが「半分の明るさ」で光ります。

    # ONの幅を半分にする
    led.value = 0.5  # half brightness
    sleep(1)

LEDを最大の明るさにする

valueプロパティを「1」にするとLEDが「最大の明るさ」で光ります。

    # ONの幅を全部にする
    led.value = 1  # full brightness
    sleep(1)

valueプロパティで指定できるのは「0~1」までです。それ以外の値を指定すると、以下のように実行時にエラーになります。

gpiozero.exc.OutputDeviceBadValue: PWM value must be between 0 and 1

点滅

PWMの周波数を遅くすると、LEDを点滅させることもできます。

RPi.gpioなどのライブラリでは、周波数の数値を変更する関数しかありませんが、gpiozeroではblink関数を使って、簡単に点滅が実現できます。

下記のコードは「1秒点灯」「1秒消灯」「3回繰り返し」「繰り返し完了まで終了しない」

# LEDを点滅させます
# led.blink(1.0, 1.0, 0,0, 3, False)

引数 内容 説明
1 ON時間 1秒 点灯する時間
2 OFF時間 1秒 消灯する時間
3 フェードイン時間 0秒 ゆっくり点灯させる場合の、点灯までの時間
4 フェードアウト時間 0秒 ゆっくり消灯させる場合の、消灯までの時間
5 実行回数 3回 繰り返しの回数
6 バックグラウンド実行 False

繰り返し完了まで処理を次に進めるかどうかを指定する設定

バックグラウンド実行を「True」にしても、プログラム全体の終了に合わせて、blink関数が終了します。

そのため、この記事のようなblink関数の後に何もしないプログラムでは、プログラム全体がすぐに終了してしまい、LEDが点灯しない(ように見える)ので、注意が必要です。

その他の使い方

LEDPWMのその他の使い方については、以下の公式リファレンスのPWMLEDの項目をご覧ください。

ラジコンサーボなどのために、特定周波数に設定したい場合など、細かい使い方が掲載されています。

https://gpiozero.readthedocs.io/en/stable/api_output.html#pwmled

まとめ

Raspberrypi5でPWMを使う方法を解説しました。

RaspberryPi5になって、慣れ親しんだ「RPi.gpio」が使えないのはつらい状態ですが、「gpiozero」もシンプルで分かりやすく、使いやすいライブラリです。

このブログでもPi5と合わせて、gpiozeroのいろいろな使い方を解説していくので、これからもぜひご覧いただければと思います。参考になればうれしいです。

お知らせ

最新号のInterfaceは『プログラミングで体験 生成AI』

最新号の日経Interfaceは「プログラミングで体験 生成AI」です。
話題の生成AIについて、日経Interfaceでも何度も特集が組まれていますが、今回は「画像・音声・自然言語」に着目して、Pythonでのプログラミング方法まで解説されています。

その他にも、ESP32やモータの使い方、RaspberryPiで始めるGPUプログラミングなど、てんこ盛りの一冊です。「なんか気になるな」と思ったら、以下のリンクで目次だけでも目を通してみてください。 6月25日発売です。

質問・要望 大歓迎です

「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。

使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。

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

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Index