gpiozeroライブラリ入門③import PWMLED
PWMはPulse Width Modulationの略で、次の二つのパラメータをもちます。
- 周波数
- ディーティ(Duty)比
使用環境
|
●PWMLEDクラス
クラスgpiozero.PWMLED(pin, *, active_high=True, initial_value=0, frequency=100, pin_factory=None)パラメータ: (*をそのまま記述するとエラーになる。用途は不明)
|
●接続
前回の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