Skip to Content

Começar com XIAO-ESP32-S3-Sense

Começar com XIAO-ESP32-S3-Sense

O Seeed Studio XIAO-ESP32-S3 Sense é uma placa de desenvolvimento compacta com microcontrolador, projetada para aplicações de edge AI e IoT. Construída em torno do chip ESP32-S3, combina desempenho dual-core, conectividade Wi-Fi e Bluetooth 5, e aceleração AI integrada com um conjunto rico de periféricos num formato minúsculo de 21×17,5 mm.

O que distingue a XIAO-ESP32-S3 Sense é a sua câmara 2MP integrada (OV2640) e o microfone digital (MP34DT06JTR), permitindo visão computacional e processamento de áudio logo à partida. Também inclui 8 MB de PSRAM, 8 MB de flash e um slot para cartão SD externo de 32GB, tornando-a ideal para cargas de trabalho AI leves usando frameworks como TensorFlow Lite Micro ou Edge Impulse.

Este tutorial rápido irá guiá-lo pelos conceitos básicos de configuração da placa, gravação do seu primeiro programa e acesso à câmara e microfone para começar os seus próprios projetos com AI. Para mais informações, veja também o extenso Getting Started Wiki by Seeed Studio.

Peças Necessárias

Obviamente, vai precisar de uma placa XIAO ESP32 S3 Sense da Seeed Studio para experimentar os exemplos de código. Note que a placa pode aquecer bastante, por exemplo, ao transmitir vídeo com alta taxa de frames. Recomendo que coloque um pequeno dissipador de calor na parte de trás da placa (veja a peça listada abaixo).

Se quiser executar o exemplo de código que grava áudio, também precisará de um cartão SD. Listei um cartão de 32 GB, mas um menor (8GB) também serve perfeitamente para experimentar.

Seeed Studio XIAO ESP32 S3 Sense

Cabo USB C

Pequeno dissipador 9×9 mm

Cartão 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 da placa XIAO-ESP32-S3-Sense

A XIAO-ESP32-S3 Sense faz parte da série ultra-compacta XIAO da Seeed Studio. É construída em torno do ESP32-S3R8, um SoC da Espressif Systems adaptado para tarefas de AI e computação de borda. Combina o poder do SoC ESP32-S3 com periféricos integrados num formato compacto, adicionando sensores de visão e áudio onboard.

A XIAO-ESP32-S3 Sense é composta por quatro partes: a placa principal, o Sense Hat, a câmara e a antena Wi-Fi:

Parts of the XIAO-ESP32-S3 Sense
Partes da XIAO-ESP32-S3 Sense

O Sense Hat pode ser ligado à placa principal e tem um soquete para cartão SD, um soquete para a câmara e um microfone. Quando montado, torna-se uma unidade muito compacta com dimensões de um cubo de 20mm. A imagem abaixo mostra a placa XIAO-ESP32-S3-Sense montada sem a 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 montada sem antena Wi-Fi

A alimentação da placa pode ser fornecida via a porta USB Type-C 5V ou pela interface de carregamento da bateria que pode ser ligada a uma bateria LiPo de 3,7V. O consumo de corrente da placa varia de 64μA em modo deep-sleep, sem periféricos, até 340mA ao tirar uma foto.

O alcance Wi-Fi da placa sem a antena externa será bastante curto, mas com a antena pode chegar até 100m. A desvantagem da antena é, obviamente, o espaço que ocupa.

Placa Principal

A placa principal tem um pequeno botão Reset e um botão Button. Ao lado dos botões há pequenos LEDs para carregamento/energia e um LED laranja controlado pelo utilizador no GPIO21. Além dos pinos GPIO, a placa principal também tem conectores para a antena Wi-Fi externa e para o Sense Hat.

Main components of XIAO-ESP32-S3-Sense board
Componentes principais da placa XIAO-ESP32-S3-Sense (source)

A tabela seguinte resume as características técnicas da placa principal:

CategoriaDetalhes
MicrocontroladorEspressif ESP32-S3R8 SoC
CPUDual-core Xtensa® LX7, até 240 MHz
Conjunto de Instruções32-bit, com suporte a extensões vetoriais para ML e DSP
Aceleração AIInstruções vetoriais para processamento leve de redes neurais
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.0Suporta BLE Mesh e modo de longo alcance
Opções de AntenaAntena PCB onboard / conector U.FL para antena externa
GPIOs11 GPIOs multifunção (PWM, digital I/O, alguns analógicos)
ADCADC de 6 canais, 12-bit
I2C1 interface I2C
SPI1 interface SPI
UART1 interface UART
I2SSuportado (para aplicações de áudio)
USBUSB nativo 1.1 FS (12 Mbps), suporte USB-OTG
Conector USBUSB Type-C para alimentação, programação e serial

