さて、前回は LED を見事に焦がしてしまいましたが、
今回は、LEDマトリックスが届いたので、シフトレジスタも買って LED 光らせたので、そのご報告でございます。
シフトレジスタ
今回買ったのは 74HC595 です。
74HC595 を選んだ理由は、
チュートリアルで使わていたからです。
というわけで、
チュートリアルを見ながら制御してみました。
特につまずくところはありませんでした。
チュートリアルの通りに配線して、サンプルのコードをコピペですぐにできました。
(写真は撮り忘れたので割愛)
//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;
void setup() {
//set pins to output so you can control the shift register
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
// count from 0 to 255 and display the number
// on the LEDs
for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {
// take the latchPin low so
// the LEDs don't change while you're sending in bits:
digitalWrite(latchPin, LOW);
// shift out the bits:
shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);
//take the latch pin high so the LEDs will light up:
digitalWrite(latchPin, HIGH);
// pause before next value:
delay(500);
}
}
LED マトリックス点灯式
マトリックスの資料を見たら 5V って書いてあったので、大丈夫だろとぶっ刺しました。
(前回の反省が活かされていませんね…ゾクゾクしますね…)
アノード側にシフトレジスタからの出力をつなぎます。
とりあえず全部点灯でいいのでカソード側を GND に繋ぎました。
点いた\(^o^)/
ダイナミック点灯
さて、このままでは1行/1列ずつしか LED を制御できません。
一個一個の LED を制御するためにダイナミック点灯制御を行います。
ダイナミック点灯は、1つ(1列)ずつ点灯・消灯の操作をものすごく速いスピードでやることで、
人間の目にはすべての LED が同時に制御されているかのように見せる方法です。
シフトレジスタで 1bit ずつ出力するようにずらしながら、(制御ラインの選択)
もう一方の線で LED の ON/OFF を制御します。
int latchPin = 8; // 74HC595のST_CPへ
int clockPin = 12; // 74HC595のSH_CPへ
int dataPin = 11; // 74HC595のDSへ
int ledPin = 13;
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(ledPin, OUTPUT);
}
void loop() {
// LED1からLED8までを順に光らせます
for (int j = 0; j < 16; j++) {
// 送信中のlatchPinはグランド(LOW)レベル
digitalWrite(latchPin, LOW);
// シフト演算を使って点灯するLEDを選択しています
shiftOut(dataPin, clockPin, LSBFIRST, (1<<j)>>8);
shiftOut(dataPin, clockPin, LSBFIRST, 1<<j);
if( j % 2 == 0 ) {
digitalWrite(ledPin, LOW);
} else {
digitalWrite(ledPin, HIGH);
}
// 送信終了後latchPinをHIGHにする
digitalWrite(latchPin, HIGH);
delay(100);
}
}
1行だけですが、飛び飛びに LED を光らせることに成功しました~
デイジーチェーン
シフトレジスタ(74HC595) を複数つなげることで、少ないピンでよりたくさんの LED を制御できるようになります。
74HC595 の Serial Out ピンからの出力をつなげるもう1つの 74HC595 の Serial data input ピンにつなげてやります。
詳しくは、
チュートリアルの Exsample2 を参照してください。
これにより、3本の制御線で 16個、24個、32個... の LED を制御できるようになります。
すごいですねぇ~
今回の LEDマトリックスは 48ピンですので、シフトレジスタが 6個必要になります。
アノード制御と赤色/緑色LED の制御にそれぞれ 16ピンずつ使い、それぞれ独立して制御しようと思っているので、
シフトレジスタを2個ずつ、デイジーチェーンでつなげました。
これで、単純計算で 6 x 3 の 18本必要だった線が、3 x 3 の 9本で済みました。
次回
次は TLC5940 を使って調光をできるようにしたいなぁと思っていたのですが、
時間があまりないので全部シフトレジスタで制御するようにして、
実コードを書いていきたいと思います。
では。