プログラミング入門04PWM

CircuitPython

光の強さを制御するPWM

PWMとはPulse Width Moduration(パルス幅変調)の略です。高速でオンオフを繰り返すことによって出力を調整する仕組みです。前回のプログラムを変えてみましょう。

#ledを高速で点滅させる

import board
import digitalio
import time

led = digitalio.DigitalInOut(board.GP2)
led.direction = digitalio.Direction.OUTPUT

while True:
    led.value = 1
    time.sleep(0.001)
    led.value = 0
    time.sleep(0.001)

どうでしょうか?LEDの光が弱くなりましたね。高速で点滅しているだけなのですが、私達の目には光が弱くなったように見えてしまうのです。time.sleepの引数を変えて光の強さを変えてみてください。

PWMを使ってみる

上のプログラムをソフトウエア的に実現するのがPWM制御です。Pulse Width Modurationの略です。日本語だとパルス幅変調といいます。pwmioをインポートするとPWMを使うことができるようになります。GP2をledという名前でインスタンス化します。周波数は5000hz。

duty比とdutyサイクル

オンの時間/信号幅がデューティー比といいます。その比率に対して65535をかけてあげるとduty_cycleになります。下のプログラムでは10行目では100%。12行目では50%の出力を設定しています。

int()とは整数にする関数です。16行目をみてください。30/100×65535は19660.5ですが小数点以下の違いなんて人間の目には知覚できません。しかしPythonにとっては小数点以下の数は計算速度を遅くする原因にしかなりません。なのでint()を使って小数点以下を切り捨てるのです。

#PWM テスト
import time
import board
import pwmio

# LED setup GP2
led = pwmio.PWMOut(board.GP2, frequency=5000, duty_cycle=0)

while True:
    led.duty_cycle = int(100/100*65535)
    time.sleep(1)
    led.duty_cycle = int(50/100*65535)
    time.sleep(1)
    led.duty_cycle = int(80/100*65535)
    time.sleep(1)
    led.duty_cycle = int(30/100*65535)
    time.sleep(1)
    led.duty_cycle = int(90/100*65535)
    time.sleep(1)

光を強くする

だんだん光を強くするプログラムを実行してみます。for文を使います。in range(65535)と指定することによって、0から2ずつ増加して65534まで増やしていきます。range関数は最初の数字第一ひきすうを開始数、第二引数で終わりの数、第三引数ででステップ数を指定しています。

#PWM テスト01
import time
import board
import pwmio

# LED setup GP2
led = pwmio.PWMOut(board.GP2, frequency=5000, duty_cycle=0)

while True:
    for i in range(0, 65535, 2):
        led.duty_cycle = i # Up

では今度はだんだん弱くするプログラムを作ってください。答えは載せませんけど,なんとかがんばってくださいね。

Pulse Width Modurationまとめ

PWM(Pulse Width Moduration)の使い方はわかりましたか?今回はLEDの強さを制御しました。しかしこれだけではありません。PWMはモーターを制御するのにも使えます。電気自動車にも使われているでしょう。これからロボットを制御するときにも使用することになります。おぼえておきましょう。

タイトルとURLをコピーしました