uCでIOが制限されている場合、ロジックをuCからどのように移動しますか?


8

たとえば、4つのデジタルIOピンを備えたArduinoがある場合、4つ以上のLEDを個別に点灯させる、または4つ以上のボタンの状態を読み取るにはどうすればよいでしょうか。


タイトルのPICについて質問し、Arduinoを参照します。
Leon Heller

2
@LeonHeller:次に、説明を求めたり、質問を自分で編集したりします。ただし、この場合、PIC / Arudinoの場合は "uC"を使用できます。
Chris Laplante 2012

2
ハードウェアのほうが維持コストが安いことに同意します。
ジッピー2012

3
@jippie-そして、オタクの返信は、「ガールフレンドとは何ですか?」です。:-)
stevenvh 2012

1
私はあなたの受け入れられた答えを再考することを提案します。イグナシオのは、(ない2~3の信号がある)間違っているブルーノさんは、より完全であるが、(イグナシオは、例えば入力を言及していない)、および追加のピンを節約するため、元のソリューションを持っています。
stevenvh 2012

回答:


4

74595などのシフトレジスタを使用すると、データピンとクロックピンの2つの接続のみで多くの出力を得ることができます。データピンをレジスタに移動する次の値に設定し、クロックピンにパルスを送ります。


それは素晴らしいことです。だから私はそれを読んで、はっきりさせておきますが、そのうちの1つで、最大2つのArduinoピンを使用して8つの出力を実行できますか?入力としても使用できないと思いますか?
cheesysam 2012

3
@cheesysam-「2つで16の出力を持つことができます。3つ、24などで」。不正解です。接続するデバイスの数に関係なく、データ、クロック、ラッチの3つのピンが必要です。ブルーノの答えはより正確です。また、何十年も死んで埋葬されてきたオリジナルのTTLテクノロジーである74595については話さないでください。74HC595が必要です。
stevenvh 2012

1
@stevenvh: "... 8つの出力を持つことができるものの1つで..."。また、彼らは74AC595を望まないのですか?74F595?74LVX595?
Ignacio Vazquez-Abrams

1
@Ignacio-私がしたように、 "with two .."は "with two I / Os"と読むことができるので、紛らわしいです。ごめんなさい。74F595?16 MHzコントローラーによるクロッキングについては?私はそうは思いません。74Fは非常に電力を消費し、速度は何のメリットもありません。74LVXは3.3 Vのみなので、Arduinoとインターフェースしません。74HCの何が問題になっていますか?これは標準のロジックファミリです。
stevenvh 2012

2
「74HCの何が問題になっていますか?」何もない。「XX」を省略することの何が問題になっていますか?
Ignacio Vazquez-Abrams

7

ブルーノは良い答えを出しましたが、いくつか注意点を述べておきたいと思います。

悪名高い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の場合、リレーの出力がプルインするのに十分な高さではない可能性があります。

確かに、これは極端なケースですが、多重化したい場合や、更新レートが高い場合は、シリアルクロックとラッチクロックを可能な限り分離したままにします。


1
+1昨夜の素晴らしいアイデアです!今までこれがどこかで言及されたのを見たことがない。一方、あなたはブルーノの答えを誤解していると思います。彼は、74XX595と74XX165のクロック信号を組み合わせることと、74XX595と74XX165のラッチ信号を組み合わせることを意味しました。
m.Alin 2012

@ m.Alin-はい、そうです。ご指摘いただきありがとうございます。私は答えを編集しますが、可能性として残します。
stevenvh 2012

もちろん、それは間違いなく他の人が推奨した可能性です。それに取り組む価値があります。
m.Alin 2012

@ m.Alin-それが以前に使用されなかった理由は、ユーザーが70 mAの制限について知らなかったか、気にしていないからだと思います:-(。私は今、特許庁に向かっています!;-)
stevenvh 2012

3
もう戻った。事務所は閉鎖されました。彼らは皆教会にいた。
stevenvh 2012

6

私は、出力の拡張のためのシフトレジスタアウトパラレルシリアル、74XX595の使用に関するイグナシオに同意するが、実際には、あなたは3つの接続のためのいずれかが必要になるデータのための1 クロックと1 ラッチイネーブルそれは内部シフトレジスタからデータを転送しますが出力ラッチに。

74LS595の図

入力の拡張には、74XX165パラレルインシリアルアウトシフトレジスタを使用できます。これにより、74XX165あたり最大8つのボタンを使用できます。

ここに画像の説明を入力してください

このアプローチの良い点は、入力または出力の数を増やすことができる複数のシフトレジスタをデイジーチェーン接続できることです。さらに良いことに、74XX595と74XX165を混在させることができ、任意の数の入力または出力を持つことができます。

