PCF8574 GPIOエクステンダー-ArduinoおよびNodeMCUを使用

前回のチュートリアルでは、Arduino / ESP8266 / ESP32に最大64個のI2CまたはI²Cセンサーを追加するために使用できるTCA9548A MUXについて説明しました。

このチュートリアルでは、PCF8574 8ビットGPIOポートエクステンダーについて説明します。 市場で入手可能な多くのGPIOエクステンダーの1つです。

Arduinoのピンが足りなくなると、この小さなボードが命の恩人になります。 この「GPIO(汎用入力出力)ピンエクステンダー」は、「信号を出力する」または「信号を入力として読み取る」ために使用できる追加の8ピン(P0〜P7)を提供します。

これらのモジュールはI2Cバスで実行され、デイジーチェーン接続されている場合は、プロジェクトでこれらのデバイスを最大8つ接続できます。 各デバイスは、追加で8ビットのGPIOを提供し、合計64個のGPIOを有効にします。

これらのICはとてつもなく安く、eBayまたはAliExpressから簡単に購入できます。 配線を気にせず、プロジェクトを本当に「シンプル」に保ちたい場合は、これらの完全に組み立てられたブレイクアウトボードを購入できます。 I2Cバスに接続するだけで、準備は完了です。

ステップ1:ハードウェア要件

このチュートリアルでは、次のものが必要です。

  • ブレッドボード
  • PCF8574 GPIOエクステンダーIC
  • PCF8574 GPIOエクステンダーブレイクアウトボード
  • Arduino UNO / Nano便利なものは何でも
  • NodeMCU
  • 少数のLEDと同量の220オームの電流制限抵抗
  • 2 x 10K抵抗器
  • ジャンパーケーブル、および
  • コードをアップロードするUSB​​ケーブル

ステップ2:対象トピック

  • I2Cテクノロジーの概要
  • PCF8574 GPIOエクステンダーICとブレイクアウトボードの詳細
  • GPIOアドレス指定
  • 使用するライブラリ
  • PCF8574をArduinoとNodeMCUに接続する
  • I2Cスキャナーを使用した住所の検索
  • プロジェクトでPCF8574をプログラムして使用する方法
  • 割り込みピンの使用方法
  • 適用分野

ステップ3:I2Cテクノロジー

I-squared-C(I²C)またはI2Cと発音される統合回路は、「シリアル通信」に使用される「短距離」、「2線バステクノロジー」(VCCとグラウンドも必要なため実際には4線)です。複数のプロセッサとセンサー間。

I2Cテクノロジーについて詳しく知りたい場合は、「チュートリアル番号09」をご覧ください。 ここでは、I2Cの基本について説明し、メイントピックにジャンプします。 2つのワイヤは次のとおりです。

  • SDA-シリアルデータ(データライン)および
  • SCL-シリアルクロック(クロックライン)

これらのラインは両方ともオープンドレインであり、抵抗でプルアップされています。 通常、1つのマスターと1つまたは複数のスレーブが回線上にありますが、複数のマスターが存在する場合もあります。 マスターとスレーブの両方がデータを送信または受信できます。

PCF8574 GPIOエクステンダーはI2Cバスで実行され、単一のホストI2Cバスで制御できる「IOピン」を拡張します。 PCF8574のアドレス範囲は0x20〜0x27(7ビットアドレスモード)です。 これらのデバイスのうち最大8個をプロジェクトでI2Cバスに接続できます。

ステップ4:より詳細な外観/ピン配置

IC:(AUD $ 2.30で5個)

****************************

最初にPCF8574 ICのピン配列をチェックアウトできます。

  1. このICのピン16は2.5V〜6Vで動作可能なVCCです。
  2. ピン8はGND
  3. ピン4〜7および9〜12は、P0〜P7 8パラレル(つまり、8つのピンすべてを一度に使用できる)I / Oピンです。 これらの双方向I / Oピンはそれぞれ、データ方向制御信号を使用せずに入力または出力として使用できます。 電源投入時、これらのI / OピンはすべてHIGH状態です。
  4. ピン15はI2Cシリアルデータ入力または出力用(プルアップ抵抗を介してVCCに接続)および
  5. ピン14はI2Cクロック入力用(プルアップ抵抗を介してVCCに接続)
  6. ピン1、2、3またはA0、A1、A2を使用すると、PCF8574をI2Cバスに表示するアドレスを指定できます。 デフォルトのアドレスは0x20です。 デフォルトでは、これらのピンはすべて接地またはLOWです。 これらのピンにはプルアップ抵抗は必要ありません。
  7. ピン13は割り込み出力用です。 プルアップ抵抗を使用してVCCに接続します。
  • これらのICは、わずか10μAの非常に低い「スタンバイ電流」消費を持っています。
  • SDA、SLC、および割り込みピンはすべて、プルアップ抵抗を使用してプルアップする必要があります
  • PCF8574Aと呼ばれるこのICの2番目のバリアントが市場で入手可能です。 主な違いはアドレス指定スキームです。 PCF8574の7ビットアドレスの最初の4ビットは0100で、PCF8574Aのビットは0111です。下位3ビットはデバイスピンA2、A1、A0の設定です。
  • PCF8574およびPCF8574Aの最大シンク電流は25mAです。 追加のドライブが必要なアプリケーションでは、2つのポートピンを一緒に接続して、最大50mAの電流をシンクすることができます。

