2013年11月23日土曜日

LEDケーブル+メロディIC+Atmega8-16PU => クリスマスイルミネーションボード

というわけで100均LEDケーブルと電子オルゴールキットをAtmega8-16PUで制御してクリスマスイルミネーションを作成してみた。

動作風景




感想
  • 回路やプログラムはマトリクス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プログラム
----
/*
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);
}
view raw xmass.c hosted with ❤ by GitHub

----

0 件のコメント:

amazonアソシエイト