シフトレジスタを用いたLEDのスタティック点灯

ダイナミック点灯方式の問題点

まずはこちらの動画をご覧ください。

動画1 LEDキューブ

以前3 × 3 × 3のLEDキューブを作成した際は、少ないI/OポートでLEDの複数制御を行うために、ダイナミック点灯方式を採用していました。

ダイナミック点灯方式とは、それぞれのLEDにおいて、一瞬電流を流して止めることを順に繰り返すことで、複数のLEDが同時に光っているように見える点灯方式のことです。常に1つのLEDのみを点灯させれば良いので、I/Oポートが少ない場合でも多くのLEDを複数制御できます。

LEDキューブでは、LEDの複数制御は実現できましたが、点灯させるLEDの個数が増加すると、それに伴いLED一つあたりに電流を流す時間が短くなってしまうので、LEDの輝度が暗くなってしまいました。(動画だと分かりづらかったですが......)

つまり、LED 1つのみを点灯させたときは明るく、複数点灯させた場合はLEDの個数に伴い暗くなってしまうのです。

スタティック点灯方式

スタティック点灯方式を用いれば、点灯するLEDの個数が変化した際も、常にすべてのLEDに電流を流すため、LEDの輝度は変化しません。

ただスタティック点灯方式において、LEDの個数分のI/Oポートが必要なため、1つのマイコンでは、I/Oポートの個数分のLEDしか点灯させることができません。

そこで、シフトレジスタというICを用いることで、制御するLEDを増やそうと思います。

シフトレジスタ

シフトレジスタは、シリアルで受信したデジタルデータをパラレルに変換して出力させることができるICです。イメージとしては図1のようになります。

例えばArduinoから8bitの10011101という信号をシリアルで送信した場合、シフトレジスタはそれをパラレルに変換して、それぞれのピンから出力します。(図1では、1でLEDが点灯し、0でLEDが消灯するとしています。)

つまりシフトレジスタを用いれば、Arduinoの1つのI/Oポートで複数のLEDの点灯を同時に制御できるのです。厳密にはクロックやラッチの信号が必要なため、Arduinoは3つのI/Oポートを使っています。

図1 シフトレジスタの特徴

シフトレジスタの動作確認

回路

今回はArduino UNOと2つのシフトレジスタ(74HC595)を用いて、16個のLEDの点灯を制御しようと思います。

回路図を図2に示します。1つ目の74HC595のQH'を2つ目の74HC595のSERに接続します。

図2 Arduino Unoとシフトレジスタ74HC595の配線図

https://www.suigyodo.com/online/schsoft.htm

水魚堂の回路図エディタ

実際の配線は図3のようになります。ブレッドボードを用いて簡易的に回路を作りました。

図3 実際の配線

プログラム

今回は16個のLEDを以下のパターンで点灯させるプログラムを作成しました。

  • 上側のシフトレジスタに関して、点灯するLEDの個数が1→2→3→4→1→2→3→4と変化していく
  • 下側のシフトレジスタに関して、点灯するLEDの個数が1→2→3→4→1→2→3→4と変化していく
const int SER   =  13;
const int RCLK =  12;
const int SRCLK   = 11;

//1つ目のシフトレジスタに接続されるLEDの点灯パターン
int SHIFT_1[] = {
  B10000000, 
  B11000000, 
  B11100000,
  B11110000,
  B00001000,
  B00001100,
  B00001110,
  B00001111,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  };

//2つ目のシフトレジスタに接続されるLEDの点灯パターン
  int SHIFT_2[] = {
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B10000000, 
  B11000000,
  B11100000,
  B11110000,
  B00001000,
  B00001100,
  B00001110,
  B00001111
  };

//各ピンをアウトプットに設定
void setup() {
  pinMode( SER, OUTPUT );
  pinMode( RCLK, OUTPUT );
  pinMode( SRCLK, OUTPUT );
}

void loop() { 
  for(int i = 0; i < 16; i++){
    digitalWrite(RCLK, LOW);
    shiftOut(SER, SRCLK, LSBFIRST, SHIFT_1[i]);
    shiftOut(SER, SRCLK, LSBFIRST, SHIFT_2[i]);
    digitalWrite(RCLK, HIGH);
    delay(1000);
  }
}

実験

実際に点灯させてみた動画がこちらです。

シフトレジスタを用いて、16個のLEDの点灯を制御しています。LED用の電源を別に用意して、シフトレジスタを増やしていけば、どんどんLEDの個数を増やしていくことができます。

動画2 シフトレジスタ動作確認

まとめ

ダイナミック点灯方式ではLEDの個数によって、輝度が変化してしまいましたが、シフトレジスタを用いたスタティック点灯方式を用いることによって、複数のLEDを輝度を変化させること無く制御できることが確認できました。

コメントを残す

メールアドレスが公開されることはありません。