「LED Cube 3x3x3 をケースに入れてみた」で使った 1年半ほど前に作った LED Cube ですが、回路とスケッチを見直してみました。
回路図
以前の回路から変更した点。
Layer の同時点灯を防ぐためのダイオードを廃止しました。
スケッチもほぼ完成していますし、Layer を同時に点灯させてしまうようなミスはしないでしょう、たぶん、ね (^_^;)
トランジスタのベース・エミッタ間抵抗を廃止しました。
なくてもとりあえず問題ないし、部品を減らしたかったってことで。
LED に流れる電流は約 6.4mA 。ダイナミック点灯はデューティー比 1/3 ですので、ひとつの LED あたり 2.1mA 相当になりますが、明るさとしては十分です。
ひとつの Column では 1 個の LED しか点灯しませんから、Arduino のピンの電流出力は問題ありません。
Layer あたりの電流は 57.6mA 。必要なベース電流を 1.5mA とするとベース抵抗は 2.9KΩ になります。
Arduino NANO を使用し、電源は USB から供給しています。
スケッチ
以前作ったスケッチですが、Layer をオンしてから Column のデータを送り、点灯時間だけ Delay() して消灯って流れになっています。これはちょっと違うよなぁ、と思います (^_^;)
ってことで、Column のデータを送ってから Layer をオンして、点灯させる時間 Delay() してから Layer をオフする、という流れに変更しました。
- // LED-Cube_3x3x3 ver.1.21 2020.10.17 meyon
- // Pattern cycle (ms)
- unsigned long pcycle = 360;
- // Pattern data
- int ptn[][3] = {
- //{LayerA,LayerB,LayerC},
- // LayerA
- {01,0,0},{03,0,0},{07,0,0},
- {017,0,0},{037,0,0},{077,0,0},
- {0177,0,0},{0377,0,0},{0777,0,0},
- // LayerB
- {0,01,0},{0,03,0},{0,07,0},
- {0,017,0},{0,037,0},{0,077,0},
- {0,0177,0},{0,0377,0},{0,0777,0},
- // LayerC
- {0,0,01},{0,0,03},{0,0,07},
- {0,0,017},{0,0,037},{0,0,077},
- {0,0,0177},{0,0,0377},{0,0,0777},
- // Sample
- {0111,0111,0111},{0222,0222,0222},{0444,0444,0444},
- {07,07,07},{070,070,070},{0700,0700,0700},
- {0,0,0777},{0,0777,0},{0777,0,0},
- {0505,0,0505},{020,0252,020},{0777,0777,0777},
- };
- int colpin[9] = {2,3,4,5,6,7,8,12,13}; // Column output pin
- int laypin[3] = {9,10,11}; // Layer output pin
- void setup() {
- for (int i=0; i<9; i++){
- pinMode (colpin[i], OUTPUT);
- }
- for (int i=0; i<3; i++){
- pinMode (laypin[i], OUTPUT);
- }
- }
- void loop() {
- int nptn = sizeof(ptn) / sizeof(ptn[0]);
- for (int k=0; k < nptn; k++){
- unsigned long ctime = millis();
- while (millis() - ctime < pcycle){
- for (int j=0; j<3; j++){
- for(int i=0; i<9; i++){
- digitalWrite (colpin[i], ptn[k][j]>>i&1);
- }
- digitalWrite (laypin[j], HIGH);
- delay(5);
- digitalWrite (laypin[j], LOW);
- }
- }
- }
- }
4 行目の数値はパターンが切り替わる時間です。
6 ~ 26 行はパターンのデータで 8 進数で表記しています。{ } 内の 3 つの値は順に Layer A 、Layer B 、Layer C で、頭の 0 は 8 進数を表しています。データは 000 ~ 777 の 8 進数で、たとえば 777 ならばひとつの Layer の 9 個の LED が全て点灯、505 ならば四隅の LED が点灯、{0777,0777,0777} で 27 個全部が点灯します。
28 ~ 29 行で出力ピンを指定し、setup() でそれぞれを出力モードに設定しています。
46 ~ 48 行で、9 本の Column にパターンデータにしたがって HIGH 、LOW の値を出力します。データを送ったら Layer をオンにし、5ms 点灯させてからオフします。
この処理を 45 行の for() 文で各 Layer で順番に実行します。1 つの Layer で 5ms 点灯させますから、1 周期は 15ms 、デューティー比 1/3 になります。
47 行目で各出力ピンの HIGH 、LOW を、次の式で決定しています。
ptn[k][j]>>i&1
[ k ] 番目のパターンの Layer [ j ] の値を、たとえば 505 ( 8 進数) とすると 2 進数では 101000101 となります。これの [ i ] 番目の桁を 1 と AND 演算して、結果が 0 ならば出力ピンは LOW 、1 ならば HIGH に設定されます。
44 行の while() 文で Column と Layer の処理をパターン切り替えの時間だけ繰り返したら、42 行の for() 文で次のパターンに移行させます。パターンの数は 41 行で算出しています。
全てのパターンを処理し終わったら、loop() に戻ります。