さて、なんとなくArduinoの入出力になれてきた気もしてきた今日この頃ですが、今日は赤色ドットマトリクスLEDを使って文字の表示に挑戦してみました。
赤色ドットマトリクスLEDとは
赤色ドットマトリクスLEDというのは、こんな見た目をしています。 表面には8x8で64個のLEDがあって、裏面には16本のピンがあります。 この白い○みたいなものが一つ一つLEDで、設定によって光ったり光らなかったりするわけです。
秋月電子で購入しました。(赤色ドットマトリクスLED(OSL641501-ARA))(説明書)
LEDの極性を調べる
さて、説明書を読んでみたんですけど、裏面の16本のうち、どのピンとどのピンの間に電流を流せばどのLEDが光るのかちっともわからなかったので、ピン一本一本の仕様を確認してみました。
そもそも、LED(発光ダイオード)っていうのは、抵抗などと違って電流の流れる向きと流れない向きがあるんですよね。 電子部品では、バッテリーのプラスにつなぐ方をアノード、マイナスにつなぐ方をカソードというそうです。 アノードとカソードを逆向きにつなぐと、発光ダイオードが光らないだけではなく、電圧によっては発光ダイオードが壊れてしまうとか。
とりあえず、どのピンがアノードでどのピンがカソードを調べるために、Arduionoのミニブレッドボードで簡易検査機を作ってみました。
こんな(↓)感じで回路をくんで、普通のLEDでテスト。そのあと、赤色ドットマトリクスLEDのピンの一本一本をチェックしてみました。
赤色ドットマトリクスLEDのアノードピンとカソードピン
両側に8本ずつのピンがついているので、てっきり片方の8本がアノード、もう片方の8本がカソードだとばかり思っていましたが、アノードとカソードがぐちゃぐちゃにまざっているんですね。 (写真で赤い○がついているのがアノードピン、黄色い○がカソードピンです。)
ピン番号13のアノードピンからピン番号9のカソードピンにだけ電流を流すと、画面のすみっこのLEDだけが光るということです。
一つだけLEDを光らせる
ここまでわかったので、一つだけLEDを光らせてみることにします。 回路はこんな感じで。
ソースコードはこちらです。 アノードピンをLOW、カソードピンをHIGHで初期化。 そのあとピン番号13のアノードピンをHIGH、ピン番号9のカソードピンをLOWにすると、すみっこのピンだけが光るというわけです。 (もしカソードピンをLOWで初期化してしまうと、この時にすべてのピン番号13のアノードピンからすべてのカソードピンに電流が流れて、LEDが一列光ることになります。)
void setup(){ pinMode(A0,OUTPUT); // pin1 cathode pinMode(A1,OUTPUT); // pin2 cathode pinMode(A2,OUTPUT); // pin3 anode pinMode(A3,OUTPUT); // pin4 anode pinMode(A4,OUTPUT); // pin5 cathode pinMode(2,OUTPUT); // pin6 anode pinMode(3,OUTPUT); // pin7 cathode pinMode(4,OUTPUT); // pin8 cathode pinMode(5,OUTPUT); // pin9 cathode pinMode(6,OUTPUT); // pin10 anode pinMode(7,OUTPUT); // pin11 anode pinMode(8,OUTPUT); // pin12 cathode pinMode(9,OUTPUT); // pin13 anode pinMode(10,OUTPUT); // pin14 cathode pinMode(11,OUTPUT); // pin15 anode pinMode(12,OUTPUT); // pin16 anode digitalWrite(A0,HIGH); digitalWrite(A1,HIGH); digitalWrite(A2,LOW); digitalWrite(A3,LOW); digitalWrite(A4,HIGH); digitalWrite(2,LOW); digitalWrite(3,HIGH); digitalWrite(4,HIGH); digitalWrite(5,HIGH); digitalWrite(6,LOW); digitalWrite(7,LOW); digitalWrite(8,HIGH); digitalWrite(9,LOW); digitalWrite(10,HIGH); digitalWrite(11,LOW); digitalWrite(12,LOW); } void loop(){ digitalWrite(9,HIGH); // pin13 digitalWrite(5,LOW); // pin9 }
全部のLEDを順番に光らせる
次に、ループをまわしてすべてのLEDを順々に光らせます。
回路は同じもので、ソースコードはこちら。 (ピン番号を配列で整理しました。)
int anode[8] = {9,A2,A3,6,2,7,11,12}; int cathode[8] = {5,10,4,8,A0,3,A1,A4}; void setup(){ for(int i=0; i<8;i++){ pinMode(anode[i],OUTPUT); digitalWrite(anode[i],LOW); } for(int i=0; i<8;i++){ pinMode(cathode[i],OUTPUT); digitalWrite(cathode[i],HIGH); } } void loop(){ for( int i=0; i<8;i++){ for( int j=0; j<8; j++){ digitalWrite(anode[j],HIGH); digitalWrite(cathode[i],LOW); delay(100); digitalWrite(anode[j],LOW); digitalWrite(cathode[i],HIGH); } } }
動作するとこんな感じです。 (一列目のLEDだけ動作が変なんですよね。これはパーツに問題があるんだと思いますが……。)
文字を表示してみる
次に肝心の文字を表示してみます。 上のソースコードを変更して、特定のLEDだけを光らせてみました。
定常的に光らせているとばかり思っていたんですが、ドットマトリクスLEDの構造上、同時に複数のLEDを光らせるのは難しいんですね。 一回に一つLEDを表示させ、それを速いスピードで切り替えることによって残像効果で文字を表示しているそうです。
ここではひらがなの「あ」を表示させています。
int anode[8] = {9,A2,A3,6,2,7,11,12}; int cathode[8] = {5,10,4,8,A0,3,A1,A4}; boolean hiragana_a[8][8] = { { 0, 0, 1, 0, 0, 0, 0, 0 }, { 1, 1, 1, 1, 1, 1, 0, 0 }, { 0, 0, 1, 0, 0, 0, 0, 0 }, { 0, 0, 1, 1, 1, 1, 0, 0 }, { 0, 1, 1, 0, 0, 1, 1, 0 }, { 1, 0, 1, 0, 1, 0, 1, 0 }, { 1, 0, 0, 1, 0, 0, 1, 0 }, { 0, 1, 1, 0, 0, 1, 0, 0 } }; void setup(){ for(int i=0; i<8;i++){ pinMode(anode[i],OUTPUT); digitalWrite(anode[i],LOW); } for(int i=0; i<8;i++){ pinMode(cathode[i],OUTPUT); digitalWrite(cathode[i],HIGH); } } void loop(){ for( int i=0; i<8;i++){ for( int j=0; j<8; j++){ if( hiragana_a[i][j]){ digitalWrite(anode[j],HIGH); digitalWrite(cathode[i],LOW); digitalWrite(anode[j],LOW); digitalWrite(cathode[i],HIGH); } } } }
写真はこちらです。 (一列目の表示がちょっと変ですが……。)
まとめ
ドットマトリクスLEDってもう少し楽に使えるパーツかと思っていましたが、意外に難しいんですね。 パーツに、ピン番号などが書いていなかったので結構わかりにくかったんですけど、電子工作ってこんなもんなんでしょうか。
なお、下記のページを参考にさせていただきました、ありがとうございました。
(パーツに問題があるときには返品できるのかな……。)