たとえば、4つのデジタルIOピンを備えたArduinoがある場合、4つ以上のLEDを個別に点灯させる、または4つ以上のボタンの状態を読み取るにはどうすればよいでしょうか。
たとえば、4つのデジタルIOピンを備えたArduinoがある場合、4つ以上のLEDを個別に点灯させる、または4つ以上のボタンの状態を読み取るにはどうすればよいでしょうか。
回答:
74595などのシフトレジスタを使用すると、データピンとクロックピンの2つの接続のみで多くの出力を得ることができます。データピンをレジスタに移動する次の値に設定し、クロックピンにパルスを送ります。
ブルーノは良い答えを出しましたが、いくつか注意点を述べておきたいと思います。
悪名高い70ミリアンペア
ザ74HC595は、 I / Oを拡張し、できるだけ頻繁に一連のLEDを制御するために使用されるようにしばしば使用されます。見落とされがちなのは、仕様どおりに操作できない可能性があることです。データシートによると、総供給電流は70 mA(絶対最大定格(AMR))を超えてはならないので、ある程度余裕を持たせてください。したがって、10 mAで8つのLEDは多すぎます。20mAでAMRを130%以上超えることになります!制限はおそらくボンディングワイヤの電流容量によるものであり、電流が高すぎると、部品のパフォーマンスが低下するだけでなく、ワイヤが破損した場合に永久に故障する可能性があります。
しかし、昨夜は、アイデアがあったので目が覚めました。70 mAの制限はIccとグラウンド電流の両方に適用されます。それでは、合計または80 mAを分割して、Iccにその半分を割り当て、残りの半分にグラウンド電流を割り当てませんか?必要なのは、4つのLEDをグラウンド(アクティブハイ)に、残りの4つをVcc(アクティブロー)に参照することだけです。その後、前者の電流はIccから発生し、他の電流はグランドに流れます。この方法で15 mAのLEDを使用できます。(私はそれをもっと早く考えなかった馬鹿のように感じるほど単純です。)
組み合わせたクロック
は、ブルーノがシフトレジスタのクロックとラッチのクロックを組み合わせることにより、余分なI / Oピンを節約したと思いました。私は彼の答えを誤解しているようです。このオプションをさらに拡張したいと思います。
次に何が起こりますか?データシートの 5ページの表には、次のように記載されています。
シフトシフトされたシフトレジスタの内容。シフトレジスタの以前の内容は、ストレージレジスタとパラレル出力ステージに転送されます。
(私がハイライトしています)
だから、ラッチされているのは新しいデータではなく前のデータです。実際の問題ではありません。最後のデータをラッチするために追加のダミービットをシフトインすることを確認してください。そうしないと、すべてのピンが間違っています。
クロックを組み合わせることは、新しいデータをシフトインしている間、出力が常にトグルすることも意味します。ラッチの機能は、実際にはそれを回避することでした。多くの場合、高速で実行できればこれは問題になりませんが、最悪の場合、望ましくない影響が出る可能性があります。最悪のケースは、74HC595を使用して非常に高いスキャン周波数でディスプレイを多重化する+シフトレジスタのチェーンが非常に長い+ 1つの0を除くすべて1、オフになっているLED +暗い部屋 そのLEDは1の通過をすべて暗い部屋で頻繁に確認するため、非常にかすかに点灯する場合があります。
または、その高周波多重化をリレー制御出力と組み合わせる場合。リレーがすべて0で1の場合、リレーの出力がプルインするのに十分な高さではない可能性があります。
確かに、これは極端なケースですが、多重化したい場合や、更新レートが高い場合は、シリアルクロックとラッチクロックを可能な限り分離したままにします。
私は、出力の拡張のためのシフトレジスタアウトパラレルシリアル、74XX595の使用に関するイグナシオに同意するが、実際には、あなたは3つの接続のためのいずれかが必要になるデータのための1 クロックと1 ラッチイネーブルそれは内部シフトレジスタからデータを転送しますが出力ラッチに。
入力の拡張には、74XX165パラレルインシリアルアウトシフトレジスタを使用できます。これにより、74XX165あたり最大8つのボタンを使用できます。
このアプローチの良い点は、入力または出力の数を増やすことができる複数のシフトレジスタをデイジーチェーン接続できることです。さらに良いことに、74XX595と74XX165を混在させることができ、任意の数の入力または出力を持つことができます。
さらに、クロック信号とラッチ信号を共有して、必要な接続数を減らし、ソフトウェアを大幅に簡素化できます。この方法では、このシフトレジスタの任意の数に対して4つの接続のみが必要になります。
このウェブサイトで図を探していたところ、必要な接続数を3に減らす非常に賢い方法でした。データの入力と出力に同じピンを使用します。
ソフトウェアは、各クロックパルスに対して次のようなことを行います。
NickはI / Oエキスパンダーについて言及しています。Digikeyにはそれらの1000以上がリストされています。例として、I2Cインターフェイスを持つものを選択します。最小2つ。
NXP PCA9505には、5つの74HC595に相当する40の構成可能なI / Oピンがあります。これは少し高価なソリューションですが、そのための機能が大幅に増えます。
さらに詳しい
GPIOエキスパンダー、NXPパンフレット
PCA9505データシート
追加のICがないソリューションの場合は、多重化やチャーリプレックスなどの手法を使用できます。
多重化(電流制限抵抗は表示されていません):
多重化の仕組みは非常に簡単です。上記の例では、LED1を点灯させたい場合、ピンC1をハイに出力し、PIN R1をローに出力します。他のすべてのピンは、ハイまたはHi-Z(入力、ハイに設定)にすることができます。 「切断された」ように見えるインピーダンス)
LED5を点灯させたい場合は、ピンC2をハイに出力し、R2をローに出力するように設定します。
x個のLEDを駆動するために必要なピンの数は、n²LEDの場合は2nピンで計算できるため、たとえば16個のLEDの場合(√16)* 2 = 8ピンが必要です。
Charlieplexing:
代替(よりきれいな)回路図レイアウト(Supercatによって推奨):
これは少し複雑ですが、より少ない数のピンでより多くのLEDを駆動します。たとえば、上の例のように5つのピンだけを使用して20個のLEDを駆動できます(「通常の」マトリックス多重化の少なくとも10個のピンと比較してください(必要なピンの数がlog2であるICの使用と混同しないでください)。 (nLED)。
外部ソリューションには、シフトレジスタや74HC595や74HC151などのマルチプレクサなどを使用できます 。
シフトレジスタは、クロックされたデータのシリアル入力ストリームを受け取り、パラレル(Serial In Parallel Out SIPO)またはその逆(PISO)で
出力します。通常、これらには8つの出力(または入力)がありますが、いくつでもチェーンして拡張できます。事。欠点は、更新可能な速度を入力あたりの出力数で割ったものです(たとえば、8つの出力の1つのレジスター、8 MHzの入力クロックがある場合、1 MHzで更新できる、16の出力は500 kHzなど)。
これらの手法は、入力に対しても逆に機能します。