4x4x4 LED Cube キットを作りました その2

明日は大阪(お彼岸の墓参り)で明後日はバイオリンのレッスン日と連休ですが思いのほか予定があって時間あるのは今日なのです。PCの前に座る度に、作って放置していた LED CUBE が目に入るのが気になり始めて結局のところ朝からLED CUBE のソースをいじって表示のパターンを増やしてみました。午前中やって、午後になった今動画上げたところです。もうちょっと時間あればパターン増やそうとは思いますが、一応リビングに放り出してしまいました。結構いいです。

  • LED をランダムに光らせる(パッパッと表示切り替え)
  • LED をランダムに光らせる(ゆっくりと表示切り替え)
  • 面パターンを動かす(2種類)
  • キットの標準パターン

が表示出来るようになりました。これでもコンパイルした結果は 4708 bytes だそうです。ATMega328なのでまだまだ余裕ありますね。

[nicodo]sm15687878[/nicodo]

Youtube はこちら

ソースはなんの工夫もないので秘密にすことも無く力技でこんな感じということを以下にさらしておきますわ。

/*

gallileo-7 4x4x4 LED Kit

LED Pattern modified by Masahiro Kusunoki z-gypsy @ nifty.com
2011/9/23 ver 0.1

*/

//74LS164に接続されているpinを設定
#define dPin 2
#define cPin 3

//LEDのカソードにつながっているpinを設定
int layerPin[4] = {8,9,10,11};

//LEDの表示状態を保存
int buf[4];

void setup(){

//使用するpinを設定
for(int i=0;i<4;i++){ pinMode(layerPin[i],OUTPUT); } pinMode(dPin,OUTPUT); pinMode(cPin,OUTPUT); } void loop() { int rand; clearLed(); rand = random(5); switch(rand) { case 0: pattern01(); break; case 1: pattern02(); break; case 2: pattern03(); break; case 3: pattern04(); break; case 4: pattern05(); break; } } //valの中身で初期化する void bufclear(int val){ for(int i=0;i<4;i++){ buf[i] = val; } } void bufclear2(int val1, int val2, int val3, int val4) { buf[0] = val1; buf[1] = val2; buf[2] = val3; buf[3] = val4; } //bufferを表示する gallileo-7 original code void sync(int time, int buffer[]){ int i, j, count; for(count = 0; count < time; count++){ for(i = 0; i < 4; i++) { shiftOut(dPin, cPin, MSBFIRST, (buffer[i] >> 8));
shiftOut(dPin, cPin, MSBFIRST, buffer[i]);
digitalWrite(layerPin[i], HIGH);
delayMicroseconds(500);
digitalWrite(layerPin[i], LOW);
}
}
}
void sync2(int buffer[]) {
int i, j, count;
for(count = 0; count < 3000; count++) { for(i = 0; i < 4; i++) { shiftOut(dPin, cPin, MSBFIRST, (buffer[i] >> 8));
shiftOut(dPin, cPin, MSBFIRST, buffer[i]);
j = count / 15;
switch(j) {
case 0:
case 199:
sync03(i, 0, 0);
break;
case 1:
case 198:
sync03(i, 43, 0);
break;
case 2:
case 197:
sync03(i, 86, 0);
break;
case 3:
case 196:
sync03(i, 125, 0);
break;
case 4:
case 195:
sync03(i, 161, 0);
break;
case 5:
case 194:
sync03(i, 192, 0);
break;
case 6:
case 193:
sync03(i, 217, 0);
break;
case 7:
case 192:
sync03(i, 235, 0);
break;
case 8:
case 191:
sync03(i, 246, 0);
break;
default:
sync03(i, 500, 0);
break;

}
}
}
}

void sync03(int i, unsigned int delay01, unsigned int delay02) {
digitalWrite(layerPin[i], HIGH);
if(delay01 > 0) {
delayMicroseconds(delay01);
}
digitalWrite(layerPin[i], LOW);
if(delay02 > 0) {
delayMicroseconds(delay02);
}
}

