Soraken’s Style

つれづれ

TrinketでLEDの続き

 前回(Trinketと外部電源)やったことは、結局のところ、PWM(Pulse Width Modulation)をゆっくりやってみたってことでしたね。前回は、最終的には25msec(くらい)の周期でOn/Off時のデューティーを変えていた訳ですが、ditialWrite()とdelay()を用いて出力のOn/Offを作っていましたので、時間方向をもっと細かく制御する事は難しそうです。

 

 で、ネットで”Arduino PWM”とググってみると、まぁ、普通にありますよね、ArduinoPWM制御する方法が。

 簡単に言うと、analogWrite()を使って出力する方法です。この方法では、2msecを1周期として、1周期中のOn時間を0〜2msecで変化させられるというものです。デューティーは0〜255の数値で指定するので、2/256msecの分解能ということになります。

この方法だと、高い周波数(短い周期)で、On/Offのデューティーを変えて出力を制御できそうです。早速、前回のプログラムを改造してこのプログラムを作ってみました。

/*
PWM Pulse Test
*/

// Pin 1 has an LED connected on most Arduino boards.
// give it a name:
int led = 1;
int i = 0;
int tim = 1;

// the setup routine runs once when you press reset:
void setup() {
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  analogWrite(led, i);
  delay(1); // wait for a second
  i = i + tim;
  if (i > 255)
  {
    tim = -1;
    i = 254;
  }
  else if (i < 0)
  {
    tim = 1;
    i = 1;
  }
}

 

 このプログラムのポイントは、出力をdigitalWrite()ではなく、analogWrite()で行っているところです。digitalWrite()は指定しているピンを単純にOn/Offしているだけですのが、analogWrite()はある周期の中でデューティーが0〜100%になるように(あたかもアナログ的に)周期的になOn/Offを繰り返すように出力しています。(やっていることはピンのOn/Offである事には変わりませんが、digitalWriteではできない短い周期でOn/Offを行っています)

 

上記のプログラムをTrinketに書き込んで動作させた時の、出力信号の状態はこんな感じでした。


Trinket PWM Output - YouTube

ちゃんと2msec周期で、デューティーが少しずつ増減している事がわかります。

Trinket上のLEDもこんな感じでちゃんと滑らかに明滅します。


Trinket PWM Output 2 - YouTube

うまく使えば、何かの制御にも使えそうですね。

今回は、analogWriteを使ったごくごく基本的な事でしたが、もう少し、digitalWrite、analogWriteの辺で遊んでみたいと思います。