Sense Hat

Como mencionado, o Sense Hat em cima da placa principal inclui a câmara, o microfone e um soquete para cartão Micro SD. A tabela seguinte resume os detalhes técnicos:

CategoriaDetalhes
Modelo da CâmaraOV2640
Resolução da CâmaraAté 1600 × 1200 (UXGA)
Interface da CâmaraConector de 24 pinos (DVP paralelo de 8 bits + I2C)
Campo de Visão da Câmara~60–65°
Taxa de Frames da CâmaraAté 30 FPS em resoluções mais baixas
Modelo do MicrofoneMP34DT06JTR (microfone digital MEMS)
Interface do MicrofonePDM (Modulação por Densidade de Pulsos)
Sensibilidade do Microfone−26 dBFS
SNR do Microfone61 dB(A)
Suporte a Cartão SDAté 32 GB (FAT)

Pinout da placa XIAO-ESP32-S3-Sense

A imagem seguinte mostra o pinout da placa XIAO-ESP32-S3-Sense:

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

O pino 5V é o 5V da porta USB. O pino 3V3 fornece a saída do regulador onboard e pode fornecer até 700mA. O GND é o terra.

Quanto aos GPIOs: a placa oferece 11 GPIOs digitais/analógicos, mas GPIO0, GPIO3, GPIO43 e GPIO44 são pinos de strapping que precisam estar num estado específico durante o arranque. Uma vez que o microcontrolador está a funcionar, os pinos de strapping operam como pinos IO normais, mas deve evitá-los se possível. Para mais detalhes veja o Getting Started Wiki by Seeed Studio.

O Sense Hat fornece mais dois pinos GPIO (GPIO41, GPIO42) que estão disponíveis para GPIO quando o microfone não está a ser usado.

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

Esquemas

Para informações mais detalhadas, veja também os esquemas da placa XIAO-ESP32-S3-Sense, que pode encontrar no seguinte link.

Instalar Core ESP32

Se quiser usar o Arduino IDE para programar a placa (como faremos), primeiro precisa instalar o Core ESP32 para ativar o suporte a placas ESP32 no Arduino IDE. Abra o seu Arduino IDE e siga os passos indicados abaixo. Se tiver problemas, pode encontrar instruções mais detalhadas no nosso tutorial How to Program ESP32 with Arduino IDE.

URLs adicionais para o gestor de placas

Primeiro abra o diálogo de Preferências selecionando “Preferences…” no menu “File”:

Open Preferences Dialog
Abrir diálogo de Preferências

Isto abrirá o diálogo de Preferências mostrado abaixo. Na aba Settings encontrará uma caixa de edição na parte inferior do diálogo rotulada “Additional boards manager URLs“:

Neste campo copie a seguinte URL: “https://espressif.github.io/arduino-esp32/package_esp32_dev_index.json

Isto informa o Arduino IDE onde encontrar as bibliotecas core do ESP32. A seguir vamos instalar as bibliotecas core ESP32 usando o Gestor de Placas.

Gestor de Placas

Abra o BOARDS MANAGER clicando no ícone da placa na barra lateral do Arduino IDE:

Board icon in Sidebar
Ícone da placa na barra lateral

Verá o BOARDS MANAGER aparecer ao lado da barra lateral. Digite “ESP32” no campo de pesquisa no topo e deverá ver dois tipos de placas ESP32; as “Arduino ESP32 Boards” e as placas “esp32 da Espressif”. Queremos as bibliotecas esp32 da Espressif. Clique no botão INSTALL e aguarde até a descarga e instalação terminarem.

Install ESP32 Core libraries
Instalar bibliotecas Core ESP32

Depois de instalado, o seu Gestor de Placas deverá parecer com isto, embora a versão real (aqui 3.0.0-a) possa ser diferente.

ESP32 core installed
Core ESP32 instalado

No passo seguinte, mostro como selecionar a placa ESP32 para a XIAO-ESP32-S3-Sense.

Selecionar placa XIAO_ESP32S3

Pode selecionar uma placa no menu suspenso sob a barra de menus: no exemplo abaixo está selecionada uma Arduino Uno, por exemplo:

Bord selector
Seletor de placa

Clicando no nome da placa atualmente selecionada (Arduino Uno), abrirá o diálogo de seleção de placa. Na caixa de pesquisa digite “xiao s3” e selecione “XIAO_ESP32S3” como mostrado abaixo:

Select XIAO_ESP32S3 in Board Manager
Selecionar XIAO_ESP32S3 no Gestor de Placas

Se a placa estiver ligada ao seu PC via USB, também deverá conseguir selecionar a porta COM. Na captura acima é COM9, mas no seu caso pode ser outra porta COM.

Exemplos de Código

