8x8マトリクスLED Charlieplexing
8x8マトリクスLED Charlieplexing
- Charlepexing
- Cahrlieplexingの拡張
- ドライブ用トランジスタをポートの数だけ使う.(Chipiplexing)
- Charlieplexとトランジスタを2個使う
- マトリクスLEDの駆動
- SCRのカソード ←'L'
- SCRのゲート ←'H', 他SCRのゲート←'Z'
- SCRのカソード ←データ(Active'L')
- P1←'H' → SCR1 ON
- LED(1,2) → SCR2ゲート → SCR2 ON
- P(0-7) ← 'ZZZZZZZZ' (ALL_OFF)
- P(x) ← 'H',
P(x以外) ← 'L' (SCR(x) ON) - if D(n)='1' then P(n) ← 'L'
else P(n) ← 'Z' (データ出力負論理) - 実装例
- 3つのポートで12個のLEDを駆動
- 8つのポートで市販の8x8LEDを駆動
charlieplexingは少ないポートで多くのLEDを制御する方法である。
初めて見たのは、EDNのコラムDesign Idiaに投稿された「LEDの多重制御で必要なI/O端子数を削減 」や「少ないI/Oで多数のLEDを制御、同時点灯も可能」で、誰でも同じことを考えるものだと思った。(ホントに)
2つのポートを使用して2個のLEDをcharlieplexで制御する方法は、
←誰でも思いつくでしょ
これを2個以上のn個ポートに拡張すると
LED = n×(n-1)
のLEDが 制御できる。
Charliepaxingについてはエレキジャックに「超Low-EndマイコンRS08を使おう - MC9RS08KA2に多くのLEDを接続する (1)」という解説がある。
CharliePlexの問題点は、基本的に1個のLEDしか制御できないため、LEDが多くなるとデューティー比が小さくなりピーク電流を多く流さなければならなくなるが、I/Oポートのドライブ能力が低い場合には十分な電流が流せないという点である。
問題を解決したCharlieplexの拡張版がいろいろある。
I/Oポートのドライブ能力十分でない場合は複数のLEDを点灯できないが、Design Ideasにある「少ないI/Oで多数のLEDを制御、同時点灯も可能」のように電流ドライブ用のトランジスタを使うと複数のLEDが制御できる。Chipiplexing というらしい。
トランジスタをエミッタフォロアで使っているところがミソである。
また、AVRのようにドライブ能力が高いマイコンはダイオードを使用することもできる。
Chipiplexing方式(Charlieplexの拡張)を使うと、7segLEDは9桁が9本のI/Oで駆動でき、DPを使用しないなら8本のI/Oで8桁が制御可能である。
CharlieplexをマトリクスLEDで使おうとするとちょっと厳しい。
↑のように接続すると、左上を(0,0)とすると(1,1), (2 2)...(n,n)が駆動できない。
1本追加して↓のように配線すると全てのLEDが駆動できるのだが、
巷で売られているマトリクスLEDは
全て↓のように配線されている。
「Three microcontroller ports drive 12 LEDs(December 15, 2006)」(EDN日本語版にも記事があったはずだが)を組み合わせると
更に多くのLEDを制御可能で
LED = n×(n-1) + 2n
が制御可能である。
市販のマトリクスLEDは何本のI/Oで駆動できるか考えてみる。
Chipiplexing方式のトランジスタをサイリスタに変えると、N×NのマトリクスLEDは同じようにN+1本で制御できそうだ。サイリスタは一旦ONするとゲート電流を流し続ける必要がなくなるのでLED点灯用データが出力できるようになるというもの。
で駆動することを考えると、
となり、SCR2がONしてしまう。
SCR2がONしないようにするには、SCR2のゲート(P1)を'L'にしておく必要があるのだが、SCR2のゲートとSCR1のカソードは繋がっているので、P1を'L'にするとLED(1,2)が点灯してしまう。
つまり、SCR1だけONしようとするとLED(1,2)~LED(1,7)までのLEDが全て点灯することになる。
このとき、SCR1はゲートを'L'にしても、SCR1→LED(1,2)→P1 で電流が流れているので、SCR1のカソードに接続されたR9やポートP9は必要ない。
任意の列(x)にデータD(0-7)を出力する方法は
でよい。
つまり、市販のN×NのマトリクスLEDはN個のポートで制御できる。
SCRをONにする期間(2)に関係のないLEDが点灯するが、SCRをONにする期間(2)がデータを出力している期間(3)と比較して短時間であれば人間には見えないだろう
ソースは↓こんな感じ
void disp_col(uint8_t col, uint8_t data) { ALL_OFF(); _delay_us(50); COL_ON(col); /* colmun on */ _delay_us(10); /*※ 用調整 */ PORTB = 0x00; DDRB = data; } |
※SCRのゲートをONした後の時間待ちは電源電圧によって異なるので用調整。
↓の回路図で常時P9を'Z'とする方法で試してみた。
↓06:55と23:55
←リンク先にAVI
(ちょっと見にくい)
Binary clock
バイナリクロックは時刻を2進数で表示する時計で、例えば10:39分は
○ | ● | ||
○ | ○ | ○ | |
○ | ● | ○ | |
● | ○ | ● | ● |
1 | 0 | 3 | 9 |
のように表示する。
LEDで表示しようとすると12個のLEDが必要である。これをCharlieplexingでATTiny45の3つのI/Oを使って実装してみた。
リセット時には、全てのLEDが右下から順に点灯し、11:40からカウントが始まる。
時分しか表示できないので撮影用に1秒毎にカウントアップするようにしている。
I/Oポートがもう一個あって4個あるなら普通にCharlieplexingで駆動するのが簡単だと思う。
本当に時計として使うならC3をトリマに変えて発振周波数を合わせる必要がある。
無調整時の周波数精度10-4とすると、1日で 最大3600×24×10-4=±8.64[sec] くらいずれる。10-5まで追い込むと日差1秒以内に収まりそうだけれど、追い込みに時間がかかるので、TCXOを使うのが現実的だろう。
月差1秒を実現するには1/(3600×24×30)=3.86-7 なのでオーブンを使わないと難しいのかな。
8Queen
チェスの盤に8個のQueenを互いに取られない(進路の邪魔にならない)ように配置するというもので、
コンピュータで解くならば虱潰しで解いても大した計算量ではない。
再帰で書くとカッコ良いがメモリが少ないとスタック(メモリ)が足りなくなるので組み込み用マイコンで解こうとすると結構遊べる。
もっと早く解けるのだが、バックトラックの過程が見えないので遅くしてある。
解けるとちょっと止まる。
Life game
昔のマイコン雑誌にはLife gameがよく載っていた。最初面白いゲームかと思ってソースを打ち込んだら、ただのシュミレーションでがっかりしたことがあった。
(2013/4/22)
« 自分の強みを活かすというアホらしい発想 | トップページ | ビジネス書を読んでもデキる人にはなれない »
コメント