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()メソッドでピンからの読み込み
- ⑨:ボタンチャタリング無視
実験
成功。