Sim's blog

電子工作はじめてみました

AVRでLEDホタル(2)

2008-09-14 03:02:55 | AVR
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キャップをかぶせています。どうやったら、うまく撮影できるんでしょうね。もっと暗い方がいいのかな。













水色








ソースコード
#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とかにしないといけないんでしょうね。