Raspberry Pi

RaspberryPiでPWMを使う方法【RPi.GPIO】

はじめに

RaspberryPi でPWMを使う方法を解説します。回路はLEDのみ、プログラム言語は「Python」ライブラリに「RPi.GPIO」を使います。

LEDにPWMを使うことで、LEDの点滅・調光が簡単に扱えるようになります。

記事内では懐かしの「RaspberryPi2」を使っていますが「RaspberryPi2〜4」「Raspberry Zeroシリーズ」なら解説と同じ方法でGPIOが使えます。

【基礎知識】PMW

GPIOと同じON/OFF信号を指定した周期」で「くり返し」出力できる仕組みです。以下の内容を設定できます。

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

PWMはモーターやスピーカーなど、いろいろな用途に使用でき、LEDに使うと点滅・明るさを簡単に変えることができます。

必要な部品はLEDと抵抗だけで、見た目にも分かりやすいので、今回はLEDを使ってPWMを解説します。

環境

環境 バージョンなど 備考
RaspberryPi 2 Model B RaspberryPi 2/3/4  Zero各種でも使えます
OS RaspberryPi OS (bullseye) 32bit版です
Python 3.9.2 OS プリインストールのバージョンです
ライブラリ RPi.GPIO

LEDの接続

RaspberryPiの「GPIO 13」ピンにLEDを接続します。抵抗は直結防止程度に手元にあった220Ωを使っています。

RaspberryPiで(Hardware)PWMが使えるのは、GPIO12,13ピンのみなので、どちらかを選択してください。

RaspberyPiとLEDの接続方法を説明する画像

RaspberryPi ピンアサイン

RaspberryPi のピンアサインの画像

RaspberryPi 公式のGitHubより引用

使用する部品

今回の回路では以下の部品を使います。

ブレッドボード

どのメーカーのものでも問題ないです。大きい方が自由度が高く・品質もいいので、サンハヤト製の以下のタイプをおすすめします。

あきばお〜楽天市場支店
¥945 (2022/09/18 00:07時点 | 楽天市場調べ)

LED

LEDも特に制限はありません。各色が手元にあると工作時に便利です。

抵抗

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

¥1,500 (2022/02/22 10:06時点 | Amazon調べ)

プログラム概要

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

  1. GPIOの番号指定の設定をする。
  2. GPIO・PWMを設定する
  3. PWMでLEDを点滅させる
  4. PWMでLEDを暗くする
  5. PWMでLEDを消灯する

実行結果

プログラムを実行すると、以下のようにLEDが光ります。

点滅・点灯

プログラムを実行してでLEDが点滅している画像
プログラムを実行してでLEDが点灯している画像

調光(暗く)・消灯

プログラムを実行してでLEDが調光で暗くなっている画像
プログラムを実行してでLEDが消灯している画像

全体コード

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

# RPi.GPIOのライブラリを「GPIO」という名前で使います
import RPi.GPIO as GPIO
import time

# GPIOのピン番号指定を「BCM」に設定します
GPIO.setmode(GPIO.BCM)

# 設定を確認。BCMの場合は「11」が返ります
mode = GPIO.getmode()
print(mode)

# PWMに使うピンに名前をつけます
PWM = 13

# PWMに使うピンを「Out」に設定します
GPIO.setup(PWM,GPIO.OUT)

# PWMに使うピンと周波数(1秒間に10回)を設定します
pwm = GPIO.PWM(PWM,10)

# PWMの制御を開始します
# 1周期の内,8割がONになるように設定します(Duty:80)
pwm.start(80)
time.sleep(2)

# Dutyは変えずに、周波数を1000に変更します
# この周波数になると、人の目ではLEDが点灯しているように見えます
pwm.ChangeFrequency(1000)
time.sleep(2)

# Dutyを「20」に設定します
# 周波数が早い状態で、Dutyを下げると、LEDが暗くなったように見えます
pwm.ChangeDutyCycle(10)
time.sleep(2)

# Dutyを「0」に設定します
# LEDが消灯します
pwm.ChangeDutyCycle(0)
time.sleep(2)

print("done.")

# GPIOの設定を解除します
GPIO.cleanup(PWM)

コードのポイント

ピン番号の指定方法の設定

ピン番号の指定方法をsetmode関数で設定します。

# GPIOのピン番号指定を「BCM」に設定します
GPIO.setmode(GPIO.BCM)

# 設定を確認。BCMの場合は「11」が返ります
mode = GPIO.getmode()
print(mode)

