グリッドの LED をオン/オフにする必要がある場合、(もちろん) それぞれに1つのIOピンを使用できますが、ある時点でこれは管理できなくなります。従来のマトリックス設定では、x/yグリッドを使用して制御されるLEDを増やすことができ、制御される出力の数はIO(x) x IO(y) に等しくなります。
LEDマトリックス: IOの倍増
したがって、3x3グリッドは6つのIOで9個のLEDを制御でき、8 x 8グリッドは64個のLEDを制御できます。これが機能するのは、IO(y) ピンが各行を1つずつアクティブにし、IO(x) ピンがグラウンドへの電流を受け取るか、このパスに対抗するように設定されているためです。各行を順番に素早く点滅させると、グリッドは単色のマトリックスのように見えます。
マイクロコントローラには、IOピンを正と負に設定する機能だけでなく、入力として設定することもできます。この3番目の状態 (高インピーダンス、hi-Z、またはトライステートとも呼ばれます) では、どちらの方向にも電流が流れないため、興味深い制御の可能性が生まれます。「チャーリープレキシング」と呼ばれる技術(Maxim IntegratedのCharlie Allenにちなんで名付けられました)は、Hi-Zを最大限に活用し、LEDをどちらの方向にも電流を流せるように配置します。
Charlieplexing: IO累乗
LEDグリッドはIOを増加させますが、Charlieplexingはより指数関数的な関係です。制御対象のLEDの数は、n² – nという式で表すことができます。ここで、nは各LEDを駆動するために使用されるIOの数です。従来の正方形のx/yグリッドに8つのIOがあった場合、4 x 4、つまり16個のLEDになります。ただし、Charlieplexingを使用すると、理論的には8² – 8、つまり56個のLEDを制御できます。
特に、チャーリープレックス化は入力を増やすためにも使用できます。LEDベースの出力と同様に、コストが複雑になります。さらに、LED/ダイオード はデバイスの機能の一部ではないため、追加のIOを使用するか、Charlieplexing回路をセットアップするかを選択する際には、この点を考慮する必要があります。
LED多重化回路チュートリアル
Charlieplexingを使用して回路を駆動するために必要なIOの最小数は2です。2² – 2 = 2という式は実質的な利点がないことを意味しますが、それでもその仕組みを調べることは有益です。上記の回路図では、D1とD2はIOピン5と6に接続されており、 抵抗がインラインされています。ピン5がハイ、ピン6がローの場合、D1に電流が流れ、LEDが点灯します。逆の場合、D2のみが電流を流してこのLEDを点灯しますが、D1はオフのままです。両方のLEDをオフにしたい場合を除き、ここではHi-Zは実際には使用されません。これは、IOの両方を論理ハイまたはロー状態にすることでも実現できます。
ここおよび他の画像に示されている抵抗器は150オームですが、理想的にはその半分になります。
各抵抗器を個別に接地するのに比べて配線を少し節約できると主張する人もいるかもしれませんが、3つ以上のIOピンに到達するまで、セットアップは実際には「輝いて」いません。追加のアースがあれば配線が簡単になる場合など、緊急時にはこの動作を覚えておくとよいでしょう。IOの1つを低く設定し、ボタンの押下を検知するなどのアプリケーションに使用できます。
ここで使用される赤色LEDに適した直列抵抗は150オームですが、各I/Oピンに1つずつ配置するため、抵抗が2倍になることに注意してください。実際には、各LEDはその半分にする必要があります。理論上は、それぞれ75オームになります。個々のLEDに抵抗器を取り付けることもできます。これは、異なる電圧降下でLEDを制御する必要がある場合に便利です。
3 IO、4 IO、その他
LEDが2個を超えると、チャーリープレックス化の利点がさらに明らかになります。3つの出力で制御できるLEDの数は2倍の6個になり、4つの出力で制御できるLEDの数は3倍の12個になります。また、回路もより複雑になり、配線パターンの説明が難しくなることにも気づきます。これは、以下の回路図で確認できます。
説明が難しいだけでなく、配線も難しく、何か問題が発生した場合のトラブルシューティングも難しく、プログラミングも簡単ではありません。これは優れたテクニックですが、このIO効率の高い方法を使用する際には、これらはすべて考慮しなければならない要素です。
Charlieplexing Arduino: コードとプログラミング
Arduino IDEでは、出力ピンはHIGHまたはLOWに設定され、hi-Zの場合はIOのpinModeをINPUTとして設定する必要があります。このように各ピンをプログラミングするのは少し面倒なので、ブライアン・ラフのこのテーマに関する優れたビデオチュートリアルに触発されて、 方法はここにあります 私のためにこれをやってください:
void charlie(int a, int b){
b == 2の場合{
pinMode(a, 入力);
}
それ以外{
pinMode(a, 出力);
デジタル書き込み(a, b);
}
}
これを実装すると、リンクされたプログラムのメイン ループで、pinModeを設定したり正しい状態を書き込んだりすることを覚えておく必要はなく、単に charlie(x, y); というメソッドを実行するだけで済みます。ここで、xは変更されるピンを指し、yの値は、0が低、1が高、2がHi-Zまたはトライステートを表します。下の画像に示すように、3つのIOピンを使用して6つのLEDを制御する方法については、 こちらを参照してください。この方法の優れた点の1つは、ピンを明示的に入力または出力として宣言しなくても、ピンを追加できることです。この方法は、それを自動的に処理します。
もちろん、これはCharlieplexed LEDをプログラミングする際の複雑さの1つのレイヤーにすぎません。理想的には、自動的に切り替えるLEDに基づいて、HIGH/LOW/hi-Zロジックを処理するメソッドを作成します。そこから、遅延をなくしたり減らしたりして、各LEDが同時に光っているように見せたり、 PWMを使用 してLEDを効果的に明るくしたり暗くしたりすることができます。
実用的なチャーリープレックス?
WS21812B ユニットなどのプログラム可能なLEDや、 MAX7219などのI2C経由で駆動されるマトリックスなどを使用すると、Charlieplexingが実際にどこに当てはまるのか疑問に思うかもしれません。まず、シンプルなLEDは一般にプログラム可能なバージョンよりもはるかに安価であり、追加のロジックやその他のコンポーネントがないため、Charlieplexingに基づくシステムはより電力効率が高いことが期待できます。
Charlieplexedシステムの複雑さは最終的には扱いにくくなりますが、このようなシステムが本当に効果を発揮するのは、IOを節約する必要があり、切り替える必要のあるLEDの数を管理可能な低電力アプリケーションであると思われます。たとえば、 ATtiny85 の場合、その出力の4つを使用して12個のLEDをトリガーし、5番目のIOを他のタスクに残すことができます。