AVRでLEDホタルの続きです。
9/15 追記 動画を追加しました
秋月で売っているRGBフルカラーLED(通販番号I-02476)を光らせてみました。ATMEGA88はPWMを最大6出力できるので、そのうちの3つを使ってRGBを独立に設定できるようにしました。
最初、青でぼわっと点いてぼわっと消えます。次は赤で同じことをして、紫、緑、水色、黄色、白ときて、また青に戻ります。
電源電圧3.2Vでも一応点いていますが、青がちょい暗めです。青と緑に100Ω、赤に510Ωをつけています。配線は次のようにしています。
12pin(OCR0A) → 510Ω → LED(赤アノード)
11pin(OCR0B) → 100Ω → LED(緑アノード)
5pin(OCR2B) → 100Ω → LED(青アノード)
LED(カソード) →GND
一応、撮影してみましたが、実物と雰囲気がかなり違います。秋月のLEDキャップをかぶせています。どうやったら、うまく撮影できるんでしょうね。もっと暗い方がいいのかな。
青
赤
紫
緑
水色
黄
白
ソースコード
RGBでやっちゃったけど、もっと色々な中間色を出せます(2^24色)。カラーでぼわっとをしようとすると、HSVとかにしないといけないんでしょうね。
9/15 追記 動画を追加しました
秋月で売っているRGBフルカラーLED(通販番号I-02476)を光らせてみました。ATMEGA88はPWMを最大6出力できるので、そのうちの3つを使ってRGBを独立に設定できるようにしました。
最初、青でぼわっと点いてぼわっと消えます。次は赤で同じことをして、紫、緑、水色、黄色、白ときて、また青に戻ります。
電源電圧3.2Vでも一応点いていますが、青がちょい暗めです。青と緑に100Ω、赤に510Ωをつけています。配線は次のようにしています。
12pin(OCR0A) → 510Ω → LED(赤アノード)
11pin(OCR0B) → 100Ω → LED(緑アノード)
5pin(OCR2B) → 100Ω → LED(青アノード)
LED(カソード) →GND
一応、撮影してみましたが、実物と雰囲気がかなり違います。秋月のLEDキャップをかぶせています。どうやったら、うまく撮影できるんでしょうね。もっと暗い方がいいのかな。
青
赤
紫
緑
水色
黄
白
ソースコード
#include <avr/io.h> #include <util/delay.h> typedef unsigned char byte; void ledfunc(byte g, byte r, byte b) { byte duty = 0; char dir = 1; do { _delay_ms(5); OCR0A = duty & r; // duty比設定 赤 OCR0B = duty & g; // duty比設定 緑 OCR2B = duty & b; // duty比設定 青 if(duty == 0xff) dir = -1; duty += dir; } while(duty != 0); } int main() { // MEGA88 タイマー関連ポート // OC0A/PD6 12pin 赤 // OC0B/PD5 11pin 緑 // OC1A/PB1 15pin // OC1B/PB2 16pin // OC2A/PB3 17pin ... MOSI // OC2B/PD3 5pin 青 // 76543210 DDRD = 0b01101000; // PD6, PD5, PD3出力 // 14.9.1 タイマ/カウンタ0制御レジスタA (p.64) // ++--------COM0A1:COM0A0 10 上昇時一致でL下降時一致でH // ||++------COM0B1:COM0B0 10 上昇時一致でL下降時一致でH // |||| ++--WGM01:WGM00 01 位相基準PWM動作 TCCR0A = 0b10100001; // 17.11.1 タイマ/カウンタ2制御レジスタA (p.99) // ++--------COM2A1:COM2A0 10 OCR2A停止 // ||++------COM2B1:COM2B0 00 上昇時一致でL下降時一致でH // |||| ++--WGM21:WGM20 01 位相基準PWM動作 TCCR2A = 0b00100001; // 14.9.2 タイマ/カウンタ0制御レジスタB (p.65) // ++--------FOC0A:FOC0B 00 // || +-----WGM2 0 TOP = 0xff // || |+++--CS02:CS01:CS00 001 clkio/1 TCCR0B = 0b00000001; // start timer // 17.11.2 タイマ/カウンタ0制御レジスタB (p.100) // ++--------FOC2A:FOC2B 00 // || +-----WGM22 0 TOP = 0xff // || |+++--CS22:CS21:CS20 001 clkio/1 TCCR2B = 0b00000001; // start timer while(1){ ledfunc(0x00, 0x00, 0xff); ledfunc(0x00, 0xff, 0x00); ledfunc(0x00, 0xff, 0xff); ledfunc(0xff, 0x00, 0x00); ledfunc(0xff, 0x00, 0xff); ledfunc(0xff, 0xff, 0x00); ledfunc(0xff, 0xff, 0xff); } }
RGBでやっちゃったけど、もっと色々な中間色を出せます(2^24色)。カラーでぼわっとをしようとすると、HSVとかにしないといけないんでしょうね。