私たちは皆、そのような経験をしたことがあるでしょう。1つの マイクロコントローラ または開発ボードを念頭に置いてプロジェクトを開始しますが、いくつかの修正、機能の追加、考慮していなかった1つまたは2つのセンサーを追加した後、I/Oが不足してしまいます。この時点で、より高性能なコントローラーに切り替えることもできますが、何らかの理由で元のボードを使い続けたい場合はどうすればよいでしょうか?
幸いなことに、SPIまたはI2Cインターフェイスを介した多重化やデジタルI/O拡張など、デバイスのI/Oを拡張する方法はいくつかあります。人気のあるインターフェースの1つは、 Texas Instruments と NXP が製造するPCF8574およびPCF8574A ICです。これについては、この記事の後半で詳しく説明します。これらの集積回路はそれぞれ、ユーザーに8つの追加GPIOピンを提供し、各回路は2.5 ~ 6 Vの間で動作できます。
3つの選択ピンを介して各モジュールを8つのアドレスのいずれかに設定することにより、複数のモジュールを一緒に使用することもできます。PCF8574チップは0x20から0x27までの16進アドレスに設定され、PCF8574Aチップは0x3Fから0-38に設定されます。それ以外は同一の設計により、最大128個の拡張I/Oを単一のバス上に存在させることができ、各タイプの8個がすべての可能なアドレスを占有します。それで十分でしょう?
このタイプのICは、プロジェクトで使用できるI/Oの数を単純に拡張するだけでなく、さまざまなモジュールにアクセスするために必要なのは1セットのSCLおよびSDAライン (および電源とグランド) だけなので、配線の統合に非常に便利です。
はじめる
この種の制御には、I2C通信が可能な任意のマイクロコントローラを自由に使用できます。この技術の紹介として、 Arduino Nano を使用した使用方法を説明します。Arduinoと一緒に、オンボードPCF8574 ICのI/O、割り込みピン、Vcc、GND、SDA、およびSCL入力を分割するWaveshareの開発モジュールを使用します。開発モジュールには、アドレス選択用の3つのジャンパーも用意されています。ボードには、一方の端にI2C接続用のオス ヘッダーがあり、もう一方の端に対応するメス接続があります。このセットアップでは、前述のとおり、最大16個まで複数のモジュールを物理的に積み重ねることができます。
どのアドレスを持っているかを計算するには、ジャンパーの位置と /Aバージョンがあるかどうかの両方を使用できますが、もっと簡単な方法があります。アドレスを把握し、同時に設定を確認するには、 I2Cスキャナーを使用します。
1.プログラムをArduinoにロードする
2.シリアルポートモニターを開いてアドレスを確認します
ジャンパーを使用して、必要に応じてアドレスを変更したり、次のステップでインターフェイスするためにアドレスを記録したりすることができます。
LEDテスト
最初のテストを実行する方法についての簡単なガイドを次に示します。
1.PCF8574モジュールのSDAピンをNanoピンA4に接続し、SCLをA5に接続します。
2.5VをVCCに接続し、ArduinoのグランドをPCF8574モジュールのグランドに接続します。
3.次に、適切な抵抗器を使用して、PCF8574モジュールの出力P0とP1に1組の LED を接続します。どのI/Oを使用しているかに関係なく、他の操作なしですぐにオンになることに気付くでしょう。モジュールは電源投入時に弱い正電圧信号を発します。これは、今後の検討のために念頭に置いておく必要があります。
4.Arduino IDEに PCF8574ライブラリ をインストールすると、プログラムがデバイスと簡単にやり取りできるようになります。
5.モジュールに合わせてI2Cアドレスを変更し、「2-LED-Blink」サンプルをボードにロードします。
すべてを正しく設定すると、LEDは遷移間隔250ミリ秒で点滅します。この信号は、利用可能な新しい出力を示します。必要に応じて、他の多くの状況に拡張できます。
ボタン入力
これらのモジュールを使用して、ユーザー入力の センサー を増やすこともできます。Arduinoボードの +5VからPCF8574モジュールの入力P0にボタンを配線します。オプションとして、上の画像に示すように、入力がフローティングにならないようにプルダウン 抵抗 を追加することもできます。ただし、この手順はテスト中に必要ではないようでした。適切な抵抗器を備えたLEDがP1に接続されます。入力応答コード は、ボタンを押すとLEDを点灯し、トラブルシューティングを行う必要がある場合に入力の状態を示すシリアル信号も生成します。
このコードで最も注目すべき部分は24行目にあります。
"uint8_t val = pcf8574.digitalRead(P0);"
このコードはP0入力のみを読み取り、それを変数「val」に割り当てます。または、「digitalReadAll();」を使用して1つのコマンドですべてのデジタル ピンを読み取ることもできます。
割り込みピン
PCF8574モジュールは、純粋なI2Cインターフェースに加えて、入力の変化に基づいて信号を出力する「INT」ピンを備えています。これをArduinoの割り込みピンに直接配線して、モジュールの入力状態の変化を通知することができます。マイクロコントローラは、このI2Cデバイスをすぐにチェックして、I/O応答を高速化できます。
追加入力
最大128個の追加I/Oピンが多くのアプリケーションで非常に役立つことは容易に理解できます。さらに多くのピンが必要な場合は、理論的には、マルチプレクサ設定を使用して追加のI2Cバスを作成し、潜在的な追加I/Oピンの数を驚異的なレベルまで増やすことができます。I/Oが不足し、ビルドを完了するためにさらにいくつか必要な場合でも、膨大な数のI/Oポイントを必要とするビルドを計画している場合でも、I/Oエクスパンダー モジュールがまさに必要なものになります。