Skip to Content

Primeros pasos con XIAO-ESP32-S3-Sense

Primeros pasos con XIAO-ESP32-S3-Sense

El Seeed Studio XIAO-ESP32-S3 Sense es una placa de desarrollo con microcontrolador compacta diseñada para aplicaciones de edge AI e IoT. Construida alrededor del ESP32-S3, combina rendimiento de doble núcleo, conectividad Wi-Fi y Bluetooth 5, y aceleración AI integrada con un conjunto completo de periféricos en un formato diminuto de 21×17.5 mm.

Lo que distingue al XIAO-ESP32-S3 Sense es su cámara integrada de 2MP (OV2640) y micrófono digital (MP34DT06JTR), que permiten visión por computadora y procesamiento de audio desde el primer momento. También cuenta con 8 MB de PSRAM, 8 MB de flash y una ranura para tarjeta SD externa de hasta 32GB, lo que la hace ideal para cargas de trabajo AI ligeras usando frameworks como TensorFlow Lite Micro o Edge Impulse.

Este tutorial rápido te guiará por los conceptos básicos para configurar la placa, cargar tu primer programa y acceder a la cámara y el micrófono para comenzar con tus propios proyectos impulsados por AI. Para más información, también consulta el extenso Getting Started Wiki by Seeed Studio.

Partes necesarias

Obviamente, necesitarás una placa XIAO ESP32 S3 Sense de Seeed Studio para probar los ejemplos de código. Ten en cuenta que la placa puede calentarse mucho, por ejemplo, al transmitir video a alta tasa de frames. Te recomiendo colocar un pequeño disipador en la parte trasera de la placa (ver la pieza listada abajo).

Si quieres ejecutar el ejemplo de código que graba audio, también necesitarás una tarjeta SD. He listado una tarjeta de 32 GB, pero una más pequeña (8GB) también servirá para probar.

Seeed Studio XIAO ESP32 S3 Sense

Cable USB C

Pequeño disipador 9×9 mm

Tarjeta SD 32GB

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Características de la placa XIAO-ESP32-S3-Sense

La XIAO-ESP32-S3 Sense forma parte de la serie ultra-compacta XIAO de Seeed Studio. Está construida alrededor del ESP32-S3R8, un SoC de Espressif Systems diseñado para tareas de AI y computación en el borde. Combina la potencia del ESP32-S3 SoC con periféricos integrados en un formato compacto, añadiendo sensores de visión y audio a bordo.

La XIAO-ESP32-S3 Sense consta de cuatro partes: la placa principal, el Sense Hat, la cámara y la antena Wi-Fi:

Parts of the XIAO-ESP32-S3 Sense
Partes de la XIAO-ESP32-S3 Sense

El Sense Hat se conecta a la placa principal y tiene una ranura para tarjeta SD, un conector para la cámara y un micrófono. Cuando está ensamblado, forma una unidad muy compacta con dimensiones de un cubo de 20 mm. La imagen abajo muestra la placa XIAO-ESP32-S3-Sense ensamblada sin la antena Wi-Fi:

This image has an empty alt attribute; its file name is image-1.png
Assembled XIAO-ESP32-S3-Sense board without Wi-Fi Antenna
Placa XIAO-ESP32-S3-Sense ensamblada sin antena Wi-Fi

La alimentación de la placa puede suministrarse a través del puerto USB tipo C de 5V o mediante la interfaz de carga de batería que se conecta a una batería LiPo de 3.7V. El consumo de corriente varía desde 64μA en modo deep-sleep sin periféricos hasta 340mA al tomar una foto.

El alcance Wi-Fi sin la antena externa será bastante corto, pero con la antena puede llegar hasta 100m. La desventaja de la antena es que ocupa espacio.

Placa principal

La placa principal tiene un pequeño botón Reset y otro botón pequeño. Junto a los botones hay LEDs pequeños para carga/energía y un LED naranja controlado por el usuario en GPIO21. Además de los pines GPIO, la placa principal tiene conectores para la antena Wi-Fi externa y el Sense Hat.

Main components of XIAO-ESP32-S3-Sense board
Componentes principales de la placa XIAO-ESP32-S3-Sense (source)

La siguiente tabla resume las características técnicas de la placa principal:

