今回は、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制御やスイッチ入力の追加であれば、 かなり使いやすい部品だと感じました。

コメント