経緯
掃除していて自宅から以下の8×8LEDマトリクスが発掘されたのですが、使い方がいまいち分からなかったので、調べて使ったときのことを備忘録を兼ねてまとめます。
シフトレジスタ
このLEDマトリクスについて調べていくと、どうやらこれが商品として近そうでした。
データシート見ると、回路がマトリクスになっていて、ダイナミック点灯させれば制御できそうでした。
ただ、これを単純にArduinoで制御しようと思うと、アノード×8、カソード×8でピンを16本も使ってしまうため、他の用途でピンが使えなくなってしまうという悲しい自体があります。
それを解決するためにシフトレジスタを使うことを考えました。
このシフトレジスタをアノード用とカソード用に二個購入し、それぞれ接続しました。
実装
回路は以下サイトを参考にして、これにシフトレジスタを加えました。
接続図
今回は星を表示してみることにします。
コード
// シフトレジスタと繋いだピン
//アノードピン = APIN
const int APIN_SRCLK = 4;
const int APIN_RCLK = 3;
const int APIN_SER = 2;
//カソードピン = CPIN
const int CPIN_SRCLK = 7;
const int CPIN_RCLK = 6;
const int CPIN_SER = 5;
int APIN[] = { APIN_SRCLK, APIN_RCLK, APIN_SER };
int CPIN[] = { CPIN_SRCLK, CPIN_RCLK, CPIN_SER };
const byte Apatterns[] = {
B00011000,
B00100100,
B11000011,
B01000010,
B00100100,
B01111110,
B01000010,
B10000001,
};
const byte Cpatterns[] = {
B01111111,
B10111111,
B11011111,
B11101111,
B11110111,
B11111011,
B11111101,
B11111110,
};
void setup()
{
// ピンの設定と初期化
pinMode( APIN_SRCLK, OUTPUT );
pinMode( APIN_RCLK, OUTPUT );
pinMode( APIN_SER, OUTPUT );
pinMode( CPIN_SRCLK, OUTPUT );
pinMode( CPIN_RCLK, OUTPUT );
pinMode( CPIN_SER, OUTPUT );
digitalWrite( APIN_SRCLK, HIGH );
digitalWrite( APIN_RCLK, HIGH );
digitalWrite( APIN_SER, HIGH );
digitalWrite( CPIN_SRCLK, HIGH );
digitalWrite( CPIN_RCLK, HIGH );
digitalWrite( CPIN_SER, HIGH );
}
void loop()
{
for(int i = 0; i < 8; i++) {
// ラッチをLOWにする
digitalWrite(APIN_RCLK, LOW);
digitalWrite(CPIN_RCLK, LOW);
// シリアル信号を送信
shiftOut(APIN_SER, APIN_SRCLK, LSBFIRST, Apatterns[i]);
shiftOut(CPIN_SER, CPIN_SRCLK, LSBFIRST, Cpatterns[i]);
// ラッチをHIGHにする
digitalWrite(APIN_RCLK, HIGH);
digitalWrite(CPIN_RCLK, HIGH);
// 表示のためのDelay
delayMicroseconds(100);
// カソードのシリアル信号を送り、消灯させる
digitalWrite(CPIN_RCLK, LOW);
shiftOut(CPIN_SER, CPIN_SRCLK, LSBFIRST, B11111111 );
digitalWrite(CPIN_RCLK, HIGH);
}
}
無事LEDの星(に見えると嬉しい)が表示されました!
ピン6本で制御できるようになると色々応用しやすくなると思うので、楽しい電子工作ライフの一助になれば幸いです。