4個並べて1個づつLチカ【マイコンLチカ道場 Arduino編 0-3】

LEDを4個並べて1個づつ点灯させる Arduino
当サイトのリンクにはアフィリエイト広告が含まれています。
スポンサーリンク

はじめに

このページは「マイコンLチカ道場 Arduino編」の「0-3:4個並べて1個づつLチカ」に対応するページです。Lチカの複数点滅をさらに応用して動作させてみます。今回は、for文を使ったプログラムでも動作させてみました。

スポンサーリンク

回路図と接続図

今回はさらにLEDを10番、9番ピンに2個追加して合計4個にしました。手持ちの赤色LEDは暗かったので、全部青色LEDとしました。電流制限抵抗は220Ωです。

回路図
回路図
ブレッドボード接続イメージ
ブレッドボード接続イメージ

プログラムを書いてみる

早速プログラムを書いてみました。前回と同じノリで出力ピン数を増やしていくだけで、簡単に動作させることができました。
※調子に乗ってウェイト時間(500ミリ秒)もconst intで定数として設定しました。

const int LED1 = 12;
const int LED2 = 11;
const int LED3 = 10;
const int LED4 = 9;
const int wait = 500;

void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);  
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
}

void loop() {
  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, LOW);
  delay(wait);                       // wait for a second
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, LOW);
  delay(wait);                       // wait for a second
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, HIGH);
  digitalWrite(LED4, LOW);
  delay(wait);                       // wait for a second
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, HIGH);
  delay(wait);                       // wait for a second
}

上記のプログラムでも問題なく動作しますが、LEDが増えていく度にプログラムが長くなったり、変更箇所が多くなったりとあまりスマートではないですね。

なので、他のやり方を試してみました。下記はfor文を使った例です。これでも全く同じ動作が出来るので、かなりプログラムが短くなりましたね。

void setup() {
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);  
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
}

void loop() {
  for (int i=12; i>=9; i--)  //左から順に点灯
//  for (int i=9; i<=12; i++)  //右から順に点灯
  {
    digitalWrite(i, HIGH);
    delay(500);                       // wait for a second
    digitalWrite(i, LOW);
//  delay(10);                       // wait for a second
  }
}

初めのプログラムと同様にconst intでLEDピン名を設定していても動きますが、逆に長くなるし分かりにくいかと思って今回は消しています。

LEDを4個並べて1個づつ点灯させる
動作時の写真

簡単な動作説明としては、i=12から、ループ毎にiを1づつ減らす。減らすのは9まで。現在のiの値(すなわちLEDを接続しているピン番号)をdigitalWrite命令でHIGHにしてLEDを点灯させ、ウェイト時間分待機、次はLOWにしてLEDを消灯させ、ループの初めにもどる。という感じです。

コメントアウトしている「// for (int i=9; i<=12; i++) //右から順に点灯」に入れ替えることで、右がわから順番にLチカさせることが出来ます。
また、最後の「// delay(10);」を有効にすることで、LEDが全部消えている時間を差し込むことが出来ます。これをはじめのプログラムでやろうとすると、更に行数が2倍になります。
今回のfor文を使ったプログラムのほうが、いろいろと応用が効いて便利そうですね。

下記は点灯時間450ms、消灯時間50msとして動かしてみたときのLED両端の電圧波形をそれぞれオシロスコープで見てみました。※4チャンネルのオシロスコープが久々に役立ちました。
4つのLEDが順番にONしているのがわかります。また、点灯の合間に50msの全部消えている時間がちゃんと挿入されていることがわかります。

4つのLED点灯時の波形
動作時の波形

また、LED点灯時のウェイト時間を2ms辺りまで短くすると、私の目では4つ全部点灯しているように見えます。これがLEDのダイナミック点灯というやつでしょうか。これを応用した7セグメントLEDのドライバICの基板を作ってみたので、興味があれば下記をご覧ください。

まとめ

4個のLEDを並べて1個づつLチカさせることに成功しました。また、for文を使ったプログラムでの動作も確認できました。次は、スイッチなどの外部入力を使用して、引き続きもっと難しいLチカに挑戦していきましょう。

このページの実験は下記の製品で試すことが出来ます。
タイトルとURLをコピーしました