フォト
無料ブログはココログ

MyList

8x8マトリクスLED Charlieplexing

8x8マトリクスLED Charlieplexing

Charlepexing

charlieplexingは少ないポートで多くのLEDを制御する方法である。
初めて見たのは、EDNのコラムDesign Idiasに投稿された「LEDの多重制御で必要なI/O端子数を削減 」や「少ないI/Oで多数のLEDを制御、同時点灯も可能」で、誰でも同じことを考えるものだと思った。(ホントに)

2つのポートを使用して2個のLEDをcharlieplexで制御する方法は、
Charlieplex0←誰でも思いつくでしょ

これを2個以上(n個)のポートに拡張すると
LED = n×(n-1)
のLEDが 制御できる。
 Charlieplexingについてはエレキジャックに「超Low-EndマイコンRS08を使おう - MC9RS08KA2に多くのLEDを接続する (1)」という解説がある。

 ↓3ポートで 6個のLEDを制御する例)
Charlieplex1

 CharliePlexの問題点は、基本的に1個のLEDしか制御できないため、LEDが多くなるとデューティー比が小さくなりピーク電流を多く流さなければならなくなるが、I/Oポートのドライブ能力が低い場合には十分な電流が流せないという点である。

Cahrlieplexingの拡張

 問題を解決したCharlieplexの拡張版がいろいろある。

ドライブ用トランジスタをポートの数だけ使う.(Chipiplexing)

 I/Oポートのドライブ能力が十分でない場合は複数のLEDを点灯できないが、Design Ideasにある「少ないI/Oで多数のLEDを制御、同時点灯も可能」のように電流ドライブ用のトランジスタを使うと複数のLEDが制御できる。Chipiplexing というらしい。
 トランジスタをエミッタフォロアで使っているところがミソである。
Charlieplex2
また、AVRのようにドライブ能力が高いマイコンはダイオードを使用することもできる。

 Chipiplexing方式(Charlieplexの拡張)を使うと、7segLEDは9桁が9本のI/Oで駆動でき、DPを使用しないなら8本のI/Oで8桁が制御可能である。

Charlieplex7seg

 CharlieplexをマトリクスLEDで使おうとするとちょっと厳しい。

Charlieplexmatrix1

↑のように接続すると、左上を(0,0)とすると(1,1), (2,2)...(n,n)が駆動できない。

1本追加して↓のように配線すると全てのLEDが駆動できるのだが、

Charlieplexmatrix3

巷で売られているマトリクスLEDは
全て↓のように配線されている。

Matrix

Charlieplexとトランジスタを2個使う

Three microcontroller ports drive 12 LEDs(December 15, 2006)」(EDN日本語版にも記事があったはずだが)を組み合わせると
更に多くのLEDを制御可能で
LED = n×(n-1) + 2n
が制御可能である。

 ↓は3ポートで12個のLEDを制御する例
Charlieplex4

マトリクスLEDの駆動

市販のマトリクスLEDは何本のI/Oで駆動できるか考えてみる。

 Chipiplexing方式のトランジスタをサイリスタに変えると、N×NのマトリクスLEDは同じようにN+1本で制御できそうだ。サイリスタは一旦ONするとゲート電流を流し続ける必要がなくなるのでLED点灯用データが出力できるようになるというもの。

↓のように配線されているマトリクスLEDの駆動について

8x8matrixled

  1. SCRのカソード    ←'L'
  2. SCRのゲート     ←'H', 他SCRのゲート←'Z'
  3. SCRのカソード    ←データ(Active'L')

で駆動することを考えると、

 SCRのカソードとゲートは↓のように接続されているので

8x8led3

  1. P1←'H' → SCR1 ON
  2. LED(1,2) → SCR2ゲート → SCR2 ON

となり、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)を出力する方法は

  1. P(0-7)   ← 'ZZZZZZZZ'       (ALL_OFF)
  2. P(x)      ← 'H',  
    P(x以外) ← 'L'         (SCR(x) ON)
  3. if D(n)='1' then P(n)  ← 'L'
    else        P(n) ← 'Z'  (データ出力負論理)

でよい。

つまり、市販の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'とする方法で試してみた。

8x8led1

↓06:55と23:55
8x8led_8io ←リンク先にAVI
(ちょっと見にくい)

実装例

3つのポートで12個のLEDを駆動

Binary clock

 バイナリクロックは時刻を2進数で表示する時計で、例えば10:39分は

   
 
 

のように表示する。

 LEDで表示しようとすると12個のLEDが必要である。これをCharlieplexingでATTiny45の3つのI/Oを使って実装してみた。
Binaryclock20267
←リンク先にAVI

Binclock

 リセット時には、全ての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×10-7 なのでオーブンを使わないと難しいのかな。

8つのポートで市販の8x8LEDを駆動

8Queen

 チェスの盤に8個のQueenを互いに取られない(進路の邪魔にならない)ように配置するというもので、
コンピュータで解くならば虱潰しで解いても大した計算量ではない。
 再帰で書くとカッコ良いがメモリが少ないとスタック(メモリ)が足りなくなるので組み込み用マイコンで解こうとすると結構遊べる。
8queen0186
←リンク先にAVI(2.4Mb)

 もっと早く解けるのだが、バックトラックの過程が見えないので遅くしてある。
解けるとちょっと止まる。

Life game

 昔のマイコン雑誌にはLife gameがよく載っていた。最初面白いゲームかと思ってソースを打ち込んだら、ただのシミュレーションでがっかりしたことがあった。

Lifegame ←リンク先にAVI(3.4Mb)


(2013/4/22)

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)