動作風景
感想
- 回路やプログラムはマトリクスLEDの制御でそこそこ経験を積んでたので以外とあっさりできた
- LEDケーブルにワイヤハンダ付けしたりスチレンボードを探したりとかの方が面倒だったり
- 使用したパーツだけでも2000円はかかってることを考えるとまあ微妙っちゃ微妙(量産すれば500円とかにできるんだろうけど)
- スチレンボードとか火がついたらヤバいよね
- LEDの位置は適当すぎたかもしんない、もうちょい拘ってもよかった
- だが面倒
回路説明
- Atmega8 PC0,PC1,PC2にLEDケーブル(白、赤、青)を接続
- Atmega8 PC3をメロディIC UM3481のSLに接続
- Atmega8 PD2(INT0)をプッシュボタンに接続(プッシュでGND立ち下がり)
ざっくり制御概要
- プッシュボタンでメロディスタート、メロディと共にLED点滅
- ボタンを押す毎にメロディ、LEDパターンを変更
ちょびっと詳細説明
- プッシュボタンでINT0割り込み
- INT0割り込み処理でUM3481 SLをH(次曲選択)、LEDパターンの変更、LED累積表示時間のリセット
- メインループでLED累積表示時間が設定時間(=60秒)未満ならLEDパターン表示
- メインループでLED累積表示時間が設定時間以上ならLED消灯
回路以外の材料
- 100円ショップPET素材のクリスマス飾り(壁掛け用?)
- 100円ショップ木箱
- 100円ショップA4スチレンボード(2枚入り、爪楊枝を指して2枚接続)
![]() |
ブレッドボード上UM3481、ブレッドボード下Atmega8とLED駆動トランジスタ等 |
![]() |
プッシュボタン、LEDケーブルとボード |
![]() |
LEDケーブルをボードに貼りつけ |
![]() |
ボードに壁掛け飾りをかぶせる |
Atmgega8プログラム
----
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
atmega8 16pu + um3281 | |
xmass ilumination | |
ISP | |
PC6 RESET | |
PB5 SCK | |
PB4 MISO | |
PB3 MOSI | |
INT0 PD2 | |
LED1 PC0 | |
LED2 PC1 | |
LED3 PC2 | |
TS PC3 | |
*/ | |
#define F_CPU 1000000UL // Clock Speed | |
#include <avr/io.h> | |
#include <avr/interrupt.h> | |
#include <util/delay.h> | |
/* DDRC |= (1 << PC0); */ | |
#define DSET(p,n) (DDR##p|=(1<<P##p##n)) | |
/* PORTC |= (1 << PC0); */ | |
#define PSET(p,n,d) \ | |
if ((d)) { \ | |
(PORT##p|=(1<<P##p##n));\ | |
} else { \ | |
(PORT##p&=~(1<<P##p##n));\ | |
} | |
#define DELAY 500 | |
#define INTERVAL 60000 | |
volatile int i = 0; | |
volatile unsigned long e = 0; | |
int | |
main(void) | |
{ | |
int j; | |
/* white led pattern */ | |
unsigned char m0[8] = { | |
0b11111111, | |
0b01010101, | |
0b11111111, | |
0b01010101, | |
0b11111111, | |
0b01010101, | |
0b11111111, | |
0b01010101 | |
}; | |
/* blue led pattern */ | |
unsigned char m1[8] = { | |
0b10101010, | |
0b00110011, | |
0b01100110, | |
0b11001100, | |
0b10101010, | |
0b01100110, | |
0b11001100, | |
0b11110000 | |
}; | |
/* red led pattern */ | |
unsigned char m2[8] = { | |
0b01010101, | |
0b11001100, | |
0b10011001, | |
0b11110000, | |
0b00111100, | |
0b01111000, | |
0b10101010, | |
0b01010101 | |
}; | |
// port c output setting | |
DSET(C,0); | |
DSET(C,1); | |
DSET(C,2); | |
DSET(C,3); | |
// pull up | |
PORTC = 0xFF; | |
PORTD = 0xFF; | |
// set interrupt | |
GICR |= (1<<INT0); | |
sei(); | |
// um3481 SL L | |
PSET(C,3,0); | |
i = 0; | |
while (1) { | |
if (e < INTERVAL) { | |
// drive led by pattern | |
for(j=0;j<8;j++) { | |
PSET(C,0,(m0[i]&1<<j)>>j); | |
PSET(C,1,(m1[i]&1<<j)>>j); | |
PSET(C,2,(m2[i]&1<<j)>>j); | |
_delay_ms(DELAY); | |
e += DELAY; | |
} | |
} else { | |
// led off | |
PSET(C,0,0); | |
PSET(C,1,0); | |
PSET(C,2,0); | |
} | |
} | |
return 0; | |
} | |
ISR(INT0_vect) | |
{ | |
// reset elapsed time | |
e = 0; | |
// switch led pattern | |
i += 1; | |
if (i>=8) { | |
i = 0; | |
} | |
// led off | |
PSET(C,0,0); | |
PSET(C,1,0); | |
PSET(C,2,0); | |
// um3481 SL H => next music | |
PSET(C,3,1); | |
_delay_ms(5); | |
PSET(C,3,0); | |
} |
----