6ピンI / Oを備えたAtmel ATtiny13を使用しています。15個のLEDを制御したいのですが、すべてを接続する方法がわかりません。なんらかの多重化がなければ、一度に6つのLEDしか制御できないようです。マイクロコントローラーのサイズのため、6つのLEDに制限されていますか?
6ピンI / Oを備えたAtmel ATtiny13を使用しています。15個のLEDを制御したいのですが、すべてを接続する方法がわかりません。なんらかの多重化がなければ、一度に6つのLEDしか制御できないようです。マイクロコントローラーのサイズのため、6つのLEDに制限されていますか?
回答:
少数のIOピンから多数のLEDを駆動するために使用できる方法がいくつかあります。
最も単純なのは、標準の行/列表示の多重化です。この手法では、n個の IOピンを備えた個のLEDを駆動できます。数学的には、デューティサイクルは次のとおりです。
つまり、この手法では、すべてのLEDが点灯している場合(またはすべての行またはすべての列が同一である場合)のデューティサイクルは100%であり、対角線を点灯する必要がある場合(またはすべての行が異なる場合)のデューティサイクルは)。すべてのLEDまたは1つのLED(または0個のLEDを点灯しますが、実際にはそれほど重要ではありません)を点灯すると、100%のデューティサイクルしか保証されません。
少し複雑なのはCharlieplexingです。この技術を使用すると、ドライブすることができ付きのLED のn IOピン。この手法で同時に点灯できるのはn − 1個のLED だけです。数学的には、デューティサイクルは次のとおりです。
ここで、同時セットは、共通のアノードまたは共通のカソードを持つLEDの一意のグループです。(これは証明されていません。問題を1分間熟考した後でたどり着いたものです。デューティサイクルがあなたにとって重要である場合、これをさらに詳しく検討する必要があります。)これは、両方ともより複雑な計算ですそして、標準的な多重化の同等の計算よりも計算上。事実上、すべてのLEDが点灯している場合、デューティサイクルが得られますが、n-1以下のLEDの一部(一部のみ)のパターンは100%のデューティサイクルを持つことができます。1つのLEDを点灯するときのみ、100%のデューティサイクルが保証されます。
最後に言及する方法は、シフトレジスタまたはIOエクスパンダを使用することです。2つのピン(Rawデータ/クロックインターフェイス、I2C、または単方向SPI)を使用すると、任意の数のLEDを制御できます。すべてのパターンのデューティサイクルは100%ですが、更新率はLEDの数に反比例します。これは最もコストのかかる方法です。15個のLEDの場合、IOピンの数が多いマイクロにアップグレードする方が安上がりです。
例:
3つのピン上の6つのLED:
PINS LEDS
0 1 2 1 2 3 4 5 6
0 0 0 0 0 0 0 0 0
0 1 Z 1 0 0 0 0 0
1 0 Z 0 1 0 0 0 0
Z 0 1 0 0 1 0 0 0
Z 1 0 0 0 0 1 0 0
0 Z 1 0 0 0 0 1 0
1 Z 0 0 0 0 0 0 1
0 0 1 0 0 1 0 1 0
0 1 0 1 0 0 1 0 0
0 1 1 1 0 0 0 1 0
1 0 0 0 1 0 0 0 1
1 0 1 0 1 1 0 0 0
1 1 0 0 0 0 1 0 1
1 1 1 0 0 0 0 0 0
多重化(ダイレクトドライブ)を使用しない場合、6つのLEDに制限されます。
charlieplexingを使用すると、nピンからn *(n-1)個のLEDを駆動できます。
I / Oエクスパンダまたはシフトレジスタを使用すると、実質的に無制限の数のLEDを駆動できます。
例:MCP23008 8ビットI2C I / Oエクスパンダ
これが私が構築したチャーリープレックスの例です。
これは灯台のビームシミュレータであり、4つのGPIOにチャープレックスされた一連の12個のLEDを使用して、ディスクの周りに光線を掃引します。ここにビデオがあります。
プロジェクトはPICベースで、私はPIC12f683を使用しています。これは8pin uPでもあり、8pin AVRに匹敵すると見なすことができます。
LEDの輝度は、約60Hzで32ステップPWMを提供する割り込みによって駆動されます。一度に2つのLEDのみを点灯させて、必要なのは各LEDに50%のデューティを与えるだけでした。また、PWMリフレッシュレートと解像度のバランスが良くなります。
非常に高速なリフレッシュレートで任意の時点で単一のLEDのみを点灯する「クラシック」な方法に固執する場合、実際に非常に単純なチャーリープレックスを使用するためのコーディング。まず、必要なPORTとTRIS(PIC固有のレジスター)を紙の上で計算し、その結果を静的配列に格納します。LED xを点灯するには、PICはアレイのインデックス[x]で値を検索し、直接PORTに書き込む必要があります(charliplexで使用されていない他のピンの状態を維持するためのマスキングを使用)
私のプロジェクトには15個ではなく12個のLEDしかありません。将来の開発のために1個のGPIOスペアを保持したかったので、5個のGPIOが許容する最大20個です。
とにかく...私はあなたの要求に似た実用的な例があると役立つかもしれないと思いました。
完全なソースコードと回路図は私のブログで入手できます。