手っ取り早くマトリックスLEDを使う [Arduino]
マトリックスLEDを使いたくても、16本の配線がネックになります。
手っ取り早くマトリックスLEDをつかう方法を思いついたのでやってみました。
ArduinonPro Mini (およびその互換機) を使う方法です。
単色でピンの列の間が600milのものだとぴったりはまります。
今回は以前に aitendo という通販のお店で購入した、SZ420788K というものを使いました。
aitendo
http://www.aitendo.com/
こんな感じでソケットをつけます。
配線は一切なく、ピンソケットとシリアル&電源のピンをはんだ付けするだけです。
ソケットは普通のピンソケットを使うとゆるゆるなので、丸ピンICソケットを使用しました。
丸ピンICソケット (シングル40P): パーツ一般 秋月電子通商 電子部品 ネット通販
http://akizukidenshi.com/catalog/g/gP-01591/
今回使用したマトリックスLED (SZ420788K) のデータです。
だいたいどのマトリックスLEDも同様のピンアサインのようです。
またピンの順番も通常のICと同様の割り振り方です。
とりあえず表示するということでスケッチをかいてみました。
データシート上は左から列を数えていますが、左を上位ビットにするとそのまま2進表記と一致するので逆としました。
ドットごとの書き換えだと、64回に1回の点灯になるので暗くなりますが、各ドットは明るさ均等のはず。
それに対して、行ごとの書き換えだと、8回に1回の点灯になるので明るくなりますが、おそらく1行全灯した場合にはLOW に流れる電流が多くなるものの引き込める電流に限界があるだろうということで輝度が不均一になることが考えられたり、電流制限抵抗もなにもはさんでいないので点灯時間は短くしたほうがいいということも考えれるのかと思っています。
行ごとで書き換えだけにして表示しつづけた場合ボードが熱くなりました。
アノードコモンのマトリックスLEDを使う場合には、digitalWrite() の出力をすべて逆にすればOK。
手っ取り早くマトリックスLEDをつかう方法を思いついたのでやってみました。
ArduinonPro Mini (およびその互換機) を使う方法です。
単色でピンの列の間が600milのものだとぴったりはまります。
今回は以前に aitendo という通販のお店で購入した、SZ420788K というものを使いました。
aitendo
http://www.aitendo.com/
こんな感じでソケットをつけます。
配線は一切なく、ピンソケットとシリアル&電源のピンをはんだ付けするだけです。
ソケットは普通のピンソケットを使うとゆるゆるなので、丸ピンICソケットを使用しました。
丸ピンICソケット (シングル40P): パーツ一般 秋月電子通商 電子部品 ネット通販
http://akizukidenshi.com/catalog/g/gP-01591/
今回使用したマトリックスLED (SZ420788K) のデータです。
だいたいどのマトリックスLEDも同様のピンアサインのようです。
またピンの順番も通常のICと同様の割り振り方です。
とりあえず表示するということでスケッチをかいてみました。
// Arduino Pro Miniで手っ取り早くマトリックスLEDを使うスケッチ (Arduino Pro Mini専用)
// (SZ420788K: 8x8, 0.8inch, カソードコモン)
const uint8_t MATRIX_ROW[] = { 2, 7, 17, 5, 10, 16, 11, 14 }; // 行 → デジタルピン番号
const uint8_t MATRIX_COL[] = { 9, 8, 4, 15, 3, 13, 12, 6 }; // 列 → デジタルピン番号 (左からMSB -> LSB)
uint8_t smile[] = { // にこにこ
B00111100,
B01000010,
B10100101,
B10000001,
B10100101,
B10011001,
B01000010,
B00111100 };
void setup() {
for( int i = 2; i <= 17; i++ ) pinMode( i, OUTPUT ); // デジタル2~17まで出力ピン設定
}
void loop() {
unsigned int i;
// ドットごと、行ごとでの表示で明るさの比較
for( i = 0; i < 64000; i++ ) {
matrix_update_dot( smile ); // ドットごとの書き換え
}
for( i = 0; i < 1000; i++ ) {
matrix_update_line( smile ); // 行ごとの書き換え
delay(1); // delay(1) を入れることで明るくなる
}
}
void matrix_update_dot( uint8_t *d ) { // 1ドットずつ更新(暗いが明るさ均一)
static uint8_t row, col;
digitalWrite( MATRIX_COL[ col ], LOW );
if( ++col == 8 ) {
col = 0;
digitalWrite( MATRIX_ROW[ row ], HIGH );
row = ( row + 1 ) % 8;
digitalWrite( MATRIX_ROW[ row ], LOW );
}
digitalWrite( MATRIX_COL[ col ], ( *( d + row ) >> col ) & 1 );
}
void matrix_update_line( uint8_t *d ) { // 1行ずつ更新(明るいが明るさ不均一)
static uint8_t row, col;
digitalWrite( MATRIX_ROW[ row ], HIGH );
row = ( row + 1 ) % 8;
for( col = 0; col < 8; col++ ) digitalWrite( MATRIX_COL[ col ], ( *( d + row ) >> col ) & 1 );
digitalWrite( MATRIX_ROW[ row ], LOW );
}
データシート上は左から列を数えていますが、左を上位ビットにするとそのまま2進表記と一致するので逆としました。
ドットごとの書き換えだと、64回に1回の点灯になるので暗くなりますが、各ドットは明るさ均等のはず。
それに対して、行ごとの書き換えだと、8回に1回の点灯になるので明るくなりますが、おそらく1行全灯した場合にはLOW に流れる電流が多くなるものの引き込める電流に限界があるだろうということで輝度が不均一になることが考えられたり、電流制限抵抗もなにもはさんでいないので点灯時間は短くしたほうがいいということも考えれるのかと思っています。
行ごとで書き換えだけにして表示しつづけた場合ボードが熱くなりました。
アノードコモンのマトリックスLEDを使う場合には、digitalWrite() の出力をすべて逆にすればOK。