概要
Raspberry PiでPWM (Pulse Width Modulation)を使う基本方法を整理する。
GPIO.PWM
メソッドで、使用するピンと周波数を設定PWM.start
メソッドの引数にデューティー比を指定して実行開始PWM.ChangeDutyCycle
メソッドの引数でデューティー比を指定して変更
回路
LED点滅と同じ構成で、アノード側の抵抗をGPIO13に、カソードをGNDに接続する。
コード
以下のコードでは、100HzのパルスでLEDを点灯させ、順次輝度を落としている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import RPi.GPIO as GPIO import time # Define that LED cathode is connected to GPIO13 led_anode = 13 # Set the GPIO mode to BCM numbering GPIO.setmode(GPIO.BCM) # Set LED pin (GPIO13) to output GPIO.setup(led_anode, GPIO.OUT) # Define GPIO13 as PWM with frequency 100Hz pwm = GPIO.PWM(led_anode, 100) # Lightup LED with duty ratio 100% pwm.start(100) time.sleep(2) # Change duty ratio to 50% pwm.ChangeDutyCycle(50) time.sleep(2) # Change duty ratio to 10% pwm.ChangeDutyCycle(10) time.sleep(2) # Release resource GPIO.cleanup() |
要点は以下の通り。
- 13行目で100HzのPWMをGPIO13に設定
- 16行目でデューティー比100%でスタートし、2秒点灯
- 20行目でデューティー比を50%に低減
- 24行目でデューティー比を10%に低減
この結果、スクリプト実行後LEDが3段階で暗くなっていき、最後に消灯する。
スクリプトによる実装
スクラッチでスクリプトを以下のように書いても同様の動作をさせることができる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import RPi.GPIO as GPIO import time led_anode = 13 frequency = 100 time_slice = 1 / frequency duty_ratio = 0.001 on_time = time_slice * duty_ratio off_time = time_slice * (1 - duty_ratio) def setup(): GPIO.setmode(GPIO.BCM) GPIO.setup(led_anode, GPIO.OUT) def destroy(): GPIO.output(led_anode, GPIO.LOW) GPIO.cleanup() def main(): while True: GPIO.output(led_anode, GPIO.HIGH) time.sleep(on_time) GPIO.output(led_anode, GPIO.LOW) time.sleep(off_time) setup() try: main() except KeyboardInterrupt: destroy() |
要点は以下の通り。
frequency
にはLED点滅切替えの周波数をHzで指定し、その逆数=周期(秒)をtime_slice
に設定- デューティー比
duty_ratio
を指定し、点灯/点滅の時間をtime_slice
に乗じて算出・設定
たとえばfrequency
が100Hzの場合1サイクルは0.01sec。ここでデューティー比0.3とすると、点灯時間は0.003sec、消灯時間は0.007secとなり、LEDは暗めに発光する。