#014 【49歳から始めるArduino -黒帯を目指す】黄帯編3 PWMについて学ぶ


 教科書のp62、明るさの調整です。LEDの点灯している極端に時間を短くすると、まるで明るさを調整しているように見えます。高橋先生の説明が非常にわかりやすいです。まずはp62のスケッチを書き写し、delayの数値を書き換え、実感してみてください。delayで今利用している数値はmSで1/1000秒の単位です。仮にもっと小さい単位で実行したい場合、少数にしてみてください。例えば1から0.1にです。随分と弱く光っていますね(あとで出てきますが、少数点を含む数値は扱いが違ったりするので、定義をしてあげないといけなくなってきますが、今はこのまま行きましょう)。

 PWMの原理は教科書通りです。digitalWriteの代わりにanalogWriteを利用して、ON/OFF出なく、数値で管理できるのが特徴です。教科書では4つのスケッチ例があります。繰り返しを利用して、同じことを実現させるの異なるスケッチとなっています。今回利用しるfor構文による繰り返しは、よく利用します。教科書のp277に追加説明がありますので、一読しておくといいですね。今は「ああなるほどね」という理解でいいと思います。

 7つのLEDを並べでこちらのスケッチを実行すると、PWM制御の出来ない一つの赤色LEDを除き、徐々に全てのLEDが明るくなります。その間、ひとつの赤色LEDつきっぱなしです。一旦、最光度に達すると一つの赤色LEDは消灯し、他のLEDは段々と暗くなってきます。全LEDが消灯すると一呼吸置いてまた繰り返します。

// PIN12 Digital
#define LED_PIN_WHITE  3
#define LED_PIN_GREEN  4
#define LED_PIN_YELLOW 6
#define LED_PIN_RED1   9
#define LED_PIN_RED2  10
#define LED_PIN_RED3  11
#define LED_PIN_RED4  12

// deleyの時間をここで一括調整
#define FADE_TIME 3

void setup()
{
  // pinModeの設定OUTPUT:
pinMode(LED_PIN_WHITE, OUTPUT);
pinMode(LED_PIN_GREEN, OUTPUT);
pinMode(LED_PIN_YELLOW, OUTPUT);
pinMode(LED_PIN_RED1, OUTPUT);
pinMode(LED_PIN_RED2, OUTPUT);
pinMode(LED_PIN_RED3, OUTPUT);
pinMode(LED_PIN_RED4, OUTPUT);
}

void loop()
{
  //Define i、j as int
  int i,j;

  // Change i from 0 to 255
  for (i=0;i<256;i++)
  {
  //全てのLEDをPWMのi値にする
  analogWrite(LED_PIN_WHITE, i);
  delay(FADE_TIME);
  analogWrite(LED_PIN_GREEN, i);
  delay(FADE_TIME);
  analogWrite(LED_PIN_YELLOW, i);
  delay(FADE_TIME);
  analogWrite(LED_PIN_RED1, i);
  delay(FADE_TIME);
  analogWrite(LED_PIN_RED2, i);
  delay(FADE_TIME);
  analogWrite(LED_PIN_RED3, i);
  delay(FADE_TIME);
  digitalWrite(LED_PIN_RED4, HIGH);
  delay(FADE_TIME);
  }

   // Change i from 255 to 0
  for (j=255;j>-1;j--)
  {
  //全てのLEDをPWMのj値にする
  analogWrite(LED_PIN_WHITE, j);
  delay(FADE_TIME);
  analogWrite(LED_PIN_GREEN, j);
  delay(FADE_TIME);
  analogWrite(LED_PIN_YELLOW, j);
  delay(FADE_TIME);
  analogWrite(LED_PIN_RED1, j);
  delay(FADE_TIME);
  analogWrite(LED_PIN_RED2, j);
  delay(FADE_TIME);
  analogWrite(LED_PIN_RED3, j);
  delay(FADE_TIME);
  digitalWrite(LED_PIN_RED4, LOW);
  delay(FADE_TIME);
  }

//点灯消灯のサイクルが1回終わると、一呼吸おく。これが韻を呼ぶ
delay(500);
}


 ここで気づいたことがありました。緑のLEDの点灯の仕方が他のLEDと比較しておかしいのです。他のが付いている状態でも、緑LEDが付きません。簡単なスケッチを書いて、analogWriteでどの数値で緑LEDが点灯するか確認してみると128以上で点灯でした。他のLEDを点灯させているのは、同様の値での点灯確認のためです。こうしてテストをしてみるとLEDにも個体差があるのがわかります。

void setup() {
  // put your setup code here, to run once:
pinMode(4, OUTPUT);
pinMode(3, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
analogWrite(4,128);
analogWrite(3,128);
}

 PWMを理容した身近な例ではPCのファンがあります。CPUの温度が上がれば、回転数も上がって行くという例です。この場合、温度センサーが必要になります。またモーターの種類によって異なるのですが、モーター利用の場合はノイズの発生減となるでの、コンデンサーをつけたり、また停止時に逆方向に過電流が流れる可能性があるのでダイオードを入れて、電気が逆方向に流れないようにしないといけません。モーターを利用したArduinoで時々Arduinoがいってしまうのだが原因がわからなかった生徒がいた話をしてくれました。いつも発生するわけでもないので、原因不明だったそうですが、ダイオードをつけたら発生しなくなったそうです。

 2つのボードを固定する台を、ダンボールを利用して作ってみました。勧めらたABCプレートは864円することと、固定すればいいだけなので、ダンボールを使ってみました。固定してみると、やっぱり便利です。セロテープとノリでの接着ですの、機会があればホットボンドガンを買って作り直したいと思います。


#013 【49歳から始めるArduino -黒帯を目指す】黄帯編2 ブレッドボードを利用してLチカ倍出し
#015【49歳から始めるArduino -黒帯を目指す】黄帯編4 PWMでLチカ4倍出し

コメント