PWM (MicroPython + Thonny)
圧電ブザーを鳴らすプログラムの書き方
音は波であるため, 音を出したい時には電圧の HIGH と LOW を繰り返すことで, プログラム的に下記に示すような特定の周波数を持つ波 (矩形波) を作れば良い. HIGH と LOW の持続時間の和が波の周期に対応する.
プログラムの書き方については Quick reference for the ESP32 の PWM(パルス幅変調) [日本語版] を参照して欲しい.
なお, デューティー比は比率 (%) で与えるのではなく, 下図でいうところの「閾値」として与える.
なお, 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 の点灯に合わせてブザーから曲が流れる.
- その他