
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
#ifndef _XTAL_FREQ void wait(t) { void P1(){ PORTA=0x10; PORTB=0x20; void P2(){ PORTA=0x10; PORTB=0x40; void P3(){ PORTA=0x10; PORTB=0x80; //All Brink for(i=1;i<=5;i++){ //Bottom to Top //Front to Back //Left to Right //Rotate //Diagonal //Satellite Orbit for(k=1; k<=3; k++){ for(j=1; j<=4; j++){ for(j=1; j<=4; j++){ // note : RA5 is Input only
#include
#define _XTAL_FREQ 4000000
#endif
__CONFIG(UNPROTECT & BORDIS & MCLRDIS & PWRTEN & WDTDIS & INTIO & LVPDIS);
unsigned int i;
for(i=1;i}
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);
}
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);
}
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);
}
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);
}
PORTA=0xFF; PORTB=0xE3;
wait(50);
PORTA=0x00; PORTB=0x00;
wait(20);
}
}
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);
}
}
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);
}
}
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);
}
}
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);
}
}
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);
}
}
}
void P10(){
unsigned int i;
unsigned int j;
unsigned int 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);
}
}
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(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 : 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();
}
}









