ロボットを創ろう
ロボットを創ろうの掲示板 二足歩行ロボット掲示板 新型ロボットプランニング研究サークル

5.ドットマトリクス 16*32のLED
 

CN2 CN3
D 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
CN1 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

 たて1列を同時に点灯した場合は、点灯している個数により1列分の明るさが変わってしまいます。そのため、同時に光らせると全体的にばらつきのある表示になってしまいます。しかし、横1列の場合は、光らせる個数に関係なく明るさが決まります。このことから、横1列を同時に光らせるようにし、縦方向には高速で表示させます。

 このLEDの点灯は6ビットで行います。


番号 LED端子 マイコン端子
1 CLOCK ポートD-4
2 CN1 ポートD-1
3 CN2 ポートD-2
4 CN3 ポートD-3
5 LATCH ポートD-5
6 STROB ポートD-6

ビット 8 7 6 5 4 3 2 1
N.C. N.C. STROB LATCH CLOCK CN3 CN2 CN1

 まずは、データをシフトレジスタに読み込みます。次にシフトレジスタからラッチモジュールにデータを読み込み、出力ピンにデータが出力されます。

スタート
シフトレジスタに横1行分のデータを読み込む
ラッチモジュールにデータを読み込む
出力ピン(LED)にデータを出力する
(繰り返し)次の行の設定をする

■スタート
 マイコンの初期設定をします。どのポートを使うのかとか、タイマーなどの設定を行います。

■シフトレジスタに横1行分のデータを読み込む
 マイコンからLEDのシフトレジスタにデータを送ります。単純に信号を出すというだけのことなんですが、信号を出す順番が決められているので気をつけないと全く意図しない動作になってしまいます。壊れることはないのですが、LED全部を同時に光らせてしまうような信号を出すと電流が多く流れてしまい、マイコンと同じ電源を共有で使用しているときなどはマイコンがリセットされてしまうことがありました。

■ラッチモジュールにデータを読み込む
 全てのデータをマイコンからLEDのシフトレジスタに送り終わったら、次にLEDのシフトレジスタからLEDのラッチモジュールにデータを送ります。

■出力ピン(LED)にデータを出力する
 ラッチモジュールにデータが読み込まれると同時に、出力ピンにデータが出力されます。マイコン側では何もする必要はありません。ラッチモジュールにデータを送るという信号を出すだけです。

■次の行
 これらを繰り返すことによって全てのLEDを点灯させることができます。人間の目にはわからないくらい速い速度で動かすことで全てのLEDを同時に光らせているように見えます。ラッチモジュールにデータを送るまでは、前のデータが出力されています。


具体例

CN2 CN3
D 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
CN1 16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1

このように光らせるためにはどのような信号を出せばいいのかを紹介します。

光らせたいのは {CN1-D16 , CN2-D1} です。D○○というのはCLOCKで表現します。CLOCKは0と1を繰り返す信号で、順番はD16 D15 D14・・・というように大きな数字から小さな数字になっていきます。CNのデータはCLOCKの信号が1になった瞬間(立ち上がり)でシフトレジスタに読み込まれます。

D 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
CLOCK 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0
CN1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
CN2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
CN3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
LATCH 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1
STROBE 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0


{CN1-D16 , CN2-D1} を表現するのに、DはCLOCKで決まっているので、それにあわせて信号を出すことになります。CLOCKの立ち上がりでデータがシフトレジスタに読み込まれるので、立ち上がる前に信号を出力しておきます。

D 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
CLOCK 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0
CN1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
CN2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
CN3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
LATCH 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1
STROBE 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

シフトレジスタに読み込まれたデータをラッチモジュールに読み込むにはLATCH信号を0から1にします。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
D 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
CLOCK 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0
CN1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
CN2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
CN3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
LATCH 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1
STROBE 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0



このプログラムをもう少しスマートにしてみます。


このプログラムではled()関数によって光らせたいドットを指定することができるようになっています。しかし、1個しか光らせることはできません。

(このプログラムは動きますが・・・ワーニングがでます。あと、すっごくマイコンに負担をかけてるので表示は遅くなります)

このページで紹介している写真は無断で転載することを禁止します。ただし、記事を模倣してロボットを創ることは大歓迎です。