ArduinoでドットマトリクスLEDを遊ぶ [後半]

今回の記事は前回の

ArduinoでドットマトリクスLEDを遊ぶ [前編] - 僕が本当に働きたくないから書いていくブログ

の続きです。前回の記事を参照してもらうと閲覧数が増えてうれしいです。

今回は絵柄を表示させてみます

 前回に引き続きドットマトリクスLEDについての記事です。

アノード・カソードの組み合わせでLEDの点滅が制御でき、好きな位置のLEDを点灯させることができたのですが今回はその続きとして「好きな絵柄(マーク)の表示」をしてみます。

f:id:ten0313:20170719075448j:plain
前回の記事からの流用でもうしわけないです

まずはパターンの表示から

まず簡単なパターンをつくります。どうせなら動かしてみましょう。

配線は前回と同じでいきます。

スケッチは

void setup() {
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
pinMode(A0,OUTPUT);
pinMode(A1,OUTPUT);
pinMode(A2,OUTPUT);
pinMode(A3,OUTPUT);
pinMode(A4,OUTPUT);
pinMode(A5,OUTPUT);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
digitalWrite(A0,LOW);
digitalWrite(A1,LOW);
digitalWrite(A2,LOW);
digitalWrite(A3,LOW);
digitalWrite(A4,LOW);
digitalWrite(A5,LOW);
// put your setup code here, to run once:

}

void loop() {
digitalWrite(A0,HIGH);
digitalWrite(11,LOW);
delay(50);
digitalWrite(A1,HIGH);
digitalWrite(10,LOW);
delay(50);
digitalWrite(A2,HIGH);
digitalWrite(9,LOW);
delay(50);
digitalWrite(A3,HIGH);
digitalWrite(8,LOW);
delay(50);
digitalWrite(A4,HIGH);
digitalWrite(7,LOW);
delay(50);
digitalWrite(A5,HIGH);
digitalWrite(6,LOW);
delay(50);
digitalWrite(13,HIGH);
digitalWrite(5,LOW);
delay(50);
digitalWrite(12,HIGH);
digitalWrite(4,LOW);
delay(50);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
digitalWrite(A0,LOW);
digitalWrite(A1,LOW);
digitalWrite(A2,LOW);
digitalWrite(A3,LOW);
digitalWrite(A4,LOW);
digitalWrite(A5,LOW);
// put your main code here, to run repeatedly:

}

こんな感じ。宣言部分でマトリクスLEDの初期化をしてその後簡単な点滅をさせています。

動かしている動画です

youtu.be

最下段のLEDが光っていません。どうがんばっても光らないんですけど...初期不良だと予想しています。予備のモノで代用しようにも一つしか手元にないので今回はコレを使用していきます。ごめんなさい(前回のテストの時にはなんもなかったんですけど...)

可愛い絵柄を表示させます(媚び)

面白くもないスケッチや解説はストップにして可愛くてハイセンスなマークの表示をしてみます。可愛くてハイセンス...かわいくて...ハイセンス...

f:id:ten0313:20170720220615j:plain

はい!ハート!可愛いですね!

...安直すぎましたかね?良いと思ったんですが...

解説というか説明です。

さっきのパターン表示との違いに注目してください。

f:id:ten0313:20170720223306p:plain

わかりやすくなるようイラストを描きました

黒くなっている四角は点灯したマトリクスLEDのマスをイメージしています。

①のイラストを見てください。左上端から点灯する範囲が大きくなっているのを表しているのですが、これが最初に動かしていたパターン表示です。

次に②のイラストに注目してください。黒くなっている部分を光らそうとします。左上の一つのマスと右端と下に位置する「光らそうとしたポイント」の間には黄色いマスで表したマスが存在します。②で表した黒いマスすべてを一斉に光らそうとするとアノード・カソードの制御が全マスに適用されてしまい、③のように黄色く表示した光らせようとしなかったはずのマスまで光ってしまいます。

 

それではどのようにして②のような形で光らせればいいのでしょうか。

簡単です。列同士のアノード・カソードの干渉が起こらないように列を細切れにして点滅させれば問題は解決します。3つのパーツに分けて(例えば④⑤⑥のように縦に割って)切り替えれば②のような本来できないような点灯の方法も実現できます。

 

それを踏まえた上でハートマーク表示のスケッチです

void setup() {
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
pinMode(A0,OUTPUT);
pinMode(A1,OUTPUT);
pinMode(A2,OUTPUT);
pinMode(A3,OUTPUT);
pinMode(A4,OUTPUT);
pinMode(A5,OUTPUT);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
digitalWrite(A0,LOW);
digitalWrite(A1,LOW);
digitalWrite(A2,LOW);
digitalWrite(A3,LOW);
digitalWrite(A4,LOW);
digitalWrite(A5,LOW);
// put your setup code here, to run once:

}

void loop() {
digitalWrite(A0,HIGH);
digitalWrite(12,HIGH);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
digitalWrite(8,LOW);
delay(1);
digitalWrite(A0,LOW);
digitalWrite(12,LOW);
digitalWrite(10,HIGH);
digitalWrite(9,HIGH);
digitalWrite(8,HIGH);

digitalWrite(A1,HIGH);
digitalWrite(13,HIGH);
digitalWrite(11,LOW);
digitalWrite(7,LOW);
delay(1);
digitalWrite(A1,LOW);
digitalWrite(13,LOW);
digitalWrite(11,HIGH);
digitalWrite(7,HIGH);

digitalWrite(A2,HIGH);
digitalWrite(A5,HIGH);
digitalWrite(11,LOW);
digitalWrite(6,LOW);
delay(1);
digitalWrite(A2,LOW);
digitalWrite(A5,LOW);
digitalWrite(11,HIGH);
digitalWrite(6,HIGH);

digitalWrite(A3,HIGH);
digitalWrite(A4,HIGH);
digitalWrite(10,LOW);
digitalWrite(5,LOW);
delay(1);
digitalWrite(A3,LOW);
digitalWrite(A4,LOW);
digitalWrite(10,HIGH);
digitalWrite(5,HIGH);
// put your main code here, to run repeatedly:

}

 

ハートの形の点滅のスケッチの場合でも前述のとおり、ハートのマークを切り分け、それらを高速で点滅させることで表示させています。

完全に余談なんですが、僕なりのプログラムの工夫としてハートを単純に縦に8個に分けるのではなく、ハートが左右対称なことを利用し4つに分けて点滅させてわかりやすいプログラムにしています(このくらいでドヤ顔したらだめですか?良い考えだと思ったんですけどね...)

まとめです

今回は簡単な形でしたが可愛いハートのマークの表示と点滅の表示をしました。

8×8ってかなり表現として自由ですよね。どんなマークを表示させようか考えてる時にいろいろとやりたいことも出てきました。ネットで検索すると今回僕が書いたプログラムよりもかっこいいものも多くでてきます(それをいったらこの記事の存在意義とは...って話になる気もしますが)それらをみてみるのもすっごい面白いですよ。

今回も作ってて書いてて楽しかったです、読んでくださりありがとうございました。

 

 

[ この記事はブログ投稿者の憶測や考えによりつくられています。

よって書いてある内容に誤りや言い間違いがあるかもしれません。もし修正したほうがいい場所や「こういった言い方のほうが”ソレっぽい”よ」などがありましたら後に記載してあります、リンク先のツイッターアカウントに教えてくださると嬉しいです:) ]

 

twitter.com