7. パルス幅変調¶
パルス幅変調(PWM: Pulse Width Modulation)は、デジタルピンで疑似アナログ出力を得る方法です。これは、ピンをローからハイにすばやく切り替えることで実現します。これに関連するパラメータには、トグル回数とデューティサイクルがあります。デューティサイクルは、ピンが1周期の長さ(low plus high time)の長さと比較してどれくらい長いかを定義します。最大デューティサイクルはピンが常にハイレベルで、最小は常にローレベルです。
ESP8266 では、ピン 0, 2, 4, 5, 12, 13, 14, 15 はすべて PWM をサポートしています。制限はすべて同じ周波数でなければならず、周波数は 1Hz と 1kHz の間でなければなりません。
ピンで PWM を使用するには、まずピンオブジェクトを作成する必要があります。たとえば次のようにします:
>>> import machine
>>> p12 = machine.Pin(12)
次に、以下を使用してPWMオブジェクトを作成します。
>>> pwm12 = machine.PWM(p12)
次のように周波数とデューティサイクルを設定できます。
>>> pwm12.freq(500)
>>> pwm12.duty(512)
デューティサイクルは 0 (全オフ)と 1023 (全オン)の間であり、512 は 50% のデューティとなります。この最小値/最大値を超える値は切り捨てられます。PWM オブジェクトを表示すると、現在の設定が表示されます。
>>> pwm12
PWM(12, freq=500, duty=512)
また、引数を持たない freq()
や duty()
を呼び出すのでも現在の値を取得できます。
ピンは、以下を使用して初期化を解除するまで、PWMモードになります:
>>> pwm12.deinit()
7.1. LEDの減光¶
PWM 機能を使って LED を徐々に減光してみましょう。ボードのピン2に接続された LED があるとすると(ESP-12 モジュールではそうなっています)、次の方法で LED-PWM オブジェクトを作成できます。
>>> led = machine.PWM(machine.Pin(2), freq=1000)
PWM のコンストラクタで周波数を設定できることに注意してください。
次の部分ではタイミングと数学関数を使うので、これらのモジュールを import してください:
>>> import time, math
次に、LED をパルスする関数を作成します:
>>> def pulse(l, t):
... for i in range(20):
... l.duty(int(math.sin(i / 10 * math.pi) * 500 + 500))
... time.sleep_ms(t)
この関数を実行してみてください:
>>> pulse(led, 50)
すてきな効果を出すために、連続して何度もパルスするようにもできます:
>>> for i in range(10):
... pulse(led, 20)
コードの実行を中断するには ctrl-C を使ってください。
7.2. ホビー用サーボを制御する¶
ホビー用サーボモータは、PWM を使って制御できます。それらは 50Hz の周波数を必要とし、次に約 40〜115 のデューティを必要とし、77 を中心値とします。サーボを電源ピンとグランドピンに接続し、信号線をピン12に接続すると(他のピンも同様に機能します)、次のようにしてモータを制御できます:
>>> servo = machine.PWM(machine.Pin(12), freq=50)
>>> servo.duty(40)
>>> servo.duty(115)
>>> servo.duty(77)