アフィリエイト広告
アフィリエイト広告

LED Cube 3x3x3 の回路とスケッチ

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 をオフする、という流れに変更しました。

  1. // LED-Cube_3x3x3 ver.1.21 2020.10.17 meyon
  2. // Pattern cycle (ms)
  3. unsigned long pcycle = 360;
  4. // Pattern data
  5. int ptn[][3] = {
  6. //{LayerA,LayerB,LayerC},
  7. // LayerA
  8.   {01,0,0},{03,0,0},{07,0,0},
  9.   {017,0,0},{037,0,0},{077,0,0},
  10.   {0177,0,0},{0377,0,0},{0777,0,0},
  11. // LayerB
  12.   {0,01,0},{0,03,0},{0,07,0},
  13.   {0,017,0},{0,037,0},{0,077,0},
  14.   {0,0177,0},{0,0377,0},{0,0777,0},
  15. // LayerC
  16.   {0,0,01},{0,0,03},{0,0,07},
  17.   {0,0,017},{0,0,037},{0,0,077},
  18.   {0,0,0177},{0,0,0377},{0,0,0777},
  19. // Sample
  20.   {0111,0111,0111},{0222,0222,0222},{0444,0444,0444},
  21.   {07,07,07},{070,070,070},{0700,0700,0700},
  22.   {0,0,0777},{0,0777,0},{0777,0,0},
  23.   {0505,0,0505},{020,0252,020},{0777,0777,0777},
  24. };
  25. int colpin[9] = {2,3,4,5,6,7,8,12,13}; // Column output pin
  26. int laypin[3] = {9,10,11}; // Layer output pin
  27. void setup() {
  28.   for (int i=0; i<9; i++){
  29.     pinMode (colpin[i], OUTPUT);
  30.   }
  31.   for (int i=0; i<3; i++){
  32.     pinMode (laypin[i], OUTPUT);
  33.   }
  34. }
  35. void loop() {
  36.   int nptn = sizeof(ptn) / sizeof(ptn[0]);
  37.   for (int k=0; k < nptn; k++){
  38.     unsigned long ctime = millis();
  39.     while (millis() - ctime < pcycle){
  40.       for (int j=0; j<3; j++){
  41.         for(int i=0; i<9; i++){
  42.           digitalWrite (colpin[i], ptn[k][j]>>i&1);
  43.         }
  44.         digitalWrite (laypin[j], HIGH);
  45.         delay(5);
  46.         digitalWrite (laypin[j], LOW);
  47.       }
  48.     }
  49.   }
  50. }

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() に戻ります。

タイトルとURLをコピーしました