Pular para o conteúdo principal

Usando XIAO ESP32S3 Sense como um Sensor de IA com SenseCraft AI

Este wiki fornece um guia passo a passo sobre como configurar a saída de um modelo no SenseCraft AI e usar o XIAO ESP32S3 Sense como um sensor de IA. Seguindo estas instruções, você aprenderá como conectar o XIAO ESP32S3 Sense ao seu computador, selecionar o método de saída apropriado e recuperar os dados do modelo usando diferentes protocolos de comunicação, como UART, I2C e SPI.

Pré-requisitos

Antes de continuar, certifique-se de que você tem o seguinte:

  • XIAO ESP32S3 Sense
  • Uma placa XIAO adicional (por exemplo, XIAO ESP32C3) para receber os dados do modelo
  • Cabo de dados USB-C para conectar o XIAO ESP32S3 Sense ao seu computador
  • Arduino IDE com a biblioteca Seeed_Arduino_SSCMA instalada
XIAO ESP32S3 Sense

Passo 1. Acesse o SenseCraft AI Vision Workspace e conecte o XIAO ESP32S3 Sense

Abra o seu navegador e acesse a página do SenseCraft AI Vision Workspace.


Selecione a placa XIAO ESP32S3 Sense entre os dispositivos disponíveis.

Usando o cabo USB-C, conecte sua placa XIAO ESP32S3 Sense ao computador. Depois de conectada, clique no botão Connect localizado no canto superior esquerdo da página do SenseCraft AI Vision Workspace.

Passo 2. Certifique-se de que um modelo está carregado no XIAO ESP32S3 Sense

Antes de continuar, verifique se a sua placa XIAO ESP32S3 Sense tem um modelo treinado carregado. Se você ainda não carregou um modelo, consulte a documentação do SenseCraft AI sobre como treinar e implantar modelos no seu dispositivo.

Se você quiser usar o seu próprio modelo treinado, pode consultar os dois Wikis a seguir.

Passo 3. Prepare a forma e o programa que você deseja usar

O XIAO suporta a saída dos resultados do modelo via UART, IIC ou SPI; você pode escolher como deseja enviar os resultados de acordo com a situação real.

Opção 1. Comunicação UART

Conecte os pinos TX e RX das duas placas XIAO entre si. Para o XIAO ESP32S3 Sense como Sensor de IA (já modelado), os pinos de saída são definidos como:

  • TX: GPIO43
  • RX: GPIO44

Baixe a biblioteca Seeed_Arduino_SSCMA do GitHub e adicione-a ao seu ambiente Arduino.


Use o código do seguinte exemplo:

nota

Defina a taxa de baud para 921600 com 8 bits de dados, sem paridade e 1 bit de parada (8N1).

#include <Seeed_Arduino_SSCMA.h>

#ifdef ESP32
#include <HardwareSerial.h>

// Define two Serial devices mapped to the two internal UARTs
HardwareSerial atSerial(0);

#else
#define atSerial Serial1
#endif

SSCMA AI;

void setup()
{
Serial.begin(9600);
AI.begin(&atSerial);
}

