LoginSignup
2
0

More than 1 year has passed since last update.

GPIOエクスパンダー

Posted at

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

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

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

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

PCF8574

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

内容

PCF8574ピンアサインメント

上記データシート引用。

実験内容

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

I2Cアドレス

I2C scannerを用いていて調べると、I2Cアドレスは「0x20」であった。秋月電子のPC8574ページには、「0x20 - 0x27」との記載あり。PCF8574データシートをよく見ると、
データシート一部.png
とあった。どこかで見つけた回路を参照して、ピン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()メソッドでピンからの読み込み
  • ⑨:ボタンチャタリング無視

実験

成功。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0