「LED Cube」の編集履歴(バックアップ)一覧はこちら

LED Cube」の最新版変更点

追加された行はこの色になります。

削除された行はこの色になります。

 LED Cubeを作る
 
 まずは3x3x3。
 
 #image(KC3A0072.jpg,width=320,height=240)
 #image(KC3A0073.jpg,width=320,height=240)
 #image(KC3A0074.jpg,width=240,height=320)
 #image(KC3A0075.jpg,width=240,height=320)
 #image(KC3A0076.jpg,width=240,height=320)
 
 横にあるmega328pは[[激安Arduinoの作り方2]]の方法で内蔵RC8MHzで動くArduino化されています。
 ブレッドボードに挿したFT232RLから電源/GND/TX/RX/RESETをつなぐとArduinoIDEからスケッチを書き込めます。
 
 &youtube(http://www.youtube.com/watch?v=TVklCFiaTwU){425,350}
 &youtube(http://www.youtube.com/watch?v=9xbNGZXyoeY){425,350}
-
-
 
 電池をつなげば単体で動作OK。
-
-
-
-
-
+パスコンもリセットのプルアップも無いいい加減なものですが。
 
 
 *LED Cubeのスケッチ
 
 #highlight(c){{
 void setup()
 {
   for(int n=2; n<=13; n++){
     pinMode(n, OUTPUT);
     digitalWrite(n, HIGH);
   }
 }
 
 int layers[3];
 char pattern = 0;
 
 #define XY_PIN0 2
 #define XY_ON(l)     digitalWrite(XY_PIN0+l,    HIGH);
 #define XY_OFF(l)    digitalWrite(XY_PIN0+l,    LOW );
 
 #define LAYER_PIN0 11
 #define LAYER_ON(l)  digitalWrite(LAYER_PIN0+l, LOW );
 #define LAYER_OFF(l) digitalWrite(LAYER_PIN0+l, HIGH);
 
 #define nop() __asm("nop");
 
 void loop()
 {
   static int loop_count = 0;
   loop_count++;
 
   pattern = millis()/1000 / 20 % 4 +1;
 
   switch(pattern){
 //  case 0: pattern_0(); break;
   case 1: pattern_1(); break;
   case 2: pattern_2(); break;
   case 3: pattern_3(); break;
   case 4: pattern_4(); break;
 /*
   case 5: pattern_5(); break;
   case 6: pattern_6(); break;
   case 7: pattern_7(); break;
 */
   }
 
   led_dynamic_drive();
 }
 
 // ---------------------------------------------------
 // OFF
 void pattern_0(void)
 {
   layers[0] = 0x000;
   layers[1] = 0x000;
   layers[2] = 0x000;
 }
 
 // ---------------------------------------------------
 // 
 void pattern_1(void)
 {
   static int wait = 0;
   if(wait++<200){ return; }
   wait = 0;
 
   static int counter = 0;
   counter = (counter+1)%27;
   layers[0] = 0x000;
   layers[1] = 0x000;
   layers[2] = 0x000;
   layers[counter/9] = 1<<(counter%9);
 }
 
 // ---------------------------------------------------
 // 2
 void pattern_2(void)
 {
   static int wait = 0;
   if(wait++<200){ return; }
   wait = 0;
 
   char tbl[] = {0,1,2,5,8,7,6,3};
   static int counter = 0;
   counter = (counter+1)%(4*8);
   layers[0] = 0x000;
   layers[1] = 0x000;
   layers[2] = 0x000;
   int l = counter/8;
   if(l==3){ l = 1; }
   layers[l] = 1<<(tbl[((counter)%8)]);
 }
 
 
 // ---------------------------------------------------
 // 3
 void pattern_3(void)
 {
   static int wait = 0;
   if(wait++<200){ return; }
   wait = 0;
 
   layers[0] = 0x000;
   layers[1] = 0x000;
   layers[2] = 0x000;
   for(int i=0; i<3; i++){
     int n = random(0, 27);
     int l = n/9;
     layers[l] = 1<<(n%9);
   }
 }
 
 // ---------------------------------------------------
 // 4
 void pattern_4(void)
 {
   static int wait = 200;
   if(0 < wait--){ return; }
   static double xt_a = 0;
   static double xt_b = 0;
   if(xt_a==0){
     xt_a = 0.1+analogRead(0)/1500;
     xt_b = 0.2+analogRead(0)/1500;
   }
   xt_a = yuragi(xt_a);
   xt_b = yuragi(xt_b);
   wait = 30 + (int)(200*xt_a) + (int)(50*xt_b);
 
   layers[0] = 0x000;
   layers[1] = 0x000;
   layers[2] = 0x000;
 
   static char pos[] = {0,0,0};
   static char state = 0;
   static char dir = 0; // 012=xyz 
   static char vel = 0;
   
   switch(state){
   case 0:
     dir += random(1,3);
     dir = dir%3;
     if(pos[dir] == 0){
       vel = +1;
     }else{
       vel = -1;
     } 
     state = 1;
     break;
   case 1:
     state = 0;
     break;
   }
   pos[dir] += vel;
 
   layers[pos[2]] = 1<<(pos[0]+pos[1]*3);
 }
 
 // ---------------------------------------------------
 // 5
 void pattern_5(void)
 {
   static int wait = 200;
   if(0 < wait--){ return; }
   static double xt = 0;
   if(xt==0){
     xt = 0.1+analogRead(0)/1500;
   }
   xt = yuragi(xt);
   wait = 20 + (int)(300*xt);
 
   layers[0] = 0x000;
   layers[1] = 0x000;
   layers[2] = 0x000;
 
   static char pos[] = {0,0,0};
   static char state = 0;
   static char dir = 0; // 012=xyz 
   static char vel = 0;
   
   switch(state){
   case 0:
     dir += random(1,3);
     dir = dir%3;
     if(pos[dir] == 0){
       vel = +1;
     }else{
       vel = -1;
     } 
     state = 1;
     break;
   case 1:
     state = 0;
     break;
   }
   pos[dir] += vel;
 
   layers[pos[2]] = 1<<(pos[0]+pos[1]*3);
 }
 
 
 
 // 1/fゆらぎ 間欠カオス
 double yuragi(double xt)
 {
   if(xt<0.5){
     return (xt + 2*   xt *   xt );
   }else{
     return (xt - 2*(1-xt)*(1-xt));
   }
 }
 
 void led_dynamic_drive()
 {
   for(int l=0; l<3; l++){
     LAYER_ON(l);    
     for(int n=0; n<9; n++){
       if( layers[l] & (1<<n) ){
         XY_ON(n);
       }else{
         XY_OFF(n);
       }
       delayMicroseconds(1);
       XY_OFF(n);
       delayMicroseconds(10);
     }
     LAYER_OFF(l);
   }
 }
 
 
 }}

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