> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kode.diy/llms.txt
> Use this file to discover all available pages before exploring further.

# Expansor de pines

> Aprende a controlar los pines programables del expansor de pines.

# 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:

| Expansor  | ESP32-S3 |
| --------- | -------- |
| SDA       | GPIO48   |
| SCL       | GPIO47   |
| Interrupt | GPIO18   |

<Tip>El expansor tiene la dirección 0x20 en el bus I2C.</Tip>

Las señales de los distintos componentes del Kode Dot que están conectadas al expansor son:

| Señal                          | Expansor |
| ------------------------------ | -------- |
| Magnetómetro - INT             | EXP0     |
| RTC - INTB                     | EXP1     |
| RTC - INTA                     | EXP2     |
| Amplificador - SD              | EXP3     |
| Alimentación - 3V3 periféricos | EXP4     |
| Indicador batería - GPOUT      | EXP5     |
| Pad - Arriba                   | EXP6     |
| Pad - Izquierda                | EXP7     |
| Pad - Abajo                    | EXP8     |
| Botón - Abajo                  | EXP9     |
| PMIC - INT                     | EXP10    |
| Pad - Derecha                  | EXP11    |
| IMU - INT2                     | EXP12    |
| IMU - INT1                     | EXP13    |
| microSD - CD                   | EXP14    |
| Pantalla - TP INT              | EXP15    |

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

* [ESP32\_IO\_Expander](https://github.com/esp-arduino-libs/ESP32_IO_Expander)

### ESP-IDF

* [esp\_io\_expander\_tca95xx\_16bit](https://components.espressif.com/components/espressif/esp_io_expander_tca95xx_16bit)

## 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.**

```cpp expander_test.ino lines icon="microchip"	 theme={null}
/**
 * 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](https://drive.google.com/drive/folders/1nJHAeJOtqmLtWnhrUvgWu9GuijLvPg9s)
