読者です 読者をやめる 読者になる 読者になる

CharlieplexingでLチカしてみる

さっきの記事でしれっとこんな回路のイラストを使いましたが、

f:id:yutannihilation:20150429202416p:plain:w450

これはなんなのかというと、LEDみっつでCharlieplexingをしてる回路です。

Charlieplexingって?

少ないピンでなるべく多くの数のLEDをコントロールするための方法です。Charlieさんが言ったからこういう名前になったらしいです(Wikipedia情報)。

簡単な例として、Wikipediaの記事にあったLEDふたつの回路をみてみます。これは、ピン2つで2つのLEDをコントロールしています。

f:id:yutannihilation:20150429213214p:plain:w300

LEDを逆向きにつけているのがミソです。この回路で、X1X2の各端子の電圧がそれぞれHigh、Lowのときを考えると、以下4通りがあります。

電流が流れるのは右上と左下ですが、それぞれ別々のLEDが点灯します。

f:id:yutannihilation:20150429214638p:plain:w200f:id:yutannihilation:20150429214647p:plain:w200

f:id:yutannihilation:20150429214652p:plain:w200f:id:yutannihilation:20150429214839p:plain:w200

こんな感じで、要はピン端子の組み合わせの種類×2だけのLEDをコントロールできるよね、という話です。

なんですが、LED3つ以上の時はちょっと違います。

Three-state logic

上と同じくWikipediaにあった回路です。(上に貼った回路イラストはこれです)

f:id:yutannihilation:20150429220608p:plain:w300

これのピンのひとつがHighになっている場合を考えます。すると...

f:id:yutannihilation:20150429220712p:plain:w300

なんということでしょう。1つだけのLEDに電流を流したいのに、問答無用で2つ流れてしまいます。

これを解決するには、ピンの状態がHigh、Lowだけではなくてもうひとつ状態が必要です。それは何かというと、下のWikipedia記事にある「high impedance state」です。ピンの抵抗値を上げると、LEDに電圧がかからないようになります。

Three-state logic - Wikipedia, the free encyclopedia

これをArduinoで設定するにはどうすればいいかというと、ドキュメントに記載があります。(これはデジタルピンの話ですが、アナログピンも同じ、と書いてあります)

Properties of Pins Configured as INPUT

Arduino (Atmega) pins default to inputs, so they don't need to be explicitly declared as inputs with pinMode() when you're using them as inputs. Pins configured this way are said to be in a high-impedance state. Input pins make extremely small demands on the circuit that they are sampling, equivalent to a series resistor of 100 megohm in front of the pin.
(http://www.arduino.cc/en/Tutorial/DigitalPins)

INPUTにすればOKみたいです。なので、電流を流したいピンの組以外はpinModeINPUTにしておけば大丈夫です。

f:id:yutannihilation:20150429223702p:plain:w300

Arduinoのコードで言えば、以下のようになるはずです。

gist.github.com

こんな感じで、ピンを増やしていっても同じ要領でそれぞれのLEDをコントロールすることができます。Wikipediaによると、L個のLEDを光らせたいとすると、{\frac{1 + \sqrt {1+4\cdot L}}{2}}のピンがあれば大丈夫、ということになるようです。

感想

ちゃんと理解できていない気がするので、間違ってたら教えてください。