CategoríaDetalles
MicrocontroladorEspressif ESP32-S3R8 SoC
CPUDoble núcleo Xtensa® LX7, hasta 240 MHz
Conjunto de instrucciones32 bits, con soporte de extensión vectorial para cargas ML y DSP
Aceleración AIInstrucciones vectoriales para procesamiento ligero de redes neuronales
ROM384 KB
SRAM512 KB
RAM externa8 MB PSRAM
Flash8 MB QSPI NOR Flash
Wi-FiIEEE 802.11 b/g/n (2.4 GHz)
Bluetooth LE 5.0Soporta BLE Mesh y modo de largo alcance
Opciones de antenaAntena PCB integrada / conector U.FL para antena externa
GPIOs11 GPIOs multifunción (PWM, digital I/O, algunos analógicos)
ADCADC de 6 canales, 12 bits
I2C1 interfaz I2C
SPI1 interfaz SPI
UART1 interfaz UART
I2SSoportado (para aplicaciones de audio)
USBUSB nativo 1.1 FS (12 Mbps), soporte USB-OTG
Conector USBUSB Tipo-C para alimentación, programación y serial

Sense Hat

Como se mencionó antes, el Sense Hat encima de la placa principal lleva la cámara, el micrófono y una ranura para Micro SD. La siguiente tabla resume los detalles técnicos:

CategoríaDetalles
Modelo de cámaraOV2640
Resolución de cámaraHasta 1600 × 1200 (UXGA)
Interfaz de cámaraConector de 24 pines (DVP paralelo de 8 bits + I2C)
Campo de visión de cámara~60–65°
Tasa de frames de cámaraHasta 30 FPS a resoluciones bajas
Modelo de micrófonoMP34DT06JTR (micrófono digital MEMS)
Interfaz de micrófonoPDM (Modulación por densidad de pulsos)
Sensibilidad del micrófono−26 dBFS
SNR del micrófono61 dB(A)
Soporte para tarjeta SDHasta 32 GB (FAT)

Pinout de la placa XIAO-ESP32-S3-Sense

La siguiente imagen muestra el pinout de la placa XIAO-ESP32-S3-Sense:

Pinout of XIAO-ESP32-S3-Sense board
Pinout de la placa XIAO-ESP32-S3-Sense (source)

El pin 5V es el 5V del puerto USB. El pin 3V3 proporciona la salida del regulador integrado y puede entregar hasta 700mA. Y GND es tierra.

En cuanto a los GPIOs: la placa ofrece 11 GPIOs digitales/analógicos pero GPIO0, GPIO3, GPIO43 y GPIO44 son pines de configuración que deben estar en un estado específico durante el arranque. Una vez que el microcontrolador está en funcionamiento, estos pines actúan como pines IO normales, pero es recomendable evitarlos si es posible. Para más detalles, consulta el Getting Started Wiki by Seeed Studio.

El Sense Hat proporciona dos pines GPIO adicionales (GPIO41, GPIO42) que están disponibles como GPIO cuando no se usa el micrófono.

Pinout del Sense Hat XIAO-ESP32-S3-Sense (source)

Esquemáticos

Para información más detallada, también consulta los esquemáticos de la placa XIAO-ESP32-S3-Sense, que puedes encontrar en el siguiente enlace.

Instalar ESP32 Core

Si quieres usar el IDE de Arduino para programar la placa (como haremos), primero necesitas instalar el ESP32 Core para habilitar soporte para placas ESP32 dentro del IDE de Arduino. Abre tu Arduino IDE y sigue los pasos indicados a continuación. Si tienes problemas, puedes encontrar instrucciones más detalladas en nuestro tutorial How to Program ESP32 with Arduino IDE.

URLs adicionales para el gestor de placas

Primero abre el diálogo de Preferencias seleccionando «Preferences…» en el menú «File»:

Open Preferences Dialog
Abrir diálogo de Preferencias

Esto abrirá el diálogo de Preferencias mostrado abajo. En la pestaña Settings encontrarás un cuadro de edición en la parte inferior del diálogo etiquetado como «Additional boards manager URLs«:

En este campo copia la siguiente URL: «https://espressif.github.io/arduino-esp32/package_esp32_dev_index.json«

Esto indicará al IDE de Arduino dónde encontrar las librerías core del ESP32. A continuación instalaremos las librerías core del ESP32 usando el Gestor de Placas.

Gestor de Placas

Abre el BOARDS MANAGER haciendo clic en el icono de placa en la barra lateral del IDE de Arduino:

Board icon in Sidebar
Icono de placa en la barra lateral

Verás el BOARDS MANAGER aparecer a la derecha de la barra lateral. Escribe «ESP32» en el campo de búsqueda en la parte superior y deberías ver dos tipos de placas ESP32; las «Arduino ESP32 Boards» y las placas «esp32 de Espressif». Queremos las librerías esp32 de Espressif. Haz clic en el botón INSTALL y espera a que la descarga e instalación finalicen.

Install ESP32 Core libraries
Instalar librerías core ESP32

Una vez instalado, tu Gestor de Placas debería verse así, aunque la versión real (aquí 3.0.0-a) puede ser diferente.

ESP32 core installed
Core ESP32 instalado

En el siguiente paso, te mostraré cómo seleccionar la placa ESP32 para la XIAO-ESP32-S3-Sense.

