3x3x3 LEDキューブ

LEDキューブは、ネットで見た動画から作ってみたくなりました。
現物は、手元に無いので後程ということで・・・

プログラムを公開します。

#include <MsTimer2.h>  //  タイマー用
int L[27];
byte A;
byte B;
//アニメパターンを用意
boolean buf[23][9]={
 {1,0,0,
  0,0,0,
  0,0,0,},
 {1,1,0,
  0,0,0,
  0,0,0,},
 {1,1,1,
  0,0,1,
  0,0,0,},
 {0,0,1,
  0,0,1,
  0,0,1},
 {1,1,1,
  0,0,1,
  0,1,1,},
 {1,1,1,
  0,0,1,
  1,1,1,},
 {1,1,1,
  1,0,1,
  1,1,1},
 {0,1,0,
  1,1,1,
  0,1,0,},
 {0,0,0,
  0,1,0,
  0,0,0,},
 {1,0,1,
  0,1,0,
  1,0,1},
 {1,1,1,
  1,1,1,
  1,1,1,},
 {1,0,0,
  1,0,0,
  1,0,0,},
 {0,1,0,
  0,1,0,
  0,1,0},
 {0,0,1,
  0,0,1,
  0,0,1,},
 {0,1,0,
  0,1,0,
  0,1,0,},
 {1,0,0,
  1,0,0,
  1,0,0,},
 {0,1,0,
  0,1,0,
  0,1,0,},
 {0,0,1,
  0,0,1,
  0,0,1,},
 {0,0,0,
  0,0,1,
  0,0,0,},
 {0,0,0,
  0,1,0,
  0,0,0,},
 {0,0,0,
  1,0,0,
  0,0,0},
 {1,0,0,
  1,0,0,
  1,0,0,},
 {1,1,1,
  0,0,0,
  1,1,1,}
};
const int anode[9] = {2,3,4,5,6,7,8,9,10};
const int cathode[3] = {14,15,16};

void setup()   {                
 //LEDCUBEに繋がっているpinをOUTPUTに設定
   for(int i=0;i<9;i++){ 
     pinMode(anode[i],OUTPUT);
   }
   for(int i=0;i<3;i++){ 
     pinMode(cathode[i],OUTPUT);
   }
       pinMode(13,OUTPUT);
 MsTimer2::set(5, leddisp);
 MsTimer2::start();
}

void loop()   {
     digitalWrite(13, HIGH);
 allon();
 alloff();
 anime();
       digitalWrite(13, LOW);
 order();
 anime2();
 anime3();
 RandLED();
 
   }  //  loop END


void leddisp() {    // 表示ルーチン
        A++;
        if (A > 2 ){ A=0;}
     digitalWrite(14, LOW);
     digitalWrite(15, LOW);
     digitalWrite(16, LOW);

     for (int C = 0 ; C<9 ; C++){
         digitalWrite((C+2) , L[(A*9+C)]);    //   set the LED
     digitalWrite((A + 14), HIGH);
     }
   }

void allon(){      //  ぜんぶON

 for (int C = 0 ; C<27 ; C++) {
   L[C]=1 ;
 }
     delay(500);
}

void alloff(){    //  全部OFF

 for (int C = 0 ; C<27 ; C++) {
   L[C]=0 ;
 }
}

void anime(){      // buf 内容点灯を順次表示

for(int Z=0;Z<23;Z++){
 for (int X=0;X<3;X++){
   for (int Y=0;Y<10;Y++){
     L[X*9+Y]=buf[Z][Y];
     }
   }
     delay(200);
 }
}

void anime2(){      // 回転
byte M[8]={0,9,18,21,24,15,6,3};
 for (int C =20;C>0;C--){
 for(int Z=0;Z<9;Z++)
   {
   alloff();
   L[M[Z]]=1;
   L[M[Z]+1]=1;
   L[M[Z]+2]=1;
   delay(5*C);
     }
   }
}
void anime3(){      // 回転
byte M[8]={0,1,2,11,20,19,18,9};
 for (int C =20;C>0;C--){
 for(int Z=0;Z<9;Z++)
   {
   alloff();
   L[M[Z]]=1;
   L[M[Z]+3]=1;
   L[M[Z]+6]=1;
   delay(5*C);
     }
   }
}
void order(){
 //順次点灯  
 for (int C = 0 ; C<27 ; C++) {
   L[C]=1 ;

   delay(10);
   L[C]=0;
 }
}

void RandLED(){
 for (int C=0 ; C< 100;C++){
     L[random(27)]=1; // 0から299の乱数を生成
     L[random(27)]=0;
     delay(20);
 }
}


|新しいページ|検索|ページ一覧|RSS|@ウィキご利用ガイド | 管理者にお問合せ
|ログイン|