PWM (MicroPython + Thonny)

圧電ブザーを鳴らすプログラムの書き方

音は波であるため, 音を出したい時には電圧の HIGH と LOW を繰り返すことで, プログラム的に下記に示すような特定の周波数を持つ波 (矩形波) を作れば良い. HIGH と LOW の持続時間の和が波の周期に対応する.

プログラムの書き方については Quick reference for the ESP32PWM(パルス幅変調) [日本語版] を参照して欲しい.

なお, デューティー比は比率 (%) で与えるのではなく, 下図でいうところの「閾値」として与える.

なお, ESP32 のクロックは 80 MHz = 12.5 μs で動作するため, 分解能をそれよりも小さくすることはできない. 逆に言うと, タイマの解像度によって表現できる最大波長が決まる. 1 bit ならば 1 / (12.5e-6 * 2) = 40 MHz, 8 bit ならば 1 / (12.5e-6 * 256) = 312.5 kHz, 13 bit ならば 1 / (12.5e-6 * 8192) = 9765 Hz, である.

圧電ブザー

Thonny において以下のようにプログラムを作成して実行する.

from machine import Pin, PWM
from time import sleep
pwm0 = PWM(Pin(15))
pwm0.freq(500)
pwm0.duty(512)
sleep(10)
pwm0.duty(0)           # PWM を無効化
  • 1~2 行目: 必要なライブラリの読み込み
  • 3 行目: スピーカの接続されているピン (GPIO 15) を使う設定.
  • 4 行目: 周波数の設定
  • 5 行目: デューティー比の設定. 512 /1024 = 50%
    • ドキュメントにタイマーの解像度が明示的に書かれていないが, おそらく 10 bit と思われる. micropython で ESP8266 がそうなっているので.
  • 6 行目: 音を 10 秒鳴らす場合は sleep で継続時間を指定する.
  • 7 行目: duty をゼロにすれば音が止まる.

LED の明るさ変化

LED (GPIO 13) の明るさを 10 秒間隔で変化させる

from machine import Pin, PWM
from time import sleep

pwm = PWM(Pin(13))
pwm.freq(1000)
num = 10

while True:
   for i in range(10):
       print( i )
       pwm.duty( 100 * i )
       sleep (1)
   sleep(0.1)

課題

LED, スイッチ, ブザーを用いたプログラムを作成してみよ.

  • スイッチを入れたら音が鳴る
  • スイッチを入れると, ブザーで「ドレミファソラシド」が鳴る.
  • LED の点灯に合わせてブザーから曲が流れる.
  • その他