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ライブラリ入門

- OutputDevice -

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

(5) Buzzer (6) TonalBuzzer

(7) Motor その1 BD65496 (8) その2 TB67H420FTG (9) その3 TB6612 (10) その4 MC33926 (11) PhaseEnableMotor DRV8835

(12) Servo (13) AngularServo

- SPI Device -

(14) 10ビットA-DコンバータMCP3001/MCP3002/MCP3004/MCP3008

(15) 12ビットA-DコンバータMCP3201/MCP3202/MCP3204/MCP3208

(16) 13ビットA-DコンバータMCP3301/MCP3302/MCP3304