Lee detenidamente esta sección para no dañar el kode dot.

Características

El kode dot integra un sistema de alimentación complejo y sofisticado, pero a la vez robusto, modular y fácil de usar. Se puede alimentar de tres maneras: de la batería de 500mAh, del USB-C o a través de los conectores externos. El sistema está formado por estos componentes:
  • Power Management Integrated Circuit (PMIC)
  • Indicador de combustible (Fuel Gauge, en español no tiene mucho sentido la traducción)
  • Regulador de 3V3 para los integrados internos
  • Regulador de 3V3 para los periféricos
  • Regulador para el RTC interno del ESP32-S3

Power Management Integrated Circuit (PMIC)

La parte central del sistema de alimentación es un PMIC que se encarga de gestionar de dónde se obtiene la energía, si de la batería, del USB-C o de los conectores externos. Además, el PMIC se encarga de la seguridad y la protección de los componentes, asegurando la protección contra sobrecargas, cortocircuitos o sobrecorrientes. Además,nos permite obtener datos de la batería y de la alimentación. También permite generar desde la batería un bus de 5V y hasta 2A de corriente que se puede usar para alimentar periféricos externos a través de los conectores externos.

Fuel Gauge

El fuel gauge es un componente que se encarga de medir varios datos de la batería y darnos un análisis de su estado. Así podemos conocer los siguientes datos de la batería:
  • Capacidad restante
  • Estado de carga
  • Tiempo restante de uso
  • Voltaje de la batería
  • Temperatura de la batería
  • Salud
  • Corriente de salida o entrada
Además, nos avisa ante posibles problemas como sobrecargas, cortocircuitos, sobrecorrientes, etc.

Regulador de 3V3 para los integrados internos

Este es el principal regulador de tensión del kode dot y soporta hasta 1A de corriente. Se encarga de estabilizar la tensión a 3V3 y alimenta estos integrados:
  • ESP32-S3
  • Expansor de pines
  • Reloj de tiempo real
  • Amplificador de audio
  • Micrófono
  • IMU de 6 ejes
  • Magnetómetro de 3 ejes
Así, cuando el kode dot entre en estado de suspensión, este regulador se encarga de mantener la tensión en el ESP32-S3 y a los integrados internos.

Regulador de 3V3 para los periféricos

Este regulador, que soporta hasta 2A de corriente, se puede activar o desactivar para darle alimentación a los siguientes periféricos del kode dot:
  • Pantalla
  • microSD
  • Bus 3V3 del conector superior
Cuando el kode dot está en modo suspensión, este regulador se desactiva y desconecta la alimentación de los periféricos.

Regulador para el RTC interno del ESP32-S3

Este regulador se encarga de darle alimentación al RTC interno del ESP32-S3.

Esquema de conexión

Power Management Integrated Circuit (PMIC)

El PMIC está conectado al bus I2C usando estas conexiones:
PMICESP32-S3
SDAGPIO48
SCLGPIO47
INTEXP10
El PMIC tiene la dirección 0x6B en el bus I2C.
El pin de interrupción está conectado al expansor de pines.
El bus de 5V y 2A que genera el PMIC está conectado al conector superior y al trasero del kode dot. Si el USB-C está conectado, la potencia del bus de 5V proviene de este. Si no está conectado, la potencia del bus de 5V proviene de la batería. Además, se puede conectar por uno de los conectores externos una fuente externa de alimentación de 5V para cargar el kode dot.
No conectes una fuente externa de 5V a la vez que está conectado el USB-C.

Fuel Gauge

El fuel gauge está conectado al bus I2C usando estas conexiones:
Fuel GaugeESP32-S3
SDAGPIO48
SCLGPIO47
GPOUTEXP5
El fuel gauge tiene la dirección 0x55 en el bus I2C.
El pin de GPOUT está conectado al expansor de pines.

Regulador de 3V3 para los periféricos

