なんかのときに秋月で買った5×7 ドットマトリクスLEDが家にあったんで光らせてみました。
今回はArduino (ProMicro)で5×7ドットマトリクスLEDを光らせて文字を出力するまでの手順を紹介しています。
原理確認のために、5×7ドットマトリクスLEDをゆっくりと光らせた動画も載せてますので、興味があればそちらだけでも見ていってください。→動画位置までジャンプ
ドットマトリクスLEDについて
ドットマトリクスLEDのデータシートを確認すると、中身の回路はこんな感じです。
光らせ方の原理は前回作ったキーマトリックススイッチと同じですね。
キーマトリックススイッチのスイッチ部をLEDに置き換えたものと言えます。
COL①~⑤を順番にHighにしていって、タイミングを合わせて光らせたい場所のROW①~⑦をLowにして電流を流すことで、特定のLEDだけを光らせることができます。
例えば左上端のLEDだけを光らせたければ、COL①がHighのタイミングでROW①をLowにすればいいですね。
(ROW②~⑦は電流が流れないようにHighか開放状態にします)
これを人の目にもとまらぬ速さで全LEDに対して行うと、残像効果でまるで全LEDが同時に光っているように見えるという算段です。
この記事の最後に、ドットマトリクスLEDをゆっくり光らせたときの動画も載せてます。
そちらを見れば、わかりやすいかも。→動画位置までジャンプ
回路を描いてみる
ドットマトリクス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”の表記があり、下図のように時計回りに割り当てられていると推測できます。
で、実際に回路を組んでコードを書き込むと…
”A”が表示されました!やったー!
何が起こってるか見てみる
5×7=35個のLEDを12本のピンで制御してるなんて不思議ですね。
原理は初めに説明した通りなんですが、本当に?って思いはありますよね。
ということで、コード中の一つ当たりの点灯時間を476usから100msくらいに伸ばしてみましょう。
すると、こうなります。
一つずつ順番に光らせている様子が見ることができましたね。
これを目にもとまらぬ速さで繰り返すことで”A”を表示させていたようです。
今回はこれで終わります。
おしまい。
[追記]
64×32ドットマトリクスLEDの光らせ方の紹介記事も公開しました。
こっちではカラーのドット絵とかも出力してます。
コメント