ほんまかいな、そーかいな、南アフリカ と ちょびっと シドニー そして日本だ!

南アフリカ(2004年)と、シドニー(2005年)での生活の近況報告です。そして日本でも(2007年から)

3X3X3LEDCube

2011年04月03日 | Gadgets

LEDのいっぱいくっついたジャンク基板が手に入ったので、パーツをひっぺがしてLEDキューブを作ってみた。
4X4にするか、3X3にするか迷ったけど、4X4だとLEDを64個も半田付けしなきゃならないので、とりあえず3X3でやってみることにした。
これでも、LEDを3X3X3=27個も半田付けしなきゃならない。
点灯のパターン作製とドライブは、PIC16F628Aとトランジスタ12個で駆動している。

当初、ポートがたくさん付いているPIC、16F57を使おうと思っていたのだが、前にも書いたようにテスト段階でうまくLEDを点灯できなかったので四苦八苦しているうちに面倒になり、また、早く結果が見たいのも手伝って、
”まぁ、16F57にこだわらなくても、とりあえずできればいいか”
と、16F628Aに日和見ってしまった。
が、プログラムを作るうちに、メモリが足りなくなり、あまり大したパターンを作ることができない。
Lite ModeのHitech-Cなので、メッセージによると、最適化するともう40%ほどいけるようだが、高価な製品版を買う由もなく、
LEDを点滅するだけの大したノウハウもいらないプログラムだから、いっそ、アセンブラで書くともう少し何とかなるかもしれないが、まぁ、宿題にしておこう。
一応、今回は、メモリに苦しみつつも、なんちゃってPWMとダイナミック点灯を盛り込んでみた。

回路図も一応作ってみた。
あまり、参考にはならないが、こちらから
http://blogimg.goo.ne.jp/user_image/4e/08/635f9216f88428e9550904d04c122c60.png

16F628AのI/Oは、1ピンあたり25mA、ポートA,B合計で200mAまでいけるようだから、LED1個あたり、8mA以内に抑えておけば、トランジスタは、LEDのアノード側を省略してもカソード側の3つで足りると思う。
逆に、PICの各I/Oピンの出口に抵抗を入れておいたほうが良いかもしれない。
それと、MCLRピンのプルアップ --- これは、PIC16F57で懲りている…。
ちなみに、16F628は、RA4のピンは、オープンコレクタなので、プルアップが必要
それと、RA5のピンは、入力専用なので、LED点灯には、そのままでは使えない---どこかで、入力専用ピンを出力に使う方法というのを見た気もするが、普通は、使えない。
この入力ピンを使って、暗くなったら勝手に点灯するようにもできそうだが、なんせ、ほら、メモリーが…。

動画もアップしておいた。興味のある方は、こちらから
http://www.youtube.com/watch?v=YWMIcI0edtY


ソースリスト(HiTech-C)

// LED Cube for 16F628

//LED position (top view) :
//   0 1 2 
//   3 4 5
//   6 7 8
//PORTA
// 0=RA0  1=RA1  2=RA2  3=RA3  4=RA4  5=RA6  6=RA7   
//PORTB :
//  7=RB0  8=RB1 
//  RB5:Bottom    RB6:Middle    RB7:Top


#include  

#ifndef _XTAL_FREQ
  #define _XTAL_FREQ 4000000
#endif


__CONFIG(UNPROTECT & BORDIS & MCLRDIS & PWRTEN & WDTDIS & INTIO & LVPDIS);