Este regulador se puede activar o desactivar para darle alimentación a los periféricos del kode dot. Por defecto está activado, para desactivarlo pon el siguiente pin en LOW:
Regulador 3V3ESP32-S3
ENEXP4
El pin EN está conectado al expansor de pines.

Librerías recomendadas

Arduino

Power Management Integrated Circuit (PMIC)

Fuel Gauge

ESP-IDF

Power Management Integrated Circuit (PMIC)

Fuel Gauge

Ejemplo de código

Power Management Integrated Circuit (PMIC)

Con este código puedes ver los parámetros que devuelven el PMIC de la batería y la alimentación.
pmic_test.ino
/**
 * Ejemplo de uso del PMIC BQ25896 en ESP32-S3 vía I²C.
 * Inicializa el cargador/gestor de batería, muestra parámetros del sistema,
 * y actualiza lecturas y estados cada segundo.
 */
/* ───────── KODE | docs.kode.diy ───────── */

#include "PMIC_BQ25896.h"
#include <Wire.h>

/* Configuración del bus I²C: pines SDA, SCL */
#define I2C_SDA 48           /* Pin SDA */
#define I2C_SCL 47           /* Pin SCL */

/* Instancia del driver BQ25896 */
PMIC_BQ25896 bq25896;

void setup() {
  /* Inicializa puerto serie para depuración */
  Serial.begin(115200);
  while (!Serial) {
    /* Espera la conexión serie */
  }

  /* Inicializa el bus I²C con los pines especificados */
  Wire.begin(I2C_SDA, I2C_SCL);

  Serial.println("BQ25896 Power Management and Battery Charger Example");

  /* Inicializa el BQ25896 por I²C */
  bq25896.begin();
  delay(500);  /* Espera para que el dispositivo se estabilice */

  /* Comprueba la conectividad del dispositivo */
  if (!bq25896.isConnected()) {
    Serial.println("BQ25896 not found! Check connection and power");
    while (1) {
      /* Se detiene si no se detecta */
    }
  } else {
    Serial.println("BQ25896 found successfully.");
  }
}

void loop() {
  Serial.println("BQ25896 System Parameters");

  /* Estado del pin de límite de corriente de entrada */
  Serial.print("ILIM PIN : ");
  Serial.println(String(bq25896.getILIM_reg().en_ilim));

  /* Parámetros de sistema y carga */
  Serial.print("IINLIM       : "); Serial.println(String(bq25896.getIINLIM()) + " mA");
  Serial.print("VINDPM_OS    : "); Serial.println(String(bq25896.getVINDPM_OS()) + " mV");
  Serial.print("SYS_MIN      : "); Serial.println(String(bq25896.getSYS_MIN()) + " mV");
  Serial.print("ICHG         : "); Serial.println(String(bq25896.getICHG()) + " mA");
  Serial.print("IPRE         : "); Serial.println(String(bq25896.getIPRECHG()) + " mA");
  Serial.print("ITERM        : "); Serial.println(String(bq25896.getITERM()) + " mA");
  Serial.print("VREG         : "); Serial.println(String(bq25896.getVREG()) + " mV");
  Serial.print("BAT_COMP     : "); Serial.println(String(bq25896.getBAT_COMP()) + " mΩ");
  Serial.print("VCLAMP       : "); Serial.println(String(bq25896.getVCLAMP()) + " mV");
  Serial.print("BOOSTV       : "); Serial.println(String(bq25896.getBOOSTV()) + " mV");
  Serial.print("BOOST_LIM    : "); Serial.println(String(bq25896.getBOOST_LIM()) + " mA");
  Serial.print("VINDPM       : "); Serial.println(String(bq25896.getVINDPM()) + " mV");
  Serial.print("BATV         : "); Serial.println(String(bq25896.getBATV()) + " mV");
  Serial.print("SYSV         : "); Serial.println(String(bq25896.getSYSV()) + " mV");
  Serial.print("TSPCT        : "); Serial.println(String(bq25896.getTSPCT()) + "%");
  Serial.print("VBUSV        : "); Serial.println(String(bq25896.getVBUSV()) + " mV");
  Serial.print("ICHGR        : "); Serial.println(String(bq25896.getICHGR()) + " mA");

  /* Estado de fallos */
  Serial.print("Fault -> "); 
  Serial.print("NTC:" + String(bq25896.getFAULT_reg().ntc_fault));
  Serial.print(" ,BAT:" + String(bq25896.getFAULT_reg().bat_fault));
  Serial.print(" ,CHGR:" + String(bq25896.getFAULT_reg().chrg_fault));
  Serial.print(" ,BOOST:" + String(bq25896.getFAULT_reg().boost_fault));
  Serial.println(" ,WATCHDOG:" + String(bq25896.getFAULT_reg().watchdog_fault));

  /* Estado de carga */
  Serial.print("Charging Status -> "); 
  Serial.print("CHG_EN:" + String(bq25896.getSYS_CTRL_reg().chg_config));
  Serial.print(" ,BATFET DIS:" + String(bq25896.getCTRL1_reg().batfet_dis));
  Serial.print(" ,BATLOAD_EN:" + String(bq25896.getSYS_CTRL_reg().bat_loaden));
  Serial.print(" ,PG STAT:" + String(bq25896.get_VBUS_STAT_reg().pg_stat));
  Serial.print(" ,VBUS STAT:" + String(bq25896.get_VBUS_STAT_reg().vbus_stat));
  Serial.print(" ,CHRG STAT:" + String(bq25896.get_VBUS_STAT_reg().chrg_stat));
  Serial.println(",VSYS STAT:" + String(bq25896.get_VBUS_STAT_reg().vsys_stat));

  /* Inicia nueva conversión ADC */
  bq25896.setCONV_START(true);

  delay(1000); /* Actualiza cada segundo */
}