Nesta secção, vou fornecer alguns exemplos de código sobre como usar o microfone e a câmara da placa. No entanto, começaremos com o exemplo comum Blink para testar a instalação da placa e a comunicação USB.

Piscar LED onboard

Este é o exemplo comum Blink. Liga e desliga o LED onboard durante um segundo. O LED onboard da XIAO-ESP32-S3 Sense está ligado ao GPIO21, mas é invertido. LOW significa que o LED está ligado e HIGH que está desligado. Pode ver isto no exemplo de código abaixo:

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);                      
}

Ler & Escrever GPIO

Nos exemplos muito curtos seguintes, lemos e escrevemos GPIO. Para especificar pinos no código pode usar o número GPIO x ou o número Dx. Por exemplo, de acordo com o pinout, D3 ou GPIO4 identificam o mesmo pino e no seu código pode usar qualquer um dos dois. Os dois exemplos de código seguintes são idênticos em função e definem GPIO4 para HIGH:

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

Se quiser ler sinais analógicos pode usar as constantes pré-definidas Ax. Por exemplo, o código seguinte lê uma entrada analógica de A3, que é o mesmo que o pino GPIO4:

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

Os valores analógicos variam de 0 a 4095, o que equivale a uma tensão na entrada entre 0 e 3,3V.

Ler sinal do microfone

O próximo exemplo usa o microfone incorporado para amostrar dados de áudio via I2S e exibe os dados de áudio no Monitor Serial e no 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);
  }
}

Se executar o código, abrir o Serial Plotter e assobiar numa frequência fixa, verá uma bonita onda senoidal no Serial Plotter:

Audio Signal in Serial Monitor measured with Microphone
Sinal de áudio no Monitor Serial medido com microfone

Se variar a frequência assobiando um pouco mais baixo ou mais alto, verá que a frequência da onda senoidal exibida muda em conformidade. Muito fixe ; )

Gravar áudio

O código de exemplo seguinte mostra como gravar 20 segundos de áudio e grava os dados como um ficheiro de áudio em formato WAV no cartão SD. Vai precisar de um cartão SD formatado.

Assim que abrir o Monitor Serial, o código imprime “20 SEC RECORDING STARTED …” e inicia a gravação. Após 20 segundos grava o ficheiro de áudio e imprime “COMPLETE.”. Pode então retirar o cartão SD e ouvir o áudio gravado no seu computador.

#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);
}

Se quiser mais informações sobre como gravar áudio, veja o tutorial Record Audio with XIAO-ESP32-S3-Sense.

Transmitir vídeo

Como exemplo final, vamos transmitir dados de vídeo para o navegador web do seu computador. No entanto, o código requer a biblioteca esp32cam, que pode instalar via o Library Manager no Arduino IDE. Basta procurar por “esp32cam” e clicar em INSTALL. A imagem abaixo mostra a instalação concluída:

esp32cam library installed via Library Manager
Biblioteca esp32cam instalada via Library Manager

Além disso, no código abaixo terá de substituir SSID e PASSWORD pelas credenciais reais da sua rede Wi-Fi.

De seguida, deve definir o seguinte parâmetro para a placa no menu Tools:

  • ativar: OPI PSRAM
  • definir Partition Scheme: Maximum APP

Isto deve permitir compilar e executar o código. Ele imprimirá a URL para o stream de vídeo no Monitor Serial, por exemplo “Stream at: http://192.168.2.40/stream”. Se copiar e colar esta URL na barra de endereços do seu navegador, deverá ver o vídeo.

#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();
}

Se quiser informações mais detalhadas, veja o tutorial Stream Video with with XIAO-ESP32-S3-Sense.

E é tudo! Agora deve ter informação suficiente para usar a câmara, microfone e GPIO da placa XIAO-ESP32-S3 Sense.

Conclusões

Este artigo mostrou como começar rapidamente com a Seeed Studio XIAO-ESP32-S3 Sense. A Seeed Studio tem muito mais informação no seu Getting Started Wiki.

Comparado com outras placas similares como a ESP32-CAM ou a ESP32-WROVER CAM, que também têm câmaras, as vantagens da XIAO-ESP32-S3 Sense são o tamanho muito menor, o microfone adicional e um microcontrolador com suporte específico para aplicações AI, como classificação de objetos, deteção facial e mais.

Pode encontrar vários pretrained modeled no site da Seeed Studio, onde a plataforma SenseCraft AI facilita a implementação destes modelos. E se estiver interessado em aplicações controladas por voz e quiser treinar o seu próprio modelo, veja os nossos tutoriais Voice control with XIAO-ESP32-S3-Sense and Edge Impulse e Train an Object Detection Model with Edge Impulse for ESP32-CAM.

Se tiver alguma dúvida, sinta-se à vontade para deixar nos comentários.

Boas experiências a criar 😉