Características

Aunque todas las señales importantes de los componentes del kode dot están conectadas a los pines del ESP32-S3, hay algunas señales menos importantes que no caben. El expansor de pines es un componente que tiene 16 pines programables y al que están conectadas el resto de señales que, o son de baja velocidad o que no son muy relevantes.

Esquema de conexión

Los pines del expansor se controlan con el ESP32-S3 mediante el bus I2C. Además, tiene un pin de interrupción que está conectado al ESP32-S3 para saber cuándo ha habido un cambio en uno de sus pines. El expansor de pines está conectado al ESP32-S3 de la siguiente manera:
ExpansorESP32-S3
SDAGPIO48
SCLGPIO47
InterruptGPIO18
El expansor tiene la dirección 0x20 en el bus I2C.
Las señales de los distintos componentes del kode dot que están conectadas al expansor son:
SeñalExpansor
Magnetómetro - INTEXP0
RTC - INTBEXP1
RTC - INTAEXP2
Amplificador - SDEXP3
Alimentación - 3V3 periféricosEXP4
Indicador batería - GPOUTEXP5
Pad - ArribaEXP6
Pad - IzquierdaEXP7
Pad - AbajoEXP8
Botón - AbajoEXP9
PMIC - INTEXP10
Pad - DerechaEXP11
IMU - INT2EXP12
IMU - INT1EXP13
microSD - CDEXP14
Pantalla - TP INTEXP15
La mayoría de señales son de interrupción de los distintos integrados o de los botones y en los ejemplos de los siguientes apartados está implementado la lectura de estas señales.

Librerías recomendadas

Arduino

ESP-IDF

Ejemplo de código

Con este código puedes probar el funcionamiento del expansor de pines. Cuando pulses el botón de abajo, se imprimirá un mensaje en el monitor serie.
expander_test.ino
/**
 * Lee y muestra el estado de las señales conectadas a un expansor I/O TCA95XX_16BIT por I2C.
 * Configura pines como entrada o salida, y actualiza la lectura de cada señal cada segundo.
 * Muestra el nombre y estado de cada pin en el monitor serie.
 */
/* ───────── KODE | docs.kode.diy ───────── */

#include <esp_io_expander.hpp> /* Librería para controlar expansores I/O en ESP32 */

#define I2C_SCL_PIN     (47)   /* Pin SCL del bus I2C */
#define I2C_SDA_PIN     (48)   /* Pin SDA del bus I2C */
#define I2C_ADDR        (0x20) /* Dirección I2C del expansor */

esp_expander::Base *expander = nullptr; /* Puntero al objeto expansor */

/* Nombres descriptivos de las señales */
const char* signalNames[14] = {
  "Magnetometer - INT",        // EXP0
  "RTC - INTB",                // EXP1
  "RTC - INTA",                // EXP2
  "Battery Indicator - GPOUT", // EXP5
  "Pad - Up",                  // EXP6
  "Pad - Left",                // EXP7
  "Pad - Down",                // EXP8
  "Button - Down",             // EXP9
  "PMIC - INT",                // EXP10
  "Pad - Right",               // EXP11
  "IMU - INT2",                // EXP12
  "IMU - INT1",                // EXP13
  "microSD - CD",              // EXP14
  "Display - TP INT"           // EXP15
};

void setup() {
  Serial.begin(115200); /* Inicia comunicación serie a 115200 baudios */
  Serial.println("Expander polling test start.");

  /* Inicializa el expansor en la dirección I2C configurada */
  expander = new esp_expander::TCA95XX_16BIT(I2C_SCL_PIN, I2C_SDA_PIN, I2C_ADDR);
  expander->init();
  expander->begin();

  /* Configura pines 3 y 4 como salida */
  expander->multiPinMode(IO_EXPANDER_PIN_NUM_3 | IO_EXPANDER_PIN_NUM_4, OUTPUT);

  /* Configura el resto de pines como entrada */
  expander->multiPinMode(IO_EXPANDER_PIN_NUM_0 | IO_EXPANDER_PIN_NUM_1 | IO_EXPANDER_PIN_NUM_2 |
                         IO_EXPANDER_PIN_NUM_5 | IO_EXPANDER_PIN_NUM_6 | IO_EXPANDER_PIN_NUM_7 |
                         IO_EXPANDER_PIN_NUM_8 | IO_EXPANDER_PIN_NUM_9 | IO_EXPANDER_PIN_NUM_10 |
                         IO_EXPANDER_PIN_NUM_11 | IO_EXPANDER_PIN_NUM_12 | IO_EXPANDER_PIN_NUM_13 |
                         IO_EXPANDER_PIN_NUM_14 | IO_EXPANDER_PIN_NUM_15, INPUT);

  /* Pone en bajo las salidas controladas */
  expander->digitalWrite(IO_EXPANDER_PIN_NUM_3, LOW); /* Amplifier - SD */
  expander->digitalWrite(IO_EXPANDER_PIN_NUM_4, LOW); /* Power Supply - 3V3 peripherals */
}

int level[14] = {0}; /* Estados de las entradas */

void loop() {
  /* Lee el estado de cada pin de entrada del expansor */
  level[0] = expander->digitalRead(0);
  level[1] = expander->digitalRead(1);
  level[2] = expander->digitalRead(2);
  level[3] = expander->digitalRead(5);
  level[4] = expander->digitalRead(6);
  level[5] = expander->digitalRead(7);
  level[6] = expander->digitalRead(8);
  level[7] = expander->digitalRead(9);
  level[8] = expander->digitalRead(10);
  level[9] = expander->digitalRead(11);
  level[10] = expander->digitalRead(12);
  level[11] = expander->digitalRead(13);
  level[12] = expander->digitalRead(14);
  level[13] = expander->digitalRead(15);

  /* Muestra el estado de cada señal en el monitor serie */
  Serial.println("=== Pin Status ===");
  for (int i = 0; i < 14; i++) {
    Serial.printf("EXP%02d: %d - %s\n", i, level[i], signalNames[i]);
  }
  Serial.println();

  delay(1000); /* Espera 1 segundo antes de la siguiente lectura */
}

Descarga de ejemplos

Puedes probar los códigos de ejemplo mediante el IDE de Arduino o el IDE de ESP-IDF o descargar los códigos en nuestro drive: Ejemplos del expansor de pines