Tiny2313でマトリックスLEDを光らせる

ATTiny2313と秋月のマトリックスLED(TOM-1588)で遊んでみました.最初は,入手性の良いMAX7219を使ったのですが,高価すぎるのと,自由に明るさを変えるのが面倒なため,BA823というドライバICを使うことにしました.

MAX7219を使う

MAX7219は,8桁の7セグLEDや8x8マトリックスLEDを制御できるドライバICです.ダイナミック点灯の制御をしてくれて,輝度を調整する機能も内蔵しています.

専用ICなので抵抗やトランジスタなどが不要になり,とても楽です.ただし,高価です.千石で1000円でした.

CIMG0009.jpg

回路

部品単価(円)購入場所
MAX72191 1000千石
ATTiny23131 100秋月
TOM-15881 100秋月

あとで.

カソードの出力を監視して垂直(?)同期を取れば16階調までならちらつきも気にならない感じです.

気合で同期を取っているひともいるみたいです.http://d.hatena.ne.jp/KZR/20090824/p2

100円のマトリックスLEDと100円のマイコンに,1000円もするLEDドライバがつながっているのは,何か間違っている気がするのでどうにかしたい.

BA823を使う

MAX7219は高価なのと,ドット単位での明るさ制御に難があるので,BA823を使ってみました.

電流がたくさん流せるシフトレジスタです.LEDや熱転写式プリンタのヘッド制御に使うICのようで,シンク電流は200mAまで流せます.ノイズとかを気にしないなら,小型のモータ等も動かせると思います.

CIMG0010.jpg

回路

マトリックスLEDを挿すソケットは,16ピンのICソケットを2つに切って代用.部品代は全部あわせても,400円くらいです.

部品購入場所備考
BA8231鈴商100円
ATTiny23131秋月100円 たくさん買えば90円
TOM-15881秋月100円 在庫限り?
16ピンソケット2秋月10個100円
20ピンソケット1秋月10個100円
100Ω8千石200個200円
0.1uF1秋月10個100円

回路がマトリックスLEDの裏に全て収まることを確認.

matrix01.png

R=100~200Ωくらい.電源系は省略.LEDのピン配置は秋月のTOM-1588.BA823は鈴商で100円で買えます.

CIMG0011.jpg

プログラム

#define F_CPU 8000000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

volatile uint8_t framebuf[] = {
    0,2,4,6,8,10,12,16,
    16,1,2,4,6,8,10,12,
    12,16,1,2,4,6,8,10,
    10,12,16,1,2,4,6,8,
    8,10,12,16,1,2,4,6,
    6,8,10,12,16,1,2,4,
    4,6,8,10,12,16,1,2,
    2,4,6,8,10,12,16,1,
};

// タイマ割り込み
ISR(TIMER0_OVF_vect) {
    static uint8_t cnt = 0;
    static uint8_t frame = 0;

    if ((PORTD&0x10)==0) {
        PORTD|= 0x10; // CLK H
        uint8_t d=0;
        uint8_t i;
        for (i=0;i<8;i++) {
            d>>=1;
            if (frame<framebuf[cnt*8+i])
                d|=0x80;
        }
        PORTB=d;
        cnt=(cnt+1)&7;
    } else {
        PORTD&= ~0x10; // CLK L
        PORTB=0x00;
        if (cnt==0) {
            frame=(frame+1)&15;
            PORTD|= 0x20; // DAT H
        } else {
            PORTD&=~0x20; // DAT L
        }
    }
}


int main()
{
    DDRB = 0xff;  // LED matrix anode(0-7)
    DDRD = 0xf0;  // LED cathode(BA823) PD5->dat PD4->clk

    TCCR0B = _BV(CS00);
    TIMSK = _BV(TOIE0);
    sei();

    for(;;);
}

光らせてみた.

CIMG0014.jpg

あとは通信用のコネクタつけて,たくさんつなげられるようにする予定.

履歴

Copyright © binzume all rights reserved.