LEDマトリクスの点灯
universal16のキーバックライトLEDは基板上でマトリクス状に配線されており、シフトレジスタなどを操作することでキーごとの点灯ができるようになっています。
これもプログラムの勉強にと追加した機能のひとつなのですが、手持ちのシフトレジスタをきちんと扱おうとすると4ピン必要になるため、Pro Microとは別にArduino(ATmega328P)を用意してそこからLED全般を制御することにしました。
......? pic.twitter.com/r636gDRCde
— せがた ひろみ (@keyaki_namiki) October 29, 2018
今回使ったのはうちにあった74HC164というシフトレジスタですが、もう少し大きな電流を流せる部品をちゃんと選んだほうがいいかもしれません。
「何もわからん」とある通り、とても見るだけではわからない配線ですが、LED Cols 0-3にA2,A3,4,2を、74HC164のQA-QDにLED Rows 0-3を、などと配線しています。
何もわからん pic.twitter.com/dPNGssCZQy
— せがた ひろみ (@keyaki_namiki) November 2, 2018
諸々の配線を済ませた上で以下のプログラムを実行すると、左斜め対角線を消灯した状態になるかと思います。
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させないことでちらつきの少ないキーバックライトを実現できるでしょう。
抵抗値の高いチップ抵抗しか持ってなかったので部屋を暗くしないとダイナミック点灯っぽくならなくなってしまった...... #universal16 pic.twitter.com/hr25QavQNe
— せがた ひろみ (@keyaki_namiki) November 2, 2018
(キーバックライトが暗いの図)
いい感じ #universal16 pic.twitter.com/XqtNs8e5ld
— せがた ひろみ (@keyaki_namiki) November 2, 2018
動作イメージ(上の動画では配列の扱い方が逆になっていて右対角線が消灯しています)
次の課題はPro Microからキー入力を受け取ってバックライト点灯を操作するあたりでしょうか。。。