IOエクスパンダを使ってみた|PCF8574でArduinoのIOを増やす

IOエクスパンダ

今回は、I2C接続で手軽にIOを増やせる定番部品、 PCF8574 / PCF8574T IOエクスパンダを実際に使ってみました。

IOエクスパンダとは?

少ないピン数で、たくさんのスイッチやLEDを使えるようにする部品です。

Arduinoなどのマイコンは、使えるデジタルIOピンの数が限られています。
そのため、LEDやスイッチを増やしていくと、すぐにピン不足になります。

そこで使うのが IOエクスパンダ です。

IOエクスパンダの仕組み

IOエクスパンダは、I2Cなどの通信を使って、外付けでIOを増やします。

たとえば PCF8574 の場合、

  • Arduino側:I2Cの2本(SDA / SCL)のみ使用
  • PCF8574側:8本のデジタルIO(P0〜P7)が使用可能

という構成になります。

つまり、「2本の配線で、8本分のIOを増やせる」というイメージです。

今回使ったIOエクスパンダ

Amazonなどでよく見かける、PCF8574を搭載したIO拡張ボードです。

PCF8574 PCF8574T IO拡張ボード(I2C開発ボード)

商品説明としてよく書かれている特徴を整理すると、次の通りです。

  • I2Cインタフェースで8ビットのパラレルIOを制御できる
  • アドレス切り替えにより最大 8×8 = 64ポート まで拡張可能
  • Arduino / Raspberry Pi / AVR / ARM などに対応
  • I2Cの2本だけで8本分のデジタルIOを増やせる

「とりあえずIOを増やしたい」という用途では、かなり定番の部品です。

配線図

Arduinoコード

P0ピンを1秒ごとにON/OFFするためのコードです。

#include <Wire.h>

#define PCF8574_ADDR 0x20

uint8_t portState = 0xFF;   // 全ピン HIGH(初期状態)

void setup() {
  Wire.begin();             // I2C 初期化
}

void loop() {
  // P0 = LOW
  portState &= ~(1 << 0);   // bit0 を 0
  writePCF8574(portState);
  delay(1000);

  // P0 = HIGH
  portState |= (1 << 0);    // bit0 を 1
  writePCF8574(portState);
  delay(1000);
}

void writePCF8574(uint8_t data) {
  Wire.beginTransmission(PCF8574_ADDR);
  Wire.write(data);
  Wire.endTransmission();
}

コードで意識しているポイント

8ビット一括書き込みに注意

PCF8574は、1ピンずつではなく 8ビットまとめて書き込みます。

そのため、

  • 変更したいピンだけを書き換える
  • 他のピンの状態は保持する

という処理が必要になります。

今回は portState 変数で現在のIO状態を管理しています。

実行結果

ONとOFFがしっかり出力されています。

まとめ

  • PCF8574を使えば、I2Cの2本だけでIOを8本増やせる
  • Arduinoからの制御は非常にシンプル

ちょっとしたLED制御やスイッチ入力の追加であれば、 かなり使いやすい部品だと感じました。

コメント

タイトルとURLをコピーしました