>よく皆さんが作っていらっしゃるCubeLEDを制御してみました。
3*3*3=27個です。
制作は、例のごとく後輩です//
一枚のC型基盤にLEDも制御系も全部載ってます。
ピカピカさせました。
使用したLEDは
http://akizukidenshi.com/catalog/g/gI-01786/
です。
綺麗にみえたので。
回路図って前の電光掲示板の時みたいな感じかなぁと思いつつ、でも3次元だからAND回路とか組み合わせるのかなーって考えてたら、
意外と普通で残念です。
制御線は12本です。
段の選択が3本、場所の選択が9本です。
つまり、XYはダイナミック点灯していなくて、XYとZでダイナミック点灯しているわけです。
制御はATMega168Pを1MHzで動作させてます。
回路図も、LEDをつなぐだけ。
※この回路は、僕が床に落として踏んでしまったため、現在ひし餅のようになっております。
プログラムは
#include <avr/io.h>
#include <util/delay.h>
/*
PD4 PD3 PD2
PB5 PB4 PB3
PB2 PB1 PB0
*/
#define F_1 PORTC|=0b00000001;PORTC&=0b11111001//PC0
#define F_2 PORTC|=0b00000010;PORTC&=0b11111010//PC1
#define F_3 PORTC|=0b00000100;PORTC&=0b11111100//PC2
#define DARK PORTC&=0b11111000
#define LIGHTTIME 1
void output(uint16_t data);//9ビットのデータを入れる(上位7ビットは捨てる,左上(PD2)から)
uint16_t data[3];
void init_io();
void floor_select(uint8_t floor);
void delay_ms(uint16_t ms);
void delay_us(uint16_t us);
void draw();
void keep(uint16_t keeptime);//たぶん10000で1秒ぐらい
int main(){
init_io();
while(1){
data[0]=0b101010101;
data[1]=0b010101010;
data[2]=0b101010101;
keep(2500);
data[0]=0b010101010;
data[1]=0b101010101;
data[2]=0b010101010;
keep(2500);
}
}
void keep(uint16_t keeptime){
for(uint16_t k=0;k<=keeptime;k++){
draw();
}
}
void draw(){
output(data[0]);
F_1;
delay_us(LIGHTTIME);
DARK;
output(data[1]);
F_2;
delay_us(LIGHTTIME);
DARK;
output(data[2]);
F_3;
delay_us(LIGHTTIME);
DARK;
}
void output(uint16_t data){
PORTD=((data&0b111000000)>>4)&0b00011100;
PORTB=(data&0b000111111)&0b000111111;
}
void init_io(){
DDRC=0xff;//フロア選択用
DDRB=0xff;
DDRD=0xff;
}
void delay_ms(uint16_t ms){
while(ms–){
_delay_ms(1);
}
}
void delay_us(uint16_t us){
while(us–){
_delay_us(1);
}
}
こんな感じで動きました!
本当は動画もアップしたいのですがあまり綺麗でないのと、光り方のバリエーションをまだあんまり作ってないので動画に出来なかったんです……
それに写真見てもあまり綺麗じゃないですが、本物はめっちゃ綺麗です!
皆さんも作ってみてはどうでしょう?