(4×4×4のLEDキューブを作る

 今回は、4×4×4のLEDキューブを作っていきたいと思います。

材料は、

・5㎜発光ダイオード        ×64個

・130x250mmユニバーサル基板   ×1枚

・arduino uno           ×1個

・ジャンパ線            ×20本

・針金               ×1個

・工具:半田ごて、はんだ、ニッパー、グルーガン、ドリル、ラジオペンチ etc

 

手順は、書くのに時間がかかるので今回は、プログラミングのところを

重点的にやっていきたいと思います。

 

 

もともとはこのようになっているはずなのですが、下から配線すると

やりにくかったので上からジャンパ線で配線することにしました。

配線は、このようにします。

 

各層との接続は、下から1層、2層、3層、4層とすると

arduinoとの接続は、このようになります。

 

それでは、ソースコードを書いていきましょう。

 

int layer[4] = {A3, A2, A1, A0}; //initializing and declaring led layers

int column[16] = {13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, A5, A4}; 

 

void setup()

{

 

  for (int i = 0; i < 16; i++)

  {

    pinMode(column[i], OUTPUT);  //setting rows to ouput

  }

 

  for (int i = 0; i < 4; i++)

  {

    pinMode(layer[i], OUTPUT);  //setting layers to output

  }

 

  randomSeed(analogRead(0));  //seeding random for random pattern

}

 

void loop()

{

  allOff();

  flickerOn();

  randomflicker();

  delay(2000);

}

 

 

//turn all off

void allOff()

{

  for (int i = 0; i < 16; i++)

  {

    digitalWrite(column[i], LOW);

  }

  for (int i = 0; i < 4; i++)

  {

    digitalWrite(layer[i], LOW);

  }

}

 

//turn all on

void allOn()

{

  for (int i = 0; i < 16; i++)

  {

    digitalWrite(column[i], LOW);

  }

  //turning on layers

  for (int i = 0; i < 4; i++)

  {

    digitalWrite(layer[i], HIGH);

  }

}

//flicker on

void flickerOn()

{

  int i = 150;

  while (i != 0)

  {

    allOn();

    delay(i);

    allOff();

    delay(i);

    i -= 5;

  }

}

 

//random flicker

void randomflicker()

{

  allOff();

  int x = 10;

  for (int i = 0; i != 750; i += 2)

  {

    int randomLayer = random(0, 4);

    int randomColumn = random(0, 16);

 

    digitalWrite(layer[randomLayer], HIGH);

    digitalWrite(column[randomColumn], LOW);

    delay(x);

    digitalWrite(layer[randomLayer], LOW);

    digitalWrite(column[randomColumn], HIGH);

  }

}

 

 

このコードを説明すると

まず
int layer[4] = {A3, A2, A1, A0};
int column[16] = {13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, A5, A4};

は各層と縦棒がArduino nanoのどのピンと接続をしているかを示しています。

次にsetup()内では最初に定義したピンが全てOUTPUTであるということを示し、
randomSeed(analogRead(0));
random関数を使う際に必要なものです。
random関数は乱数を生成する関数ですが、Arduinoを起動した後、一旦乱数を生成してしまうと、その数値がArduinoを再起動したあとも同じで固定になってしまいます。randomSeed関数により、毎回違う乱数を生成することができるのです。

次にloop()内では

allOff();
flickerOn();
randomflicker();

と3つのメソッドの呼び出しを行っています。
まず、allOff()から見ていきます。

for (int i = 0; i < 16; i++) {
digitalWrite(column[i], LOW);
}
for (int i = 0; i < 4; i++) {
digitalWrite(layer[i], LOW);
}

となっており、全ての層と縦棒がLOWになっておりどこにも電気が流れてない状態になっています。
名前の通り、全てのLEDがOFFの状態になっています。

次にflickerOn()を見ますと、
int i = 150;
while (i != 0) {
allOn();
delay(i);
allOff();
delay(i);
i -= 5;
}

となっています。
allOn()は先ほどのallOff()と反対に全てのLEDがONの状態になっていることを示します。
ここではwhile文を使って最初に設定したi = 150が0になるまで繰り返し、LEDのON/OFFを繰り返しています。
最後の文のi -= 5により徐々にON/OFFの間隔が短くなっています。
これが0になるまで繰り返されるので計30回ON/OFFを繰り返しています。

最後にrandomflicker()を見ていきます。
allOff();
int x = 10;
for (int i = 0; i != 750; i += 2) {
int randomLayer = random(0, 4);
int randomColumn = random(0, 16);
digitalWrite(layer[randomLayer], HIGH);
digitalWrite(column[randomColumn], LOW);
delay(x);
digitalWrite(layer[randomLayer], LOW);
digitalWrite(column[randomColumn], HIGH);
}

まず、random関数によって各層と縦棒のうち1つをランダムで選択し、10ミリ秒点灯させ、その後OFFにするということをfor文によって繰り返しています。

つまり、このプログラムは
全てのLEDの点滅→任意のLEDの点滅を繰り返しているプログラムになります。

 

完成したものがこちら

配線を上にしたので配線が見えて気になるのですが綺麗です。

LEDキューブ本体は、半年前くらいに作ったことがあるのですが、その時は、

arduino nano でやってソースコードのインクルードができなくて使えなくて

あきらめていたのですがarduino uno が余っていたのでarduino unoで作りました。

 

参考サイト

4×4×4のLEDキューブを作る(前編) | 物を作る者 (novicengineering.com)

4×4×4のLEDキューブを作る(後編) | 物を作る者 (novicengineering.com)

How to Make a LED Cube at Home - YouTube