Pular para o conteúdo principal

Transmissão via RS485 dos dados do Vision AI V2

dica

Se você precisar usar a placa de expansão RS485 em conjunto com o Vision AI V2, será necessário ressoldar novos pinos de header na parte de trás da placa de expansão RS485.

Preparação de Hardware

Seeed Studio XIAO ESP32S3Grove Vision AI V2Módulo de Câmera OV5647-62 FOV
para Raspberry Pi 3B+4B
Placa de Expansão RS485 para Seeed Studio XIAO

Método de conexão

Primeiro, prepare duas placas de expansão, duas placas de desenvolvimento da série XIAO e um Vision AI V2, e conecte os pinos correspondentes de acordo com o diagrama. Esta rotina usa o XIAO ESP32C3 como demonstração.

Passo 1 . Prepare duas placas de expansão RS485 e duas placas de desenvolvimento da série XIAO e conecte os pinos de acordo com a figura a seguir

Passo 2 . Prepare o Vision AI V2 para ser montado no lado inverso de uma das duas placas de expansão RS485 como transmissor

dica

Se você estiver usando uma placa de expansão RS485 pela primeira vez e não tiver certeza de como fazer a fiação, clique neste link(https://wiki.seeedstudio.com/pt-br/XIAO-RS485-Expansion-Board/)

Se você não souber como gravar o modelo e adicionar o código de saída do modelo, clique neste link(https://wiki.seeedstudio.com/pt-br/grove_vision_ai_v2_software_support/), que explicará cada etapa em detalhes

Para um uso melhor posteriormente, não pule estas duas etapas!

Preparação de Software

Código do Transmissor

#include <Seeed_Arduino_SSCMA.h>

#ifdef ESP32
#include <HardwareSerial.h>

HardwareSerial Serial3(1);

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

#else
#define atSerial Serial1
#endif

#define enable_pin D2 // Define the enable pin as D2

SSCMA AI;

void setup()
{
Serial3.begin(115200, SERIAL_8N1, 7, 6); // Initialize Serial3 with 115200 baud rate, 8 data bits, no parity, 1 stop bit
Serial.begin(9600); // Initialize Serial for debugging output
AI.begin(&atSerial); // Initialize the AI module with the AT serial

pinMode(enable_pin, OUTPUT); // Set the enable pin as an output
digitalWrite(enable_pin, HIGH); // Set the enable pin to high to enable the AI module
}

void loop()
{
if (!AI.invoke(1, false, true)) { // Invoke the AI to start processing

Serial.println("invoke success"); // Print success message

// Print performance metrics
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);

// Loop through detected boxes
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);
}

// Loop through detected classes
for (int i = 0; i < AI.classes().size(); i++) {
Serial.print("Class[");
Serial.print(i);
Serial.print("] target=");
Serial.println(AI.classes()[i].target);

// Check the target class and send corresponding status
if (AI.classes()[i].target == 0) {
String status_a = "no people detected"; // Define status for no people detected
Serial3.println(status_a); // Send status to Serial3
Serial.println(status_a); // Print status to Serial monitor
} else if (AI.classes()[i].target == 1) {
String status_b = "people detected"; // Define status for people detected
Serial3.println(status_b); // Send status to Serial3
Serial.println(status_b); // Print status to Serial monitor
}
}
delay(1000); // Wait for 1 second before the next loop iteration
}
}