ステップ5:

モジュール:(AUD $ 1.34の1ボード)

*******************************

  • ここで、PCF8574 Break-outboardを見てみましょう。
  • 左から右に見ると、モジュールに4つのピン(VCC、GND、SDA、SCL)があることがわかります。
  • 次に、SDAおよびSCLバス用の2つの10kΩSMDプルアップ抵抗があります。
  • 次に、PCF8574 SMD ICがあり、その後にA0、A1、A2の3つのジャンパーがあります。 次に、これらのボードのもう1つのピギーバックに使用できるポートがあります。
  • 次に、8つのI / Oピンと1つの割り込みピンがあります。 ボードの背面を見ると、ピンはすべてP0からP7に始まり、INTruptピンで終わるラベルが付いています。

これらの複数を使用している場合、これらのjumperAddressバーを調整してアドレスを切り替えることができます。

ステップ6:アドレス指定

3つのアドレスビットA0、A1、A2をVINまたはHIGHに接続すると、アドレスの異なる組み合わせを取得できます。

これは、PCF8574のアドレスバイトがどのように見えるかです。 最初の7ビットが結合してスレーブアドレスを形成します。 スレーブアドレスの最後のビットは、実行する操作(読み取りまたは書き込み)を定義します。 ハイ(1)の場合は読み取りが選択され、ロー(0)の場合は書き込み操作が選択されます。

ステップ7:使用するライブラリ

付属の「Wire Library」を使用すると、ArduinoのI2C / TWIバスで通信できますが、必要に応じて、githubから「PCF8574_library」をダウンロードして使用することもできます://github.com/xreef/PCF8574_library

リンクは以下の説明にあります。 ページの右上隅にある[ダウンロード]ボタンをクリックします。ダウンロードしたら、非圧縮フォルダーの名前をPCF8574に変更します。

PCF8574フォルダーにPCF8574.cppおよびPCF8574.hが含まれていることを確認してください。

Arduino / libraries /フォルダーにPCF8574ライブラリフォルダーを配置します。

これが最初のライブラリである場合、librarysサブフォルダを作成する必要がある場合があります。 IDEを再起動すると、コードでライブラリを使用できるようになります。 このライブラリには、IO Expanderを手に入れるのに役立つ非常に良い例も含まれています。

#include "Arduino.h"

#include "PCF8574.h"

添付ファイル

  • PCF8574_library-master.zipダウンロード

ステップ8:Arduino / NodeMCUに接続する方法

ICをArduinoに接続することから始めましょう。 接続する:

VCCから3.3v

GNDからGND

また、3つのアドレス選択ピンA0、A1、A2をGNDに接続して、デフォルトの0x20アドレスを使用する必要があります。次に、SCLピンをArduinoのA5に接続し、

SDAからA4

最後に、SCLバスとSDAバスの両方をそれぞれ10K抵抗でプルアップする必要があります。

NodeMCU接続の場合:

VCCから3.3v

GNDからGND

ピンA0、A1、A2からGND

SCLからD1

SDAからD2

最後に、それぞれ10Kの抵抗を使用してSDAバスとSCLバスの両方をプルアップします

ICがマイクロコントローラーに接続されたら、センサーをピン4〜7/9〜12に、つまりICのピンP0からP7に接続するだけです。

ステップ9:I2Cスキャナー

ご存じのように、3つのアドレスビットA0、A1、A2をVINまたはHIGHに接続することにより、異なるアドレスの組み合わせを取得できます。 そのため、エクスパンダーに割り当てられているアドレスを把握することが困難になる場合があります。 さらに、I2Cバス上に2つ以上のデバイスがある場合、それらのいずれかが他のデバイスと競合していないかどうかを常に確認することをお勧めします。

この「I2Cスキャナー」を実行すると、デバイスの16進アドレスを簡単に見つけることができます。 Arduinoに読み込まれると、スケッチはI2Cネットワークをスキャンし、応答するアドレスを表示します。

添付ファイル

  • I2CScanner.zipダウンロード

ステップ10:コード

IO Expanderのアドレスがわかれば、コードで簡単に使用できます。

まず、コードに「PCF8574.h」ライブラリを含める必要があります。

次に、IO Expanderのアドレスをコンストラクターに渡す必要があります。

PCF8574(uint8_tアドレス);

esp8266の場合、SDAおよびSCLピンを指定するには、次を使用します。

PCF8574(uint8_tアドレス、uint8_t sda、uint8_t scl);

次に、IOピンのモードを指定する必要があります。

pcf8574.pinMode(P0、OUTPUT);

pcf8574.pinMode(P1、INPUT);

そして、残りのコードをループする前に、最後に送信を「開始」します。