void wait(t) {
  unsigned int i;
  for(i=1;i}

void P1(){

    PORTA=0x10; PORTB=0x20;
    wait(5);
    PORTA=0x11; //PORTB=0x20;
    wait(5);
    PORTA=0x13; //PORTB=0x20;
    wait(5);
    PORTA=0x7; //PORTB=0x20;
    wait(5);
    PORTA=0x46; //PORTB=0x20;
    wait(5);
    PORTA=0x44; PORTB=0x22;
    wait(5);
    PORTA=0x40; PORTB=0x23;
    wait(5);
    PORTA=0x80; //PORTB=0x23;
    wait(5);
    PORTA=0x88; PORTB=0x21;
    wait(5);
    PORTA=0x89; PORTB=0x20;
    wait(5);
    PORTA=0x19; //PORTB=0x20;
    wait(5);
    PORTA=0x11; //PORTB=0x20;
    wait(5);
    PORTA=0x10; //PORTB=0x20;
    wait(5);
     
}

void P2(){

    PORTA=0x10; PORTB=0x40;
    wait(5);
    PORTA=0x11; //PORTB=0x40;
    wait(5);
    PORTA=0x13; //PORTB=0x40;
    wait(5);
    PORTA=0x7; //PORTB=0x40;
    wait(5);
    PORTA=0x46; //PORTB=0x40;
    wait(5);
    PORTA=0x44; PORTB=0x42;
    wait(5);
    PORTA=0x40; PORTB=0x43;
    wait(5);
    PORTA=0x80; //PORTB=0x43;
    wait(5);
    PORTA=0x88; PORTB=0x41;
    wait(5);
    PORTA=0x89; PORTB=0x40;
    wait(5);
    PORTA=0x19; //PORTB=0x40;
    wait(5);
    PORTA=0x11; //PORTB=0x40;
    wait(5);
    PORTA=0x10; //PORTB=0x40;
    wait(5);
     
}

void P3(){

    PORTA=0x10; PORTB=0x80;
    wait(5);
    PORTA=0x11; //PORTB=0x80;
    wait(5);
    PORTA=0x13; //PORTB=0x80;
    wait(5);
    PORTA=0x7; //PORTB=0x80;
    wait(5);
    PORTA=0x46; //PORTB=0x80;
    wait(5);
    PORTA=0x44; PORTB=0x82;
    wait(5);
    PORTA=0x40; PORTB=0x83;
    wait(5);
    PORTA=0x80; //PORTB=0x83;
    wait(5);
    PORTA=0x88; PORTB=0x81;
    wait(5);
    PORTA=0x89; PORTB=0x80;
    wait(5);
    PORTA=0x19; //PORTB=0x80;
    wait(5);
    PORTA=0x11; //PORTB=0x80;
    wait(5);
    PORTA=0x10; //PORTB=0x80;
    wait(5);
     
}

//All Brink
void P4(){
 unsigned int i;
 
   for(i=1;i<=15;i++){ 
    PORTA=0xFF; PORTB=0xFF; 
    __delay_ms(2);
    PORTA=0x00; PORTB=0x00;
    __delay_ms(18);
   } 
   for(i=1;i<=15;i++){ 
    PORTA=0xFF; PORTB=0xFF; 
    __delay_ms(6);
    PORTA=0x00; PORTB=0x00;
    __delay_ms(14);
   } 
   for(i=1;i<=15;i++){ 
    PORTA=0xFF; PORTB=0xFF; 
    __delay_ms(10);
    PORTA=0x00; PORTB=0x00;
    __delay_ms(10);
   } 
   for(i=1;i<=15;i++){ 
    PORTA=0xFF; PORTB=0xFF; 
    __delay_ms(14);
    PORTA=0x00; PORTB=0x00;
    __delay_ms(6);
   } 
   for(i=1;i<=15;i++){ 
    PORTA=0xFF; PORTB=0xFF; 
    __delay_ms(18);
    PORTA=0x00; PORTB=0x00;
    __delay_ms(2);
   } 

   for(i=1;i<=5;i++){
   PORTA=0xFF; PORTB=0xE3;
   wait(50);
   PORTA=0x00; PORTB=0x00;
   wait(20); 
   }
}

//Bottom to Top
void P5(){
 unsigned int i;
  for(i=1; i<=8; i++){ 
   PORTA=0xFF; PORTB=0x23;
   wait(20);
   //PORTA=0xFF;
   PORTB=0x43;
   wait(20); 
   //PORTA=0xFF;
   PORTB=0x83;
   wait(20);
   //PORTA=0xFF;
   PORTB=0x43;
   wait(20); 
  }
}

//Front to Back
void P6(){
 unsigned int i;
  for(i=1; i<=8; i++){ 
   PORTA=0x07; PORTB=0xE0;
   wait(20);
   PORTA=0x58; PORTB=0xE0;
   wait(20); 
   PORTA=0x80; PORTB=0xE3;
   wait(20);
   PORTA=0x58; PORTB=0xE0;
   wait(20); 
  }
}

//Left to Right
void P7(){
 unsigned int i;
  for(i=1; i<=8; i++){ 
   PORTA=0x89; PORTB=0xE0;
   wait(20);
   PORTA=0x12; PORTB=0xE1;
   wait(20);
   PORTA=0x44; PORTB=0xE2;
   wait(20);
   PORTA=0x12; PORTB=0xE1;
   wait(20); 
  }
}

//Rotate
void P8(){
 unsigned int i;
   PORTA=0x10; PORTB=0x20;
   wait(20);
   PORTA=0x10; PORTB=0x60;
   wait(20);
   PORTA=0x10; PORTB=0xE0;
   wait(20);
  for(i=1; i<=8; i++){ 
   PORTA=0x58; PORTB=0xE0;
   wait(20);
   PORTA=0x11; PORTB=0xE2;
   wait(20); 
   PORTA=0x12; PORTB=0xE1;
   wait(20);
   PORTA=0x94; PORTB=0xE0;
   wait(20); 
  }
}

//Diagonal
void P9(){
 unsigned int i;
 unsigned int j;
  for(j=1; j<=8; j++){ 
   for(i=1; i<=20; i++){ 
    PORTA=0x10; PORTB=0xE0;
    wait(2);
    PORTA=0x58; PORTB=0x40;
    wait(2);
    PORTA=0x12; PORTB=0x41;
    wait(2);
   }
   for(i=1; i<=20; i++){ 
    PORTA=0x85; PORTB=0x22;
    wait(2);
    PORTA=0x10; PORTB=0x40;
    wait(2);
    PORTA=0x85; PORTB=0x82;
    wait(2);
   }
   for(i=1; i<=20; i++){ 
    PORTA=0x4A; PORTB=0x21;
    wait(2);
    PORTA=0x85; PORTB=0x42;
    wait(2);
    PORTA=0x4A; PORTB=0x81;
    wait(2);
   }
  } 
}

//Satellite Orbit
void P10(){
 unsigned int i;
 unsigned int j;
 unsigned int k;

  for(k=1; k<=3; k++){ 
    for(j=1; j<=4; j++){ 
   for(i=1; i<=4; i++){ 
    PORTA=0x00; PORTB=0x82;
    wait(2);
    PORTA=0x10; PORTB=0x40;
    wait(2);
    PORTA=0x01; PORTB=0x20;
    wait(2);
   }
    
    PORTA=0x12; PORTB=0x41;
    wait(15);
    
   for(i=1; i<=4; i++){ 
    PORTA=0x04; PORTB=0x80;
    wait(2);
    PORTA=0x10; PORTB=0x40;
    wait(2);
    PORTA=0x80; PORTB=0x20;
    wait(2);
   }
   for(i=1; i<=4; i++){ 
    PORTA=0x40; PORTB=0x80;
    wait(2);
    PORTA=0x10; PORTB=0x40;
    wait(2);
    PORTA=0x08; PORTB=0x20;
    wait(2);
   }
  }

  for(j=1; j<=4; j++){ 
   
    PORTA=0x11; PORTB=0x42;
    wait(15);
    PORTA=0x12; PORTB=0x41;
    wait(15);
    PORTA=0x94; PORTB=0x40;
    wait(15);
    PORTA=0x58; PORTB=0x40;
    wait(15);
  }

  for(j=1; j<=4; j++){ 
   for(i=1; i<=4; i++){ 
    PORTA=0x01; PORTB=0x80;
    wait(2);
    PORTA=0x10; PORTB=0x40;
    wait(2);
    PORTA=0x00; PORTB=0x22;
    wait(2);
   }
    
    PORTA=0x12; PORTB=0x41;
    wait(15);
    
   for(i=1; i<=4; i++){ 
    PORTA=0x04; PORTB=0x20;
    wait(2);
    PORTA=0x10; PORTB=0x40;
    wait(2);
    PORTA=0x80; PORTB=0x80;
    wait(2);
   }
   for(i=1; i<=4; i++){ 
    PORTA=0x08; PORTB=0x80;
    wait(2);
    PORTA=0x10; PORTB=0x40;
    wait(2);
    PORTA=0x40; PORTB=0x20;
    wait(2);
   }
  }
   }
}


main()
{
 PORTA = 0;
 PORTB = 0;
 
 TRISA=0;
 TRISB=0;
 TRISA5=1;

// note : RA5 is Input only
// note : RA4 should be pulled up for Output 
 
 CMCON = 0x07;
unsigned int i;
 
 while(1){
  P4();
  P5();
  P6();
  P7();
  P8();
  P9();
  P10();
 for(i=1;i<3;i++){
  P1();
  P2();
  P3();
  P2();
 }
  P1();
 }


ジャンル:
ウェブログ
キーワード
プルアップ ソースリスト オープンコレクタ
コメント (0) |  トラックバック (0) |  この記事についてブログを書く
Messenger この記事をはてなブックマークに追加 mixiチェック シェア
« PIC16F57を使って... | トップ | 水菜の花がうまい! »

コメント

コメントはありません。

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

コメント利用規約に同意の上コメント投稿を行ってください。
※文字化け等の原因になりますので、顔文字の利用はお控えください。
下記数字4桁を入力し、投稿ボタンを押してください。この数字を読み取っていただくことで自動化されたプログラムによる投稿でないことを確認させていただいております。
数字4桁

トラックバック

この記事のトラックバック  Ping-URL
ブログ作成者から承認されるまでトラックバックは反映されません。

あわせて読む