TrinketでLEDの続き
前回(Trinketと外部電源)やったことは、結局のところ、PWM(Pulse Width Modulation)をゆっくりやってみたってことでしたね。前回は、最終的には25msec(くらい)の周期でOn/Off時のデューティーを変えていた訳ですが、ditialWrite()とdelay()を用いて出力のOn/Offを作っていましたので、時間方向をもっと細かく制御する事は難しそうです。
で、ネットで”Arduino PWM”とググってみると、まぁ、普通にありますよね、ArduinoでPWM制御する方法が。
簡単に言うと、analogWrite()を使って出力する方法です。この方法では、2msecを1周期として、1周期中のOn時間を0〜2msecで変化させられるというものです。デューティーは0〜255の数値で指定するので、2/256msecの分解能ということになります。
この方法だと、高い周波数(短い周期)で、On/Offのデューティーを変えて出力を制御できそうです。早速、前回のプログラムを改造してこのプログラムを作ってみました。
/* // the setup routine runs once when you press reset: // the loop routine runs over and over again forever: |
このプログラムのポイントは、出力をdigitalWrite()ではなく、analogWrite()で行っているところです。digitalWrite()は指定しているピンを単純にOn/Offしているだけですのが、analogWrite()はある周期の中でデューティーが0〜100%になるように(あたかもアナログ的に)周期的になOn/Offを繰り返すように出力しています。(やっていることはピンのOn/Offである事には変わりませんが、digitalWriteではできない短い周期でOn/Offを行っています)
上記のプログラムをTrinketに書き込んで動作させた時の、出力信号の状態はこんな感じでした。
ちゃんと2msec周期で、デューティーが少しずつ増減している事がわかります。
Trinket上のLEDもこんな感じでちゃんと滑らかに明滅します。
Trinket PWM Output 2 - YouTube
うまく使えば、何かの制御にも使えそうですね。
今回は、analogWriteを使ったごくごく基本的な事でしたが、もう少し、digitalWrite、analogWriteの辺で遊んでみたいと思います。