Fuel Gauge

Con este código puedes ver los parámetros que devuelve el fuel gauge de la batería.
bq27220_test.ino
/**
 * Example usage of the Texas Instruments BQ27220 battery fuel gauge.
 * Reads state of charge, voltage, current, and temperature over I²C.
 * Displays charging status and estimated time to full when charging.
 */
/* ───────── KODE | docs.kode.diy ───────── */

#include <Wire.h>
#include <BQ27220.h>

/* I²C pin configuration for ESP32-S3 */
#define SDA_PIN 48   /* SDA line */
#define SCL_PIN 47   /* SCL line */

/* Battery fuel gauge driver instance */
BQ27220 gauge;

void setup() {
  /* Initialize serial port for debug output */
  Serial.begin(115200);

  /* Start I²C bus with custom SDA/SCL pins */
  Wire.begin(SDA_PIN, SCL_PIN);

  /* Initialize the BQ27220 fuel gauge */
  if (!gauge.begin()) {
    Serial.println("BQ27220 not found!");
    while (1) delay(1000); /* Halt execution if not found */
  }

  Serial.println("BQ27220 ready.");
}

void loop() {
  /* Read battery parameters */
  int soc = gauge.readStateOfChargePercent();  // State of charge (%)
  int mv  = gauge.readVoltageMillivolts();     // Voltage (mV)
  int ma  = gauge.readCurrentMilliamps();      // Current (mA), positive = charging
  float tC = gauge.readTemperatureCelsius();  // Temperature (°C)

  /* Print basic battery information */
  Serial.print("SOC= "); Serial.print(soc); Serial.print("%  ");
  Serial.print("V= "); Serial.print(mv); Serial.print(" mV  ");
  Serial.print("I= "); Serial.print(ma); Serial.print(" mA  ");
  Serial.print("T= "); Serial.print(tC, 1); Serial.print(" °C");

  /* If charging, show estimated time to full */
  if (ma > 0) {
    int ttf = gauge.readTimeToFullMinutes();
    Serial.print("  TTF= "); Serial.print(ttf); Serial.print(" min");
  }

  Serial.println();

  delay(1000); /* Update once per second */
}

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: Códigos de la alimentación