さらに、クロック信号とラッチ信号を共有して、必要な接続数を減らし、ソフトウェアを大幅に簡素化できます。この方法では、このシフトレジスタの任意の数に対して4つの接続のみが必要になります。

  • クロック(すべてのシフトレジスタと共有)
  • ラッチイネーブル(すべてのシフトレジスタと共有)
  • データ入力(チェーンの最後のシフトレジスタのシリアル出力に接続)
  • データ出力(チェーンの最初のシフトレジスタのシリアル入力に接続)

編集する

このウェブサイトで図を探していたところ、必要な接続数を3に減らす非常に賢い方法でした。データの入力と出力に同じピンを使用します。

ソフトウェアは、各クロックパルスに対して次のようなことを行います。

  1. ピンを出力として構成
  2. データ値を設定する
  3. クロックパルスを送信する
  4. 入力としてピンを構成する
  5. データを読む

図


1
過度に鋭敏であると、単一の出力ピンを使用して、このような文字列のみをシフトレジスタの出力を制御できます。どうやって知っているか聞いてください:-)。これは、クロックが出力ピンに直接接続された状態で、データとラッチにR / C遅延を使用することによって実現されます。正確なシーケンスは、クロックとラッチの相対的なエッジトリガー極性に依存しますが、これらは通常、この方法で連携するように設計されています。
ラッセルマクマホン

そして、私の答えで言ったように、両方のクロックを組み合わせることもできるため、必要なピンは2つだけです。それは賢いアイデアですが、私はこれをもう一度賛成するつもりはありません。一度で十分です:-)
stevenvh

74HC595の最後の出力を74HC165にシフトする必要はないと思います。誰かこれを説明できますか?私が理解している限り、この接続なしでは、16クロックパルスで両方に十分であり、2 x 74HC595(16出力)の出力を設定し、2 74HC165(16入力)の入力を読み取ります。

@Dario:74HC595フィードからの最後の出力を74HC165に送ることは、チェーンが特定の長さよりも長くないことを知っているコントローラーがチェーンが接続されていることとその長さを判断できるようにする「無料」の方法です。起動時にすべての595をLowにクロックすることが許容される場合、および最初の '165に少なくとも1つの入力がHighになる場合、コードは' 595 'と' 165 'の数を決定することもあります。
スーパーキャット2012

5

NickはI / Oエキスパンダーについて言及しています。Digikeyにはそれらの1000以上がリストされています。例として、I2Cインターフェイスを持つものを選択します。最小2つ。

NXP PCA9505には、5つの74HC595に相当する40の構成可能なI / Oピンがあります。これは少し高価なソリューションですが、そのための機能が大幅に増えます。

  • 任意のI / Oピンを入力または出力として構成可能
  • すべてのI / Oピンに100kΩプルアップ(PCA9506にはプルアップがないため、低電力アプリケーションに関連する場合があります)
  • すべての出力は15 mAを同時にシンクでき、パッケージの合計は600 mA
  • 変更時割り込み出力により、入力の継続的なスキャンが不要になります。
  • マイクロコントローラに接続するための2本のワイヤのみ。

さらに詳しい
GPIOエキスパンダー、NXPパンフレット
PCA9505データシート


4

追加のICがないソリューションの場合は、多重化チャーリプレックスなどの手法を使用できます。

多重化(電流制限抵抗は表示されていません):

多重化されたLED

多重化の仕組みは非常に簡単です。上記の例では、LED1を点灯させたい場合、ピンC1をハイに出力し、PIN R1をローに出力します。他のすべてのピンは、ハイまたはHi-Z(入力、ハイに設定)にすることができます。 「切断された」ように見えるインピーダンス)
LED5を点灯させたい場合は、ピンC2をハイに出力し、R2をローに出力するように設定します。

x個のLEDを駆動するために必要なピンの数は、n²LEDの場合は2nピンで計算できるため、たとえば16個のLEDの場合(√16)* 2 = 8ピンが必要です。

Charlieplexing:

チャーリープレックス

代替(よりきれいな)回路図レイアウト(Supercatによって推奨):

チャーリープレックス2

これは少し複雑ですが、より少ない数のピンでより多くの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など)。

これらの手法は、入力に対しても逆に機能します。


この回答は、多重化入力プッシュボタンに
Charlieplexing

Charlieplexedディスプレイを描画するより簡単な方法は、対角の値が設定されていないNxNグリッドとして単に描画することです。
スーパーキャット2012

@supercat-Google画像から最初の例をピンチしました。別の例を追加しました-これはあなたが意図した種類のレイアウトですか?
Oli Glaser 2013年

@OliGlaser:はい。ただし、抵抗を行と列の接合部に移動することをお勧めします。これを行うと、ハイサイドまたはローサイドのいずれかのドライバーが対応できる場合、一度に9つのLEDを駆動することが可能になります。あるいは、抵抗をそのままにして、各行と列の接合部にトランジスタを追加することもできます(図の回路図では、行にベース、列にエミッタ、正のレールに接続されたコレクタを備えたNPN) )。トランジスタを追加すると、一度に9つのLEDを動作させるために必要なハイサイド駆動強度が大幅に減少します。
スーパーキャット2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.