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]

カメラのリモートコード MC-22 買った

ふと、最近電子工作キットもろくに作っていないという状況なので、少しリハビリということで

雷放電探知キットと、カメラのケーブルを購入。雷放電探知キットの写真は何日か前にもここにのせたような気はします。雷がなった時にAMラジオに雑音がはいるので雷来たなというのがわかりますが、このキットも雷放電のノイズを増幅して、LED点けてみたり今回であれば私はカメラのシャッターを切りたいので、カメラのケーブルと接続する。という工作をしたいなーと思ってるところでございます。

なので、工作的には一応フォトカプラで絶縁はしとこかなという程度で難易度は低いです。正直なところ、雷などはビデオカメラ回しとけばいいんですが、今回はこのキットを部品屋さんで見つけたのでちょっくらやってみましょうというところです。あとは、フォトトランジスタで光りを拾うのも思い付くところですが、こちらは実験ネタにするか決めかねてます。

ケーブルの先っぽがバナナプラグか…

FMステレオトランスミッタキット(秋月)半田付けだけした。

ちょっとリハビリ。

 

防音コーナーに居てるときに玄関のピンポンが鳴ってもわからないので、お手軽にわかる方法は?ラジオに飛ばせばいいという昔アマチュア無線やってたオッサンの単純な発想。

ということで、先週大須のタケイ無線で、 1,050円で売ってた秋月のキットのハンダ付けと動作確認終了。76MHz で設定。音質もまぁまぁいいと思います。

ケースに入れるというよりかは板に基板ネジ止めして電池ケースは両面ブチルテープかなんかで固定して終りにしたいのですが、手頃なプラ板が無いなぁ。