PCAL9555APW GPIOエクスパンダ
スイッチサイエンスさんのGPIO エクスパンダボードの動作を確認します。
GPIOポートが足りない場合などに有用なチップです。
https://www.switch-science.com/catalog/2352/
ESP32でのI2Cのピンアサインなどはこちらを確認してください。
I2C接続なので、SDA, SCL, 3V3, GNDを接続します。
スイッチサイエンスさんのArduinoのサンプルをESP32向けに少し変更して使用しました。
http://trac.switch-science.com/wiki/PCAL9555APW
各GPIOの値を読み出ししてログに表示するサンプルです。
sample_pcal9555apw.ino
/*******************************************************************************
// SWITCHSCIENCE wiki -- http://trac.switch-science.com/
// PCAL9555APW Arduino Sample
*******************************************************************************/
#include <Wire.h>
#define PCAL9555APW_ADDR 0x20 // in 7bit for Arduino
#define INPUT_REG 0x00
#define OUTPUT_REG 0x02
#define INVERS_REG 0x04
#define CONFIG_REG 0x06
#define OUTPUT_DRIVE 0x40
#define INPUT_LATCH 0x44
#define PULLUP_EN 0x46
#define PULLUP_SEL 0x48
#define INTRRPT_MASK 0x4A
#define INTRRPT_STAT 0x4C
#define OUTPUT_CONFIG 0x4F
#define NUM_OF_PORT 16
void datasend(int,int,int *,int);
void dataread(int,int,int *,int);
void setup()
{
Serial.begin(115200);
Wire.begin(21,22);
}
void loop()
{
int port_input[2]; //入力状態を取得する変数
dataread(PCAL9555APW_ADDR, INPUT_REG, port_input, 2);
Serial.print("port0:");
Serial.println(port_input[0], BIN);
for(int i =0; i < (NUM_OF_PORT/2) ; i++){
int value = (port_input[0]>>i) & 1;
Serial.print("\tGPIO ");
Serial.print(i);
Serial.print(" value : ");
Serial.println(value);
}
Serial.print("\tport1:");
Serial.println(port_input[1], BIN);
for(int i =0; i < (NUM_OF_PORT/2) ; i++){
int value = (port_input[1]>>i) & 1;
Serial.print("\t\t\GPIO ");
Serial.print(i+8);
Serial.print(" value : ");
Serial.println(value);
}
delay(500);
}
void datasend(int id,int reg,int *data,int datasize)
{
Wire.beginTransmission(id);
Wire.write(reg);
for(int i=0;i<datasize;i++)
{
Wire.write(data[i]);
}
Wire.endTransmission();
}
void dataread(int id,int reg,int *data,int datasize)
{
Wire.beginTransmission(id);
Wire.write(reg);
Wire.endTransmission(false);
Wire.requestFrom(id, datasize, false);
for(int i=0;i<datasize;i++)
{
data[i] = Wire.read();
}
Wire.endTransmission(true);
}
<補足>
秋月電子さんにもI2CのGPIOエクスパンダーがあるので、入手したら試してみたいと思います。
http://akizukidenshi.com/catalog/g/gI-09486/