こんばんは!
今回は、前回の記事「4×4×4のLEDキューブを作る(前編)」の続きとなります。
前回の記事はこちら
今回は配線とプログラミングになります。
今回の作品は
https://www.youtube.com/watch?v=2BlVUKW5hL0&t=107s
こちらの動画を参考にしています。
使用するもの
・Arduinoメインボード(https://amzn.to/2vkPIUH)
・USBケーブル(https://amzn.to/2UHhntl)
・ジャンパワイヤ (https://amzn.to/39uBU8T)
・LED64ヶ(https://amzn.to/2TvEPGc)
・抵抗100Ω(https://amzn.to/2CfF5SN)
・針金(https://amzn.to/2Fml1Cc)
・ビニール線(https://amzn.to/2RqnJx0)
・ユニバーサル基盤(https://amzn.to/2XHxFAY)
・工具:半田ごて、はんだ、ニッパー、グルーガン、ドリル、ラジオペンチ
手順
LEDキューブのそれぞれの縦棒とArduino nanoを下の写真の番号にならって接続します。
また、各層を下から層1、層2…層4します。
各層と、Arduino nanoは抵抗を挟んで
層 | Arduino nano |
層1 | A0 |
層2 | A1 |
層3 | A2 |
層4 | A3 |
のように接続します。
写真では全てビニール線で接続していますが、Arduinoは書き込みの際、A0,A1ピンには何も繋いではいけないのでA0,A1ピンとの接続はジャンパワイヤで取り外し可能な状態にしておくと、プログラム書き換えの時に便利なので変えておくといいと思います。
これでハード側は終了です。
次にコードを書いていきます。
Arduino IDEを起動して次のコードを書き込んでいきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | 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}; //initializing and declaring led rows 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の点滅を繰り返しているプログラムになります。
これをArduinoメインボードに書き込んで実際にプログラムが実行されていることを確認してみてください。
部屋を暗くしてやってみるのがおすすめです!
これまでの苦労が癒されますね(笑)
Youtubeに動画も載せましたのでそちらも是非ご覧ください。
まとめ
前編、後編とLEDキューブの作成をしてみました。
今回書いたコードは短めで簡単なものですが、アイデア次第でもっと素敵なイルミネーションができると思います。
前編・後編と読んでいただきありがとうございました。
ではまた!