ステップ11:値を書き込む

ここで、値を書き込むには、「digitalWrite」関数を呼び出して、ピン番号の後にモードを渡すだけです。

PCF8574.digitalWrite(P1、HIGH);

または:

PCF8574.digitalWrite(P1、LOW);

では、コードをArduinoにアップロードしましょう。 コードによると、エキスパンダーのP0とP1に接続されているLEDは交互に点滅するはずです。これがまさにビンゴです。

添付ファイル

  • WriteValue.zipダウンロード

ステップ12:値の読み取り

ここで、エキスパンダーから値を読み取るには、2つの関数「digitalReadAll()」または「digitalRead(Pin_Number)」のいずれかを使用します。

digitalReadAll()関数は、1回の送信で「すべての入力ピン」を読み取ります。

PCF8574 :: DigitalInput di = PCF8574.digitalReadAll();

Serial.print(di.p0); Serial.print( "-");

Serial.print(di.p1); Serial.print( "-");

Serial.print(di.p2); Serial.print( "-");

Serial.println(di.p3);

単一の入力を読み取りたい場合は、「digitalRead(Pin_Number)」関数を使用できます。

int p1 = PCF8574.digitalRead(P1); //ピンP1を読み取ります

次に、このコードをArduinoにロードします。 コードは非常に単純で、ループ内のピンP1の値を読み取るだけです。 値がHIGHの場合、ピンP0に接続されているLEDが点灯します。 このプッシュボタンを使用して、ピンP1の状態を変更しています。 ボタンを押すと、P1の値がHIGHになり、LEDが点灯します。ボタンを放すと、LEDが消灯します。

添付ファイル

  • ReadValue.zipダウンロード

ステップ13:割り込みピン

今日の複雑な組み込みコンピューティングおよびデータ通信システムでは、割り込みが周辺機器のサービスに広く使用されています。 ただし、パッケージのピン数の制限のため、ほとんどのマイクロプロセッサには1つまたは2つの割り込みラインしかありません。

その結果、通常、複数のデバイスが同じ割り込みラインに接続されます。 この構成の欠点は、割り込みサービスを要求したデバイスを識別するためのオーバーヘッド処理時間が長すぎる可能性があることです(マイクロ秒のオーダー)。

リモートI / Oエクスパンダは、ポートに着信データがある場合、またはポートデータの変更がある場合、I2Cバスを介して通信する必要なく、マイクロプロセッサに通知できます。

PCF8574は、マイクロプロセッサの対応する入力に供給することができるオープンドレイン割り込み(INT)出力を提供します。 割り込みの詳細については、添付のデータシートをご覧ください。

割り込みを使用するには、PCF8574が割り込みを発生させたときに呼び出すピンと関数を初期化する必要があります。完了したら、プログラムで割り込みルーチンを使用できます。

//関数割り込み

void keyPressedOnPCF8574();

// i2c HEXアドレスを設定します

PCF8574 pcf8574(0x20、ARDUINO_UNO_INTERRUPT_PIN、keyPressedOnPCF8574);

添付ファイル

  • KeyPressed_withInterrupt.zipダウンロード
  • DataSheet.zipダウンロード

ステップ14:適用分野

PCF8574 GPIOエクステンダーは以下で使用されます。

  1. GPIOピンが制限されたプロセッサ
  2. それらを使用してI2Cベースのキーパッドを作成できます
  3. 複数のリレーを使用する場合に使用できます
  4. LEDチェイサー回路の作成に使用できます
  5. これらのICは、LCDシールドなどの駆動にも使用されます...

ArduinoのGPIOピンを拡張するために、これらのICの8つが事前に取り付けられたブレイクアウトボードを実際に設計しています。 別の試みとして、これらのICをTCA9548A I2C MUXと結合して、合計で512のGPIOピンを取得できるかどうかを確認します。 TCA9548A Breakoutは、同じアドレスを持つ複数のI2Cデバイスとの通信を可能にし、それらとのインターフェースを簡単にします。 明らかに、NANOはその多くのピンを制御して泣きますが、MEGAはそれを処理できるでしょう。 ただし、実際にはまだ試していません。

Arduinoには最大8個のMUXを追加でき、それぞれが追加の8個のI2Cポートを提供します。 そう:

8 x 8 = 64個のI2Cポート

これらのIOエクスパンダーのうち64個を接続すると、次のようになります。

64 x 8 = 512 IOピン

何を求めている? 想像力を働かせて64個のセンサーをArduinoに取り付けて、友人を驚かせるすばらしい自動化プロジェクトを作成してください。

添付ファイル

  • Schematic.zipダウンロード

ステップ15:リンクをダウンロードする

  • ライブラリ://github.com/xreef/PCF8574_library
  • コード:
  • I2Cスキャナー:
  • データシート :
  • 回路図:

チュートリアルをお読みいただきありがとうございます。 それがあなたのお役に立てば幸いです。

私をサポートしたい場合は、私のチャンネルに登録して、他のビデオを見ることができます。 さようなら、次のビデオで再びありがとう。

関連記事