GPIOエクスパンダー


GPIOエクスパンダーを使ってみる

GPIOポートが足りなくなったときに用いられるGPIOエクスパンダーの動作を確認する(Arduino環境で)。

利用したGPIOエクスパンダー

秋月電子で売られているPCF8574を利用。このエクスパンダーはI2Cで制御するが、SPI制御のものもあるようだ。

PCF8574

ここにデータシートが見つかる。Arduinoで必要なライブラリは、ここからたどれる。

内容

PCF8574ピンアサインメント

上記データシート引用。

実験内容

PCF8574のあるピンに接続されたボタンを押すと、PCF8574の別のピンに接続されたLEDが点灯するもの。配線状況は写真のとおり。

I2Cアドレス

I2C scannerを用いていて調べると、I2Cアドレスは「0x20」であった。秋月電子のPC8574ページには、「0x20 - 0x27」との記載あり。PCF8574データシートをよく見ると、

とあった。どこかで見つけた回路を参照して、ピンA0-A2をたまたまGNDに接続していたので、「0x20」(I2Cアドレスは7ビット表記)で正しいことがわかる。
- Read : (0x20 << 1 | 0x1) = 0x41
- Write: (0x20 << 1 | 0x0) = 0x40

ソースコード

ライブラリインストール時のサンプルプログラムを利用。

PCF8574_RW_Test.ino
#include "PCF8574.h"  // ①

// ②
#define BTN0  7
#define LED0  6
#define BTN1  2
#define LED1  3
#define CHATTERING    200 //times

uint8_t btn[] = {BTN0, BTN1};
uint32_t chat[2];
uint8_t led[] = {LED0, LED1};

PCF8574 PCF(0x20);  // ③

void setup()
{
  Serial.begin(115200);

  if (!PCF.begin() {  // ④
    Serial.println("could not initialize...");
  }
  if (!PCF.isConnected()) {  // ⑤
    Serial.println("=> not connected");
  } else {
    Serial.println("=> connected!!");
  }

  for (int i = 0; i < 2; i++) {  // ⑥
    chat[i] = 0;
    PCF.write(led[i], LOW);  // ⑦
  }
}

void loop()
{
  for (int i=0; i<2; i++) {
    while (!PCF.read(btn[i])) {  // ⑧
      chat[i]++;
    }
    if (chat[i] > CHATTERING) {  // ⑨
      Serial.print("BTN"); Serial.print(i); Serial.println(" Pushed");
      PCF.write(led[i], HIGH);  // ⑦
      delay(200);
      PCF.write(led[i], LOW);  // ⑦
    }
    chat[i] = 0;
  }
  delay(10);
}

  • ①:PCF8574ライブラリインクルード
  • ②:PCF8574ピン(P0-P7)につなげるボタンやLEDの定義
  • ③:クラスおよびI2Cアドレス(0x20)の宣言
  • ④:PCF8574初期化
  • ⑤:PCF8574への接続
  • ⑥:ボタンチャタリング除去用変数初期化
  • ⑦:write()メソッドでピンへの書き込み
  • ⑧:read()メソッドでピンからの読み込み
  • ⑨:ボタンチャタリング無視

実験

成功。