Funções Detalhadas do Código

  • Inclusão de Biblioteca

    • Inclua a biblioteca HardwareSerial para usar a funcionalidade de serial de hardware.
    • Inclua a biblioteca Seeed_Arduino_SSCMA para controle do módulo de IA.
  • Criação de Objeto Serial

    HardwareSerial Serial3(1); 
    HardwareSerial atSerial(0);

    Crie os objetos Serial3 e atSerial para comunicação serial.

  • Criação de Objeto de IA

    SSCMA AI;

    Crie uma instância da classe SSCMA para processamento de IA.

  • Métricas de Desempenho

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

    Imprima as métricas de desempenho das etapas de processamento de IA: pré-processamento, inferência e pós-processamento.

  • Loop de Caixas Detectadas


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

    Faça um loop pelas caixas detectadas e imprima seus detalhes, incluindo alvo, pontuação e coordenadas da caixa delimitadora.

  • Loop de Classes Detectadas

    for (int i = 0; i < AI.classes().size(); i++) {
    Serial.print("Class[");
    Serial.print(i);
    Serial.print("] target=");
    Serial.println(AI.classes()[i].target);

    Faça um loop pelas classes detectadas e imprima seus alvos.

  • Definição de Macro

    pinMode(enable_pin, OUTPUT); // Set the enable pin as an output
    digitalWrite(enable_pin, LOW);

    Defina o pino de habilitação como D2.

  • Envio de Mensagem

    // Check the target class and send corresponding status
    if (AI.classes()[i].target == 0) {
    String status_a = "no people detected"; // Define status for no people detected
    Serial3.println(status_a); // Send status to Serial3
    Serial.println(status_a); // Print status to Serial monitor
    } else if (AI.classes()[i].target == 1) {
    String status_b = "people detected"; // Define status for people detected
    Serial3.println(status_b); // Send status to Serial3
    Serial.println(status_b); // Print status to Serial monitor
    }

    Determine se uma pessoa foi detectada; se uma pessoa for detectada, é enviado ao receptor PEOPLE DETECTED, se nenhuma pessoa for detectada, é enviado ao receptor NO PEOPLE DETECTED.

Código do Receptor

#include <HardwareSerial.h>

HardwareSerial Serial3(1); // Use UART2
#define enable_pin D2 // Define the enable pin as D2


void setup() {
Serial.begin(115200); // Initialize the hardware serial with a baud rate of 115200
Serial3.begin(115200, SERIAL_8N1, 7, 6); // Initialize Serial3 with 115200 baud rate, 8 data bits, no parity, 1 stop bit (RX=D4(GPIO4), TX=D5(GPIO5))

// Wait for the hardware serial to be ready
while(!Serial3);
while(!Serial); // This line is generally unnecessary as Serial.begin() is ready immediately

pinMode(enable_pin, OUTPUT); // Set the enable pin as an output
digitalWrite(enable_pin, LOW); // Set the enable pin to low to enable the device
}

void loop() {
delay(100); // Delay for 100 milliseconds
// Check if there is data available from the hardware serial
if (Serial3.available()) {
String receivedData = Serial3.readStringUntil('\n'); // Read string until newline character
Serial.print("Received data: "); // Print label for received data
Serial.println(receivedData); // Directly print the received data
}
}

Funções Detalhadas do Código

  • Inclusão de Biblioteca

    • Inclua a biblioteca HardwareSerial para usar a funcionalidade de serial por hardware.
  • Criação do Objeto Serial

    • Crie um objeto Serial3 usando a UART2.
  • Definição de Macro

    pinMode(enable_pin, OUTPUT); // Set the enable pin as an output
    digitalWrite(enable_pin, LOW);

    Defina o pino de habilitação como D2.

  • Função Setup

    Serial3.begin(115200, SERIAL_8N1, 7, 6);

    Inicialize a serial principal e a Serial3, configurando baud rate, bits de dados, etc. esta é a porta serial que se comunica com a vision ai v2 para transferir dados.

    while(!Serial3);
    while(!Serial);

    Aguarde até que todas as portas seriais estejam prontas, defina o pino de habilitação como saída e o coloque em nível baixo para habilitar o dispositivo.

  • Função Loop

    • if (Serial3.available());: Verifique a cada 100 milissegundos se há dados disponíveis na Serial3.
    • String receivedData = Serial3.readStringUntil('\n');: Se houver dados disponíveis, leia-os até um caractere de nova linha e imprima os dados recebidos na serial principal.
  • Imprimir resultados

    Serial.print("Received data: "); 
    Serial.println(receivedData);

    Imprimindo a mensagem do transmissor

Gráfico de Resultados

No entanto, a câmera enviará “people detected” quando reconhecer uma pessoa e "no people detected" quando não reconhecer uma pessoa, e o receptor exibirá o resultado do reconhecimento do transmissor na porta serial.

Suporte Técnico & Discussão de Produto

Obrigado por escolher nossos produtos! Estamos aqui para fornecer diferentes tipos 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...