電池1本で LED 点灯

なんのひねりもございません。昔からあるブロッキング発振回路でございます。昨日作ろうかと思い Twitter でつぶやくと「ジュールシーフ」ですねと言われて、他人の受け売りを教えてくださる Google さんを見たところ等価のものでした。でもいいネーミングだと思います。

これは他のサイトに詳細説明はたくさんございますので、こちらでは説明しません。「ジュールシーフ」や「ブロッキング発振 LED」などで記事がたくさんみつかります。使う部品もほとんどないのですぐ出来ます。気分転換ですね。失礼しました。

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]

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

galileo7 さんのところで販売されている、Arduino用LED Cubeキットです。いずれにしても、LEDを空中配線するのが面倒でした。

とりあえず、サンプルのソースの点灯パターンはあくまでサンプルなのでシンプルです。よそのサイトとか見ますと 1/f ゆらぎとかいろいろアイデアがあって、参考になります。とりあえず Arduiono に慣れる練習にもなるので、この LED Cube でしばらく遊んでみようと思います。

[nicodo]sm15413951[/nicodo]

Youtube はコチラ こっちのほうが、ちょっとだけ画質上