はじめに
Raspberrypi5でPWMを使う方法を解説します。
LEDと抵抗のみのシンプルな回路を使い、PWM信号によってLEDの調光(明るさの変更)を行います。
言語にはPython、ライブラリにはPi5の公式ドキュメントでも紹介されている「gpiozero」を使用します。
これまで、PWMのライブラリとして「RPi.gpio」を紹介してきましたが、2024年3月現在、Pi5ではRPi.gpioが使えない状態が続いています。
そのため、今回は現時点で使用可能な「gpiozero」を使う方法を解説します。
PWMは、Pulse Width Modulationの略で、GPIOと同じON/OFF信号を「指定した周期」で「くり返し」出力できる仕組みです。
この仕組みを使うと、入力の電圧は変えずに、ONのパルス幅(毎周期のONの幅)を変えるだけで、任意の電圧を作ることができます。
PWMでは以下の内容が変更できます。
- 周期(周波数):1秒間に何回ON/OFFさせるか
- Duty比 : 1周期中のON/OFF時間の割合
上記の仕組みは、モーターやスピーカーなど、いろいろな用途に使用されており、LEDに使うと簡単に光の明暗操作(調光)をすることができます。
~ この記事の内容 / Contents ~
環境
この記事で使用する環境は以下の通りです。
環境 | バージョンなど | 備考 |
RaspberryPi | 最新の「5」を使用します | |
RaspberryPi OS | Debian version 12 (bookworm) | 64bit版です |
言語 | Python 3.11.2 | |
ライブラリ | gpiozero |
RaspberryPi 5との接続
RaspberryPi 5とLEDを以下のように接続します。抵抗は直結防止のためなので、1kΩでなくてもOKです。
ピン番号 | RaspberryPi Pico 側 | 回路側 |
33 | GP12 | LED アノード ( 足の長い方) |
6 | GND | 抵抗 |
※ 上記回路はGPIOの記事と同じものです。
ピンアサイン
※ RaspberryPi 公式のGitHubより引用
使用する部品
この記事で使用する部品は以下の通りです。
RaspberryPi 5
RaspberryPi 5本体です。技適や流通経路が不安な方は、日本の老舗店マルツオンライン(楽天)のページが安心です(現在は4GB版のみの販売)。
※ どの購入先でも、本体に電源やケーブルは含まれていないので注意してください
RaspberryPi 5 用電源
スマホ用(PD対応品)も使用できますが、仕様によってはUSBの出力電流が制限されたり、電源が落ちたりすることもあります。5V5A対応品の使用がおすすめです。
公式品は少々値段が高いので、私は以下から購入・使用しています。
サーボモータ(ラジコンサーボ) SG90
冒頭でも紹介した、RaspberryPiシリーズで使えるサーボモータ(ラジコンサーボ)です。 人気のため、コピー品も多いようです。私は以下の正規販売元のページから購入しました。
ブレッドボード(ハーフサイズ)
サンハヤト製のブレッドボードです。今回は簡単な回路なので小さいサイズのものを使っています。
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は「Linuxチューニング術50」
今月号のInterfaceは『Linux チューニング術 50』です。
Linuxを組み込んだ機器を”本格的”に作ろうとすると「起動を早くしたい」「いきなり電源を切られてもデータを守りたい」など、対応が必要なチューニングはおおいですよね。
今回の記事は、「カーネルをいじらない」方法でチューニングを行う方法が解説されています。
こういった”実用的”な特集はレアですし、知っておいても損はない情報だと思います。
私も仕事でこの手の問題に何度も遭遇していますが、こういったOSレベルの難しそうな設定を、さらっとできちゃう人はかっこいいですよね。
興味のある方は、以下のリンクから確認できます。
質問・要望 大歓迎です
「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。
使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。