void loop()
{
if (!AI.invoke(1,false,true))
{
Serial.println("invoke success");
Serial.print("perf: prepocess=");
Serial.print(AI.perf().prepocess);
Serial.print(", inference=");
Serial.print(AI.perf().inference);
Serial.print(", postpocess=");
Serial.println(AI.perf().postprocess);

for (int i = 0; i < AI.boxes().size(); i++)
{
Serial.print("Box[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.boxes()[i].target);
Serial.print(", score=");
Serial.print(AI.boxes()[i].score);
Serial.print(", x=");
Serial.print(AI.boxes()[i].x);
Serial.print(", y=");
Serial.print(AI.boxes()[i].y);
Serial.print(", w=");
Serial.print(AI.boxes()[i].w);
Serial.print(", h=");
Serial.println(AI.boxes()[i].h);
}
for (int i = 0; i < AI.classes().size(); i++)
{
Serial.print("Class[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.classes()[i].target);
Serial.print(", score=");
Serial.println(AI.classes()[i].score);
}
for (int i = 0; i < AI.points().size(); i++)
{
Serial.print("Point[");
Serial.print(i);
Serial.print("]: target=");
Serial.print(AI.points()[i].target);
Serial.print(", score=");
Serial.print(AI.points()[i].score);
Serial.print(", x=");
Serial.print(AI.points()[i].x);
Serial.print(", y=");
Serial.println(AI.points()[i].y);
}
for (int i = 0; i < AI.keypoints().size(); i++)
{
Serial.print("keypoint[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.keypoints()[i].box.target);
Serial.print(", score=");
Serial.print(AI.keypoints()[i].box.score);
Serial.print(", box:[x=");
Serial.print(AI.keypoints()[i].box.x);
Serial.print(", y=");
Serial.print(AI.keypoints()[i].box.y);
Serial.print(", w=");
Serial.print(AI.keypoints()[i].box.w);
Serial.print(", h=");
Serial.print(AI.keypoints()[i].box.h);
Serial.print("], points:[");
for (int j = 0; j < AI.keypoints()[i].points.size(); j++)
{
Serial.print("[");
Serial.print(AI.keypoints()[i].points[j].x);
Serial.print(",");
Serial.print(AI.keypoints()[i].points[j].y);
Serial.print("],");
}
Serial.println("]");
}
if(!AI.last_image().isEmpty())
{
Serial.print("Last image:");
Serial.println(AI.last_image().c_str());
}
}
}

Se tudo correr bem, você verá a mensagem de saída do resultado do modelo, como mostrado abaixo.

Opção 2. Comunicação I2C

Conecte os pinos SDA e SCL das duas placas XIAO entre si. Para o XIAO ESP32S3 Sense como Sensor de IA (já modelado), os pinos de saída são definidos como:

  • SDA: GPIO5 (com resistor de pull-up)
  • SCL: GPIO6 (com resistor de pull-up)
  • Endereço escravo I2C em 0x62

Baixe a biblioteca Seeed_Arduino_SSCMA do GitHub e adicione-a ao seu ambiente Arduino.


Use o código do seguinte exemplo:

nota

Use o seguinte protocolo para comunicação I2C:

  • READ: Envie os bytes 0x10, 0x01, LEN << 8, LEN & 0xff
  • WRITE: Envie os bytes 0x10, 0x02, LEN << 8, LEN & 0xff
  • AVAIL (para verificar a disponibilidade de dados): Envie os bytes 0x10, 0x03
  • RESET (para limpar o buffer): Envie os bytes 0x10, 0x06
#include <Seeed_Arduino_SSCMA.h>
#include <Wire.h>

SSCMA AI;

void setup()
{
Wire.begin();
AI.begin(&Wire);
Serial.begin(9600);
}

void loop()
{
if (!AI.invoke())
{
Serial.println("invoke success");
Serial.print("perf: prepocess=");
Serial.print(AI.perf().prepocess);
Serial.print(", inference=");
Serial.print(AI.perf().inference);
Serial.print(", postpocess=");
Serial.println(AI.perf().postprocess);

for (int i = 0; i < AI.boxes().size(); i++)
{
Serial.print("Box[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.boxes()[i].target);
Serial.print(", score=");
Serial.print(AI.boxes()[i].score);
Serial.print(", x=");
Serial.print(AI.boxes()[i].x);
Serial.print(", y=");
Serial.print(AI.boxes()[i].y);
Serial.print(", w=");
Serial.print(AI.boxes()[i].w);
Serial.print(", h=");
Serial.println(AI.boxes()[i].h);
}
for (int i = 0; i < AI.classes().size(); i++)
{
Serial.print("Class[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.classes()[i].target);
Serial.print(", score=");
Serial.println(AI.classes()[i].score);
}
for (int i = 0; i < AI.points().size(); i++)
{
Serial.print("Point[");
Serial.print(i);
Serial.print("]: target=");
Serial.print(AI.points()[i].target);
Serial.print(", score=");
Serial.print(AI.points()[i].score);
Serial.print(", x=");
Serial.print(AI.points()[i].x);
Serial.print(", y=");
Serial.println(AI.points()[i].y);
}
for (int i = 0; i < AI.keypoints().size(); i++)
{
Serial.print("keypoint[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.keypoints()[i].box.target);
Serial.print(", score=");
Serial.print(AI.keypoints()[i].box.score);
Serial.print(", box:[x=");
Serial.print(AI.keypoints()[i].box.x);
Serial.print(", y=");
Serial.print(AI.keypoints()[i].box.y);
Serial.print(", w=");
Serial.print(AI.keypoints()[i].box.w);
Serial.print(", h=");
Serial.print(AI.keypoints()[i].box.h);
Serial.print("], points:[");
for (int j = 0; j < AI.keypoints()[i].points.size(); j++)
{
Serial.print("[");
Serial.print(AI.keypoints()[i].points[j].x);
Serial.print(",");
Serial.print(AI.keypoints()[i].points[j].y);
Serial.print("],");
}
Serial.println("]");
}
}
}

Se tudo correr bem, você verá a mensagem de saída do resultado do modelo, como mostrado abaixo.

Opção 3. Comunicação SPI

  1. Conecte os seguintes pinos das duas placas XIAO. Para o XIAO ESP32S3 Sense do Sensor de IA (já modelado), os pinos de saída são definidos como:
  • MOSI: GPIO9 (com resistor de pull-up)
  • MISO: GPIO8
  • SCLK: GPIO7 (com resistor de pull-up)
  • CS: GPIO4 (com resistor de pull-up)
  1. Baixe a biblioteca Seeed_Arduino_SSCMA do GitHub e adicione-a ao seu ambiente Arduino.

  1. Modifique o código dos exemplos fornecidos para usar comunicação SPI.
nota

Use o seguinte protocolo para comunicação SPI:

  • READ: Envie os bytes 0x10, 0x01, LEN << 8, LEN & 0xff
  • WRITE: Envie os bytes 0x10, 0x02, LEN << 8, LEN & 0xff
  • AVAIL (para verificar a disponibilidade de dados): Envie os bytes 0x10, 0x03
  • RESET (para limpar o buffer): Envie os bytes 0x10, 0x06
#include <Seeed_Arduino_SSCMA.h>
#include <SPI.h>

SSCMA AI;

void setup()
{
SPI.begin(SCK, MISO, MOSI, -1);
AI.begin(&SPI, D3, -1, -1);
Serial.begin(9600);
}

void loop()
{
if (!AI.invoke())
{
Serial.println("invoke success");
Serial.print("perf: prepocess=");
Serial.print(AI.perf().prepocess);
Serial.print(", inference=");
Serial.print(AI.perf().inference);
Serial.print(", postpocess=");
Serial.println(AI.perf().postprocess);

for (int i = 0; i < AI.boxes().size(); i++)
{
Serial.print("Box[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.boxes()[i].target);
Serial.print(", score=");
Serial.print(AI.boxes()[i].score);
Serial.print(", x=");
Serial.print(AI.boxes()[i].x);
Serial.print(", y=");
Serial.print(AI.boxes()[i].y);
Serial.print(", w=");
Serial.print(AI.boxes()[i].w);
Serial.print(", h=");
Serial.println(AI.boxes()[i].h);
}
for (int i = 0; i < AI.classes().size(); i++)
{
Serial.print("Class[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.classes()[i].target);
Serial.print(", score=");
Serial.println(AI.classes()[i].score);
}
for (int i = 0; i < AI.points().size(); i++)
{
Serial.print("Point[");
Serial.print(i);
Serial.print("]: target=");
Serial.print(AI.points()[i].target);
Serial.print(", score=");
Serial.print(AI.points()[i].score);
Serial.print(", x=");
Serial.print(AI.points()[i].x);
Serial.print(", y=");
Serial.println(AI.points()[i].y);
}
for (int i = 0; i < AI.keypoints().size(); i++)
{
Serial.print("keypoint[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.keypoints()[i].box.target);
Serial.print(", score=");
Serial.print(AI.keypoints()[i].box.score);
Serial.print(", box:[x=");
Serial.print(AI.keypoints()[i].box.x);
Serial.print(", y=");
Serial.print(AI.keypoints()[i].box.y);
Serial.print(", w=");
Serial.print(AI.keypoints()[i].box.w);
Serial.print(", h=");
Serial.print(AI.keypoints()[i].box.h);
Serial.print("], points:[");
for (int j = 0; j < AI.keypoints()[i].points.size(); j++)
{
Serial.print("[");
Serial.print(AI.keypoints()[i].points[j].x);
Serial.print(",");
Serial.print(AI.keypoints()[i].points[j].y);
Serial.print("],");
}
Serial.println("]");
}
}
}

Se tudo correr bem, você verá a mensagem de saída do resultado do modelo, como mostrado abaixo.

Passo 4: Envie o Código e Execute

Abra o código de exemplo apropriado na IDE do Arduino com base no protocolo de comunicação escolhido. Verifique e carregue o código para a placa XIAO receptora. Abra o monitor serial na IDE do Arduino para visualizar os dados do modelo recebidos.

Conclusão

Seguindo este guia passo a passo, você configurou com sucesso a saída de um modelo no SenseCraft AI e usou o XIAO ESP32S3 Sense como um sensor de IA. Agora você pode obter os dados do modelo usando diferentes protocolos de comunicação, como UART, I2C ou SPI, dependendo dos requisitos do seu projeto.

Lembre-se de consultar o código de exemplo fornecido e fazer as modificações necessárias com base na sua configuração específica e na escolha do protocolo de comunicação.

Se você encontrar algum problema ou tiver mais dúvidas, consulte a documentação da Seeed Studio ou peça ajuda nos fóruns da comunidade.

Boas medições com o seu XIAO ESP32S3 Sense e SenseCraft AI!

Suporte Técnico e Discussão de Produtos

Obrigado por escolher nossos produtos! Estamos aqui para oferecer diferentes formas de suporte para garantir que sua experiência com nossos produtos seja a mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.

Loading Comments...