void pattern01() {
bufclear(0xFFFF);
//表示
for(int i=0;i<20;i++){ sync(50,buf); } //bufを0x00で初期化 bufclear(0x00); //ひとつずつ点灯 for(int i=0;i<4;i++){ for(int j=0;j<16;j++){ buf[i] = buf[i] << 1; buf[i] = buf[i] | 0b01; sync(50,buf); } } //ひとつずつ消灯 for(int i=0;i<4;i++){ for(int j=0;j<16;j++){ buf[i] = buf[i] << 1; sync(50,buf); } } } void pattern02() { int i; for(i = 0; i < random(10); i++) { bufclear2(random(65535),random(65535),random(65535),random(65535)); sync2(buf); } } void pattern03() { int i; for(i = 0; i < random(10); i++) { bufclear2(random(65535),random(65535),random(65535),random(65535)); sync(500, buf); } } void pattern04() { bufclear2(0xffff,0x0000,0x0000,0x0000); sync(100, buf); bufclear2(0x0000,0xffff,0x0000,0x0000); sync(100, buf); bufclear2(0x0000,0x0000,0xffff,0x0000); sync(100, buf); bufclear2(0x0000,0x0000,0x0000,0xffff); sync(100, buf); bufclear2(0x0000,0x0000,0xffff,0x0000); sync(100, buf); bufclear2(0x0000,0xffff,0x0000,0x0000); sync(100, buf); bufclear2(0xffff,0x0000,0x0000,0x0000); sync(100, buf); bufclear2(0x000f,0x000f,0x000f,0x000f); sync(100, buf); bufclear2(0x00f0,0x00f0,0x00f0,0x00f0); sync(100, buf); bufclear2(0x0f00,0x0f00,0x0f00,0x0f00); sync(100, buf); bufclear2(0xf000,0xf000,0xf000,0xf000); sync(100, buf); bufclear2(0x0f00,0x0f00,0x0f00,0x0f00); sync(100, buf); bufclear2(0x00f0,0x00f0,0x00f0,0x00f0); sync(100, buf); bufclear2(0x000f,0x000f,0x000f,0x000f); sync(100, buf); bufclear2(0x1111,0x1111,0x1111,0x1111); sync(100, buf); bufclear2(0x2222,0x2222,0x2222,0x2222); sync(100, buf); bufclear2(0x4444,0x4444,0x4444,0x4444); sync(100, buf); bufclear2(0x8888,0x8888,0x8888,0x8888); sync(100, buf); bufclear2(0x4444,0x4444,0x4444,0x4444); sync(100, buf); bufclear2(0x2222,0x2222,0x2222,0x2222); sync(100, buf); bufclear2(0x1111,0x1111,0x1111,0x1111); sync(100, buf); } void pattern05() { int i; int rand; for(i = 0; i < 12; i++) { rand = random(12); switch(rand) { case 0: bufclear2(0x1111,0x1111,0x1111,0x1111); break; case 1: bufclear2(0x2222,0x2222,0x2222,0x2222); break; case 2: bufclear2(0x4444,0x4444,0x4444,0x4444); break; case 3: bufclear2(0x8888,0x8888,0x8888,0x8888); break; case 4: bufclear2(0x000f,0x000f,0x000f,0x000f); break; case 5: bufclear2(0x00f0,0x00f0,0x00f0,0x00f0); break; case 6: bufclear2(0x0f00,0x0f00,0x0f00,0x0f00); break; case 7: bufclear2(0xf000,0xf000,0xf000,0xf000); break; case 8: bufclear2(0xffff,0x0000,0x0000,0x0000); break; case 9: bufclear2(0x0000,0xffff,0x0000,0x0000); break; case 10: bufclear2(0x0000,0x0000,0xffff,0x0000); break; case 11: bufclear2(0x0000,0x0000,0x0000,0xffff); break; } sync(100, buf); } } void clearLed() { int i; bufclear(0x00); for(i = 0; i < 20; i++) { sync(50,buf); } } [/c]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です