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 |
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ñ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
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.
/**
* 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