TOPに戻る

gpiozeroライブラリ入門③import PWMLED

 PWMはPulse Width Modulationの略で、次の二つのパラメータをもちます。

  • 周波数
  • ディーティ(Duty)比

 使用環境
  • Raspberry Pi Raspberry Pi 4 Model B 2MB
  • OS Raspberry Pi OS(32ビット)5.4.72
  • Python3 3.7.3
  • gpiozeroライブラリ 1.5.1
  • エディタ Mu

PWMLEDクラス

クラスgpiozero.PWMLED(pin, *, active_high=True, initial_value=0, frequency=100, pin_factory=None)

パラメータ:
 pin (int or str) – LEDが接続されているGPIOピン。これがNoneの場合、GPIODeviceErrorが発生する。
 active_high (bool) – True(デフォルト)の場合、on()メソッドはGPIOをHighに設定する。 Falseの場合、on()メソッドはGPIOをLowに設定する(off()メソッドは常に反対のことを行う)。
 initial_value (float) –0(デフォルト)の場合、LEDは最初はOFFになる。 LEDの初期輝度として、0〜1のほかの値を指定できる。 PWMにピンの状態を変更しないように指示する方法がないため、(親クラスとは異なり)Noneを指定できないことに注意。
 frequency (int) – LEDを駆動するパルスの周波数(Hz)。デフォルトは100Hz。
 pin_factory (Factory or None)  APIの解説を読む

(*をそのまま記述するとエラーになる。用途は不明)

blink(on_time=1, off_time=1, fade_in_time=0, fade_out_time=0, n=None, background=True)

 デバイスの電源を繰り返しON/OFFする。

パラメータ:
 on_time (float) – ONの秒数。 デフォルトは1秒。
 off_time (float) – オフの秒数。 デフォルトは1秒。
 fade_in_time (float) – フェード・インに費やす秒数。デフォルトは0。
 fade_out_time (float) – フェード・アウトに費やす秒数。 デフォルトは0。
 n (int or None) – 点滅する回数。 なし(デフォルト)は永遠を意味する。
 background (bool) –True(デフォルト)の場合、バックグラウンド・スレッドを開始して点滅を続け、すぐに戻る。 Falseの場合、点滅が終了したときにのみ戻る(警告:デフォルト値のnは、このメソッドが戻らない結果になる)。

off()

 デバイスをOFFにする。

on()

 デバイスをONにする。

pulse(fade_in_time=1, fade_out_time=1, n=None, background=True)

 フェード・インとフェード・アウトを繰り返す。

パラメータ:

 fade_in_time (float) – フェード・インに費やす秒数。デフォルトは1。
 fade_out_time (float) – フェード・アウトに費やす秒数。 デフォルトは1。
 n (int or None) – パルスする回数。 なし(デフォルト)は永遠を意味する。
 background (bool) – True(デフォルト)の場合、バックグラウンド・スレッドを開始してパルスを継続し、すぐに戻る。 Falseの場合、パルスが終了したときにのみ戻る(警告:デフォルト値のnは、このメソッドが戻らない結果になる)。

toggle()

 デバイスの状態を切り替える。 デバイスが現在OFF(値が0.0)の場合、これにより「完全に」ON(値は1.0)に変更される。 デバイスのデューティ・サイクル(値)が0.1の場合、0.9に切り替わる。

is_lit

 デバイスが現在アクティブ(値がゼロ以外)の場合はTrueを返し、それ以外の場合はFalseを返す。

pin

 デバイスが接続されているピン。 デバイスが閉じられている場合、これはNoneになる(close()メソッドを参照)。 GPIOピンを処理するときは、pin.numberを照会して、デバイスが接続されているGPIOピン(BCM番号付け)を見つける。

value

 PWMデバイスのデューティ・サイクルの値。0.0はOFF、1.0は完全にON。その間の値は、デバイスのさまざまなレベルの電力に対して指定できる。

接続

 前回のLEDと同じくGPIO17に抵抗内蔵LEDをつなぎます。

PWM出力とはどういう意味か

 LEDをONしました。GPIO17ポートを観測すると、LowからHighに変わっただけです。

from gpiozero import PWMLED

led = PWMLED(17, initial_value = 0, frequency=100)
led.on()

 blink()関数を使ってみました。立ち上がりのところをフェード・インします。

from gpiozero import PWMLED
from time import sleep

led = PWMLED(17, initial_value = 0, frequency=100)
led.off()
sleep(1)

led.blink(fade_in_time=0.8)

 PWMのデューティ比が連続的に変化し、ほぼ0から100%に変化した後、ONになっています。LEDは、フォワーッと明るくなり、プチっと消灯します。

 fade_in_timeを0.8から0.3へ変更したら、フェード・インの時間が短くなりました。

 PWMのfrequencyは、このフェード・イン期間のPWMの周波数ということですね。

led.blink(fade_in_time=0.3)

いずれのピンもPWM出力ができるか

 次のプログラムを動かし、GPIO2からひとつずつポートを変更し、波形が出ているかを確認しました。

from gpiozero import PWMLED
from time import sleep

port =2
led = PWMLED(port)
led.off()
sleep(1)
print(port)
led.blink(fade_in_time=0.2, fade_out_time=0.4)

(ここまでのオシロスコープのキャプチャはプローブx1です。ここからはx10。)

 すべてのポートで利用できました。

GPIO2   -
GPIO3   -
GPIO4 GPIO14
-   GPIO15
GPIO17 GPIO18
GPIO27   -
GPIO22 GPIO23
-   GPIO24
GPIO10   -
GPIO9 GPIO25
GPIO11 GPIO8
-   GPIO7
GPIO5   -
GPIO6 GPIO12
GPIO13   -
GPIO19 GPIO16
GPIO26 GPIO20
-   GPIO21

pulseクラス・オブジェクト

 明るくなってすぐに暗くなるという動作を繰り返します。

from gpiozero import PWMLED
from time import sleep

port =17
led = PWMLED(port)
led.off()
sleep(1)
print(port)
led.pulse()

 次のプログラムのように、同時にGPIO17とGPIO21の二つのピンを駆動しました。
 動きました。

from gpiozero import PWMLED
from time import sleep

led = PWMLED(17)
led1 = PWMLED(21) led.off() sleep(1) print(port) led.pulse()
led1.pulse()

 GPIO20を追加して同時に3ピンを駆動したら、いずれの出力も出ませんでした。組み合わせによっては可能なピンも存在するかもしれませんが、2本までとしたほうが確実かもしれません。2本の組み合わせも動かない場合があるかもしれません。

周波数の上限

  led = PWMLED(17, initial_value = 0, frequency=100)

周波数が10kHzぐらいまではディーティ比が可変になります。それ以上に上げるとディーティが50%になり、100kHや1MHzを指定できますが、20kHz付近と波形は変化しません。

フェード・インとフェード・アウト時のデューティ比の変化(2020/11/22追加)

 オシロスコープの演算機能を用いて、ディーティ比の変化を描画しました。

  • 黒色;PWM信号なので、ローパス・フィルタを通すことで平均電圧を知ることができる。LowPass(A*10,10) 
  • ピンク色;ディーティ比を直接描画。ノイズが多いのでローパス・フィルタをかけた。LowPass(duty(A),10)
  • 画像

 直線的にデューティ比が変化していることがわかりました。

gpiozero Copyright 2015-2020 Ben Nuttall 

連載 gpiozeroライブラリ入門

(1) LED その1 (2) LED その2 (3) PWMLED (4) RGBLED

(5) Buzzer (6) TonalBuzzer

(7) Motor その1 BD65496