MENU

5x7ドットマトリクスLEDで文字を出力してみる

なんかのときに秋月で買った5x7 ドットマトリクスLEDが家にあったんで光らせてみました。

今回はArduino (ProMicro)で5x7ドットマトリクスLEDを光らせて文字を出力するまでの手順を紹介しています。
原理確認のために、5x7ドットマトリクスLEDをゆっくりと光らせた動画も載せてますので、興味があればそちらだけでも見ていってください。→動画位置までジャンプ

ドットマトリクスLEDについて

ドットマトリクスLEDのデータシートを確認すると、中身の回路はこんな感じです。

f:id:moutakusan:20201103210417p:plain
5x7ドットマトリックス回路図

光らせ方の原理は前回作ったキーマトリックススイッチと同じですね。

geekyfab.com

キーマトリックススイッチのスイッチ部をLEDに置き換えたものと言えます。

COL①~⑤を順番にHighにしていって、タイミングを合わせて光らせたい場所のROW①~⑦をLowにして電流を流すことで、特定のLEDだけを光らせることができます。 例えば左上端のLEDだけを光らせたければ、COL①がHighのタイミングでROW①をLowにすればいいですね。
(ROW②~⑦は電流が流れないようにHighか開放状態にします)

これを人の目にもとまらぬ速さで全LEDに対して行うと、残像効果でまるで全LEDが同時に光っているように見えるという算段です。

この記事の最後に、ドットマトリクスLEDをゆっくり光らせたときの動画も載せてます。
そちらを見れば、わかりやすいかも。→動画位置までジャンプ

回路を描いてみる

ドットマトリクスLEDを光らせるための回路はこんな感じにしました。

f:id:moutakusan:20201103220236p:plain
5x7ドットマトリクスLED点灯回路
抵抗はLEDに流れる電流を制限して、LEDの明るさを調整するためのものです。
抵抗値は、LEDに流したい電流値とデータシートに書いてあるLEDの順方向電圧から計算します。
今回は、電流を適当に10mAとして、順方向電圧が3.2Vくらいになるようなので、
  (5-3.2)V/0.01A = 180ohm
の抵抗を使用しました。

コードを書いてみる

COL①~⑤をHighに走査して、タイミングを合わせてROW①~⑦をLOWにします。
とりあえず、"A"と出力してみましょうか。

const int columnPinNumber[] = {9,10,14,15,16};
const int rowPinNumber[] = {2,3,4,5,6,7,8};

// "A"
bool LEDMatrix[7][5] ={
  {0,1,1,1,0},
  {1,0,0,0,1},
  {1,0,0,0,1},
  {1,0,0,0,1},
  {1,1,1,1,1},
  {1,0,0,0,1},
  {1,0,0,0,1}
};

void init5x7DotMatrixLED(int columnPinNumber[5], int rowPinNumber[7]);
void bright5x7DotMatrixLED(int columnPinNumber[5], int rowPinNumber[7], bool LEDMatrix[7][5]);
void openDrain(int pin, bool state);

void setup() {
  init5x7DotMatrixLED(columnPinNumber,rowPinNumber);
}

void loop() {
  bright5x7DotMatrixLED(columnPinNumber,rowPinNumber,LEDMatrix);
}

//5x7 Dot Matrix LED初期化関数
void init5x7DotMatrixLED(int columnPinNumber[5], int rowPinNumber[7]){
  for(int i=0; i<=4; i++){
    pinMode(columnPinNumber[i],OUTPUT);
    digitalWrite(columnPinNumber[i],LOW);
  }

  for(int i=0; i<=6; i++){
    openDrain(columnPinNumber[i],HIGH);
  }
}

//5x7 Dot Matrix LED 点灯関数
void bright5x7DotMatrixLED(int columnPinNumber[5], int rowPinNumber[7], bool LEDMatrix[7][5]){
  for(int i=0; i<=4; i++){
    digitalWrite(columnPinNumber[i],HIGH);
    for(int j=0; j<=6; j++){
      openDrain(rowPinNumber[j],1-LEDMatrix[j][i]);
      delayMicroseconds(476);     //=60Hz
      openDrain(rowPinNumber[j],HIGH);
    }
    digitalWrite(columnPinNumber[i],LOW);
  }
}

//オープンドレイン動作関数
void openDrain(int pin, bool state){
  if(state == HIGH){
    pinMode(pin,INPUT);
  }
  else if (state == LOW){
    pinMode(pin,OUTPUT);
    digitalWrite(pin,LOW);    
  }
}

オープンドレイン動作関数について少し補足です。
Arduinoの出力ピンはハイインピーダンス(開放)出力ができないため、ピンを入力に切り替えて無理やりハイインピーダンスにする必要があります。
そんなことをやっているのがオープンドレイン動作関数さんです。

動かしてみる

では、実際に回路を組んで動かしてみましょう。

かなり簡単な回路なんですが、一点だけ、ドットマトリクスLEDのピン配置がなぜかデータシートに書かかれていませんでした。
いや、書かれてはいるんですがデータシートに書かれてるような識別マークは手元のものには書いてないし、どちらにしろ1ピンの位置しかわからない内容だし…

ともかく、裏面から見ると透明な樹脂のしたにうっすらと”1”と”12”の表記があり、下図のように時計回りに割り当てられていると推測できます。

f:id:moutakusan:20201107153429p:plain
5x7ドットマトリックスLED ピン配置

で、実際に回路を組んでコードを書き込むと…

f:id:moutakusan:20201107154735p:plain
”A”が表示された!!

”A”が表示されました!やったー!

何が起こってるか見てみる

5x7=35個のLEDを12本のピンで制御してるなんて不思議ですね。
原理は初めに説明した通りなんですが、本当に?って思いはありますよね。

ということで、コード中の一つ当たりの点灯時間を476usから100msくらいに伸ばしてみましょう。
すると、こうなります。

f:id:moutakusan:20201107161520g:plain
スロー点灯
一つずつ順番に光らせている様子が見ることができましたね。
これを目にもとまらぬ速さで繰り返すことで”A”を表示させていたようです。


今回はこれで終わります。

おしまい。


[追記]
64x32ドットマトリクスLEDの光らせ方の紹介記事も公開しました。
こっちではカラーのドット絵とかも出力してます。 geekyfab.com