ブレスマイルクリア(歯磨き粉)

 

■LED Cube 3x3x3 を作ってみた - Arduino スケッチ

LED Cube 3x3x3 を制御する Arduino のスケッチです。

 

// Pattern data
int ptn[][3] = {
//{LayerA,LayerB,LayerC},
    {0525,0252,0525},
    {0252,0525,0252},
    {0525,0252,0525},

    {0777,0000,0777},
    {0070,0777,0070},
    {0707,0707,0707},

    {0272,0272,0272},

    {0555,0555,0555}

 };

 

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() {
    unsigned long pcycle = 600;    // Pattern cycle (ms)

 

    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++){
                digitalWrite (laypin[j], HIGH);
                for(int i=0; i<10; i++){
                    digitalWrite (colpin[i], ptn[k][j]>>i&1);
                }
                for(int i=0; i<10; i++){
                    digitalWrite (colpin[i], LOW);
                }
                digitalWrite (laypin[j], LOW);
            }
        }
    }
}

 

点灯パターンを ptn[][3] に定義しています。

 

LED9 LED6 LED3
LED8 LED5 LED2
LED7 LED4 LED1

 

例えば「0525」では、最初の「0」が 8 進数であることを示し、次の 3 桁が点灯パターンを表しています。初めの「5」は LED9と LED7 を、次の「2」は LED5 を、最後の「5」は LED3 と LED1 を点灯させることを意味しています。これは 2 進数の「101010101」ですので、「0b101010101」と書いてもかまいません。ただし「B101010101」という書き方では 8 ビットしか扱えないようなのでコンパイルエラーになります。

同様に 10 進数でもよいので、「341」であれば LED9、7、5、3、1 が点灯します。ちなみに「0341」は 8 進数なので LED8、7、6、1 が点灯することになります。まぁ 10 進数では直感的にわからないですね (^_^;) 俺は 8 進数表記がわかりやすいです。

ひとつの { } 内の最初の数値が Layer A 、次が Layer B、最後が Layer C に対応するので、{ } が一つの点灯パターンになります。パターンは何行でも、変数メモリがある限り増やせます。

 

この ptn 配列変数をもとにして

 

    for(int i=0; i<10; i++){
        digitalWrite (colpin[i], ptn[k][j]>>i&1);
    }

 

でコラムの 9 列の LED の点灯を制御します。変数 j でレイヤを切り替えて、一つの点灯パターンを完成させています。

そして変数 k の数だけパターンを変化させていきます。ptn の行数は定義していないので、

 

     int nptn = sizeof(ptn) / sizeof(ptn[0]);

 

で行数を算出します。

一つのパターンの表示時間は pcycle で定義してあり、タイマーが  pcycle を超えると次のパターンへ移行します。

 

    unsigned long ctime = millis();
    while (millis() - ctime < pcycle){

        ︙

    }

 

って感じです。

 


コメント
コメントする








   
この記事のトラックバックURL
トラックバック

■calendar

S M T W T F S
   1234
567891011
12131415161718
19202122232425
262728293031 
<< May 2019 >>

■search this site.

■recommend

毎日貯まるポイントサイト ECナビ

■recommend

* 楽天ROOM *

■Twitter

■recommend

■recommend

■selected entries

■categories

■archives

■recent comment

■recent trackback

■links

■profile

■others

■mobile

qrcode

■powered

無料ブログ作成サービス JUGEM