指定の種類は「GPIO〇〇の番号を指定する”BCM”」「ピンの物理的な番号を指定する”BOARD”」の二種類がありますが、今回は「GPIO〇〇」の「BCMの方式」を使います。

選択した指定はgetmode関数で確認できます。

名称 指定 設定 getmode()
BCM RPi.GPIO.BCM GPIO〇〇と記載のある番号 11
BOARD RPi.GPIO.BOARD 基板のピン番号(1~40) 10

※ 未設定の場合は「-1」が返ります。

GPIOの設定(出力)

output関数を使って、PWMに使うピンをGPIOの出力に設定します。

引数には「ピン番号」「入力・出力の指定」を渡します。

# PWMに使うピンに名前をつけます
PWM = 13

# PWMに使うピンを「Out」に設定します
GPIO.setup(PWM,GPIO.OUT)

内容 設定 説明
ピン番号 13 GPIO13 (BCM形式です)
入出力指定 RPi.GPIO.OUT 出力用に設定

PWMの設定

PWM関数を使って、上で出力に設定済みのピン番号と、PWMの周波数を設定します。

# PWMに使うピンと周波数(1秒間に10回)を設定します
pwm = GPIO.PWM(PWM,10)

内容 設定 説明
ピン番号 13 GPIO13 (BCM形式です)
周波数 10 単位は[Hz]です。 0.1単位で指定できます

PWM出力の開始

start関数でDuty比を設定すると、PWM出力が始まります。

# PWMの制御を開始します
# 1周期の内,8割がONになるように設定します(Duty:80)
pwm.start(80)
time.sleep(2)

上記コードでは、周期をかなり遅く(10Hz)しているので、Duty比による点滅を目視で確認することができます(LEDを点滅させたいときに便利です).

プログラムを実行してでLEDが点滅している画像
LEDの点滅

周波数の変更

ChangeFrequency関数でPWMの周波数を変更することができます。

# Dutyは変えずに、周波数を1000に変更します
# この周波数になると、人の目ではLEDが点灯しているように見えます
pwm.ChangeFrequency(1000)
time.sleep(2)

上記コードは、周波数の変更だけでDuty比は変えていません。そのため、LEDは変わらず点滅していますが、周期が早いので人の目では「点灯」しているように見えます(扇風機の羽のイメージです)。

プログラムを実行してでLEDが点灯している画像
LEDの点灯

Duty比の変更

ChangeDutyCycle関数でDuty比を変更することができます。

設定範囲は0.0~100.0で「0」を指定するとPWM出力が停止します。

# Dutyを「20」に設定します
# 周波数が早い状態で、Dutyを下げると、LEDが暗くなったように見えます
pwm.ChangeDutyCycle(10)
time.sleep(2)

# Dutyを「0」に設定します
# LEDが消灯します
pwm.ChangeDutyCycle(0)
time.sleep(2)

LEDの明るさを電気的に変えるには電圧値・抵抗値の変更が必要で、プログラムで制御するには大変です。それに対してPWMなら、電圧を変えずにDuty比だけで明るさを調整することが出来ます。

プログラムを実行してでLEDが暗くなっている画像
LEDの調光(暗くする)
プログラムを実行してでLEDが消灯している画像
LEDの消灯

まとめ

RaspberryPi でPythonを使って、PWMを使う方法を解説しました。

LED1つで出来るので、ぜひ遊んでみてください。

UdemyにRaspberryPiの講座があります

実はUdemyで『RaspberryPi』『Pico』『Arduino』の基礎/実践講座が見れます。無料もあるので「動画で学びたい」「本は読み尽くした」という方は以下のリンクをご覧ください。

⇒ RaspberryPiの講座一覧はこちら

以下の記事で、RaspberryPi・RaspberryPi Picoのおすすめ講座3選も解説しています。

PWMの次は「I2C通信」にチャレンジしてみよう

PWMの次は「I2C通信」にチャレンジしてみましょう。GPIOやPWMでは、ON/OFF信号がメインでしたが、I2Cでは、センサなどと「数値情報」がやり取りできるようになります。興味のある方は、以下の記事をご覧ください。

応援・要望お待ちしてます

ブログを見ていて「この辺を詳しく知りたい」「このライブラリの使い方を知りたい」「こんなことで困ってる」...etc があれば、コメント・問い合わせ・Twitterで教えてください。質問・ご要望に合わせて解説記事を作ります。

ブログを気に入っていただけたり、「応援してもいいよ」という方がいたら、ブログやSNSでの紹介をお願いします。 あたたかい応援は、中の人の更新の大きな励みになります。

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

COMMENT

メールアドレスが公開されることはありません。