このドキュメンテーションは、MicroPython の最新開発ブランチのためのものです。 リリースバージョンでは利用できない機能に言及することがあります。

特定のリリースのドキュメントをお探しの場合は、左側のドロップダウンメニューを使って、 望みのバージョンを選択します。

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)