Seleccionar placa XIAO_ESP32S3

Puedes seleccionar una placa desde el selector desplegable bajo la barra de menú: en el ejemplo abajo se muestra Arduino Uno como placa seleccionada, por ejemplo:

Bord selector
Selector de placa

Al hacer clic en el nombre de la placa seleccionada actualmente (Arduino Uno), se abrirá el diálogo de selección de placa. En el cuadro de búsqueda escribe «xiao s3» y selecciona «XIAO_ESP32S3» como se muestra abajo:

Select XIAO_ESP32S3 in Board Manager
Seleccionar XIAO_ESP32S3 en el Gestor de Placas

Si la placa está conectada a tu PC vía USB, también podrás seleccionar el puerto COM. En la captura de pantalla arriba es COM9, pero en tu caso puede ser otro puerto COM.

Ejemplos de código

En esta sección, te proporcionaré algunos ejemplos de código para usar el micrófono y la cámara de la placa. Sin embargo, comenzaremos con el ejemplo común Blink para probar la instalación de la placa y la comunicación USB.

Parpadeo del LED integrado

Este es el común Blink ejemplo. Enciende y apaga el LED integrado durante un segundo. El LED integrado del XIAO-ESP32-S3 Sense está conectado al GPIO21 pero está invertido. LOW significa que el LED está encendido y HIGH que está apagado. Puedes verlo en el ejemplo de código abajo:

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  Serial.println("Off");
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);     
  Serial.println("On");                 
  digitalWrite(LED_BUILTIN, LOW);   
  delay(1000);                      
}

Leer y escribir GPIO

En los siguientes ejemplos muy cortos, leemos y escribimos en GPIO. Para especificar pines en el código puedes usar el número GPIO x o el número Dx. Por ejemplo, según el pinout, D3 o GPIO4 identifican el mismo pin y en tu código puedes usar cualquiera de los dos. Los siguientes dos ejemplos de código son idénticos en función y configuran GPIO4 a HIGH:

digitalWrite(D3, HIGH);  // D3 == GPIO4
digitalWrite(4, HIGH);  // D3 == GPIO4

Si quieres leer señales analógicas puedes usar las constantes predefinidas Ax. Por ejemplo, el siguiente código lee una entrada analógica de A3, que es igual que el pin GPIO4:

int val = analogRead(A3);  // A3 == GPIO4
int val = analogRead(4);  // A3 == GPIO4

Los valores analógicos van de 0 a 4095, lo que equivale a un voltaje en la entrada entre 0 y 3.3V.

Leer señal del micrófono

El siguiente ejemplo usa el micrófono integrado para muestrear datos de audio vía I2S y muestra los datos en el Monitor Serial y el Serial Plotter:

#include "ESP_I2S.h"

const int8_t I2S_CLK = 42;
const int8_t I2S_DIN = 41;
const uint32_t SAMPLERATE = 16000;

I2SClass I2S;

void setup() {
  Serial.begin(115200);

  I2S.setPinsPdmRx(I2S_CLK, I2S_DIN);
  if (!I2S.begin(I2S_MODE_PDM_RX, SAMPLERATE, I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_MONO)) {
    Serial.println("Can't find microphone!");
    while (1)
      ;
  }
}

void loop() {
  int sample = I2S.read();
  if (sample > 1) {
    Serial.println(sample);
  }
}

Si ejecutas el código, abres el Serial Plotter y silbas a una frecuencia fija, verás una bonita onda sinusoidal en el Serial Plotter:

Audio Signal in Serial Monitor measured with Microphone
Señal de audio en Monitor Serial medida con micrófono

Si varías la frecuencia silbando un poco más bajo o más alto, verás que la frecuencia de la onda sinusoidal mostrada cambia en consecuencia. Bastante chulo ; )

Grabar audio

El siguiente código de ejemplo te muestra cómo grabar 20 segundos de audio y guardar los datos como un archivo de audio en formato WAV en la tarjeta SD. Necesitarás una tarjeta SD formateada.

En cuanto abras el Monitor Serial, el código imprime «20 SEC RECORDING STARTED …» y comienza la grabación. Después de 20 segundos escribe el archivo de audio e imprime «COMPLETE.». Luego puedes desconectar la tarjeta SD y escuchar el audio grabado en tu ordenador.

#include "ESP_I2S.h"
#include "FS.h"
#include "SD.h"

