喫茶blanc

何か作ったり、何か食べたり

LEDマトリクスの点灯

github.com

universal16のキーバックライトLEDは基板上でマトリクス状に配線されており、シフトレジスタなどを操作することでキーごとの点灯ができるようになっています。

これもプログラムの勉強にと追加した機能のひとつなのですが、手持ちのシフトレジスタをきちんと扱おうとすると4ピン必要になるため、Pro Microとは別にArduino(ATmega328P)を用意してそこからLED全般を制御することにしました。

今回使ったのはうちにあった74HC164というシフトレジスタですが、もう少し大きな電流を流せる部品をちゃんと選んだほうがいいかもしれません。

akizukidenshi.com

「何もわからん」とある通り、とても見るだけではわからない配線ですが、LED Cols 0-3にA2,A3,4,2を、74HC164のQA-QDにLED Rows 0-3を、などと配線しています。

諸々の配線を済ませた上で以下のプログラムを実行すると、左斜め対角線を消灯した状態になるかと思います。

const int ledcols = 4;
const int ledrows = 4;
const int ledcol[ledcols] = {A2,A3,4,2};
const int srclk = 7;
const int srclr = 8;
const int sra = A0;
const int srb = A1;
int matrix[ledrows][ledcols] = {
    {1,1,1,0},
    {1,1,0,1},
    {1,0,1,1},
    {0,1,1,1}
};
void srclock(){
    digitalWrite(srclk,1);
    digitalWrite(srclk,0);
};
void setup(){
    pinMode(srclk,OUTPUT);
    pinMode(srclr,OUTPUT);
    pinMode(sra,OUTPUT);
    pinMode(srb,OUTPUT);
    for(int i=0;i<4;i++){
        pinMode(ledcol[i],OUTPUT);
        digitalWrite(ledcol[i],0);
    }
    digitalWrite(srclk,0);
    digitalWrite(srclr,0);
    digitalWrite(sra,0);
    digitalWrite(srb,0);
}
void loop(){
    for(int i=ledcols;i>=0;i--){
        digitalWrite(srclr,1);
        digitalWrite(srb,1);
        for(int j=ledrows;j>=0;j--){
            digitalWrite(sra,matrix[j][i]);
            srclock();
            digitalWrite(sra,0);
        }
        digitalWrite(ledcol[i],1);
        delay(5);
        digitalWrite(srclr,0);
        digitalWrite(ledcol[i],0);
    }
}

今回は適当なチップ抵抗の手持ちがなかったため、途中に余計なdelay(5);を置いてごまかしていますが、ちゃんと抵抗値を選んだ上で、delayの値をもっと小さくするか、そもそもdelayさせないことでちらつきの少ないキーバックライトを実現できるでしょう。

(キーバックライトが暗いの図)

動作イメージ(上の動画では配列の扱い方が逆になっていて右対角線が消灯しています)

次の課題はPro Microからキー入力を受け取ってバックライト点灯を操作するあたりでしょうか。。。