void setup() {
  I2SClass i2s;
  uint8_t *wav_buffer;
  size_t wav_size;

  Serial.begin(115200);
  while (!Serial) {
    delay(10);
  }

  i2s.setPinsPdmRx(42, 41);
  if (!i2s.begin(I2S_MODE_PDM_RX, 16000, I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_MONO)) {
    Serial.println("Can't find microphone!");
    while (1); // do nothing
  }

  if(!SD.begin(21)){
    Serial.println("Failed to mount SD Card!");
    while (1) ;
  }

  Serial.println("20 SEC RECORDING STARTED ...");
  wav_buffer = i2s.recordWAV(20, &wav_size);

  File file = SD.open("/audio.wav", FILE_WRITE);
  if (!file) {
    Serial.println("Failed to open file for writing!");
    return;
  }

  if (file.write(wav_buffer, wav_size) != wav_size) {
    Serial.println("Failed to write audio data to file!");
    return;
  }

  file.close();
  Serial.println("COMPLETE.");
}

void loop() {
  delay(1000);
}

Si quieres más información sobre cómo grabar audio, consulta el tutorial Record Audio with XIAO-ESP32-S3-Sense.

Transmitir video

Como ejemplo final, vamos a transmitir datos de video al navegador web de tu ordenador. Sin embargo, el código requiere la librería esp32cam, que puedes instalar desde el Gestor de Librerías en el IDE de Arduino. Solo busca «esp32cam» y presiona INSTALL. La imagen abajo muestra la instalación completada:

esp32cam library installed via Library Manager
Librería esp32cam instalada vía Gestor de Librerías

Además, en el código abajo deberás reemplazar SSID y PASSWORD con las credenciales reales de tu red Wi-Fi.

Luego deberías configurar el siguiente parámetro para la placa en el menú Tools:

  • habilitar: OPI PSRAM
  • establecer Partition Scheme: Maximum APP

Esto debería permitirte compilar y ejecutar el código. Imprimirá la URL para la transmisión de video en el Monitor Serial, por ejemplo «Stream at: http://192.168.2.40/stream». Si copias y pegas esta URL en la barra de direcciones de tu navegador web, deberías ver el video.

#include "WebServer.h"
#include "WiFi.h"
#include "esp32cam.h"

const char* WIFI_SSID = "SSID";
const char* WIFI_PASS = "PASSWORD";
const char* URL = "/stream";
const auto RESOLUTION = esp32cam::Resolution::find(800, 600);
const int FRAMERATE = 10;

WebServer server(80);

void handleStream() {
  static char head[128];
  WiFiClient client = server.client();

  server.sendContent("HTTP/1.1 200 OK\r\n"
                     "Content-Type: multipart/x-mixed-replace; "
                     "boundary=frame\r\n\r\n");

  while (client.connected()) {
    auto frame = esp32cam::capture();
    if (frame) {
      sprintf(head,
              "--frame\r\n"
              "Content-Type: image/jpeg\r\n"
              "Content-Length: %ul\r\n\r\n",
              frame->size());
      client.write(head, strlen(head));
      frame->writeTo(client);
      client.write("\r\n");
      delay(1000/FRAMERATE);
    }
  }
}

void initCamera() {
  using namespace esp32cam;
  Config cfg;
  cfg.setPins(pins::XiaoSense);
  cfg.setResolution(RESOLUTION);
  cfg.setBufferCount(2);
  cfg.setJpeg(80);
  Camera.begin(cfg);
}

void initWifi() {
  WiFi.persistent(false);
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
  }
  Serial.printf("Stream at: http://%s%s\n",
                WiFi.localIP().toString().c_str(), URL);
}

void initServer() {
  server.on(URL, handleStream);
  server.begin();
}

void setup() {
  Serial.begin(115200);
  initWifi();
  initCamera();
  initServer();
}

void loop() {
  server.handleClient();
}

Si quieres información más detallada, consulta el tutorial Stream Video with with XIAO-ESP32-S3-Sense.

¡Y eso es todo! Ahora deberías tener suficiente información para usar la cámara, el micrófono y los GPIO de la placa XIAO-ESP32-S3 Sense.

Conclusiones

Este post te mostró cómo empezar rápidamente con la Seeed Studio XIAO-ESP32-S3 Sense. Seeed Studio tiene mucha más información en su Getting Started Wiki.

Comparado con otras placas similares como la ESP32-CAM o la ESP32-WROVER CAM, que también tienen cámaras, las ventajas de la XIAO-ESP32-S3 Sense son su tamaño mucho más pequeño, el micrófono adicional y un microcontrolador con soporte específico para aplicaciones AI, como clasificación de objetos, detección facial y más.

Puedes encontrar varios pretrained modeled en el sitio de Seeed Studio, donde la plataforma SenseCraft AI facilita el despliegue de estos modelos. Y si te interesan las aplicaciones controladas por voz y quieres entrenar tu propio modelo, echa un vistazo a nuestros tutoriales Voice control with XIAO-ESP32-S3-Sense and Edge Impulse y Train an Object Detection Model with Edge Impulse for ESP32-CAM.

Si tienes alguna pregunta, no dudes en dejarla en la sección de comentarios.

¡Feliz bricolaje! 😉