Pular para o conteúdo principal

TinyML no SEEED XIAO RP2040 (Reconhecimento de Movimento)

Neste wiki, vamos mostrar como utilizar o acelerômetro no Seeed Studio XIAO RP2040 combinado com Edge Impulse para habilitar o reconhecimento de movimento. Os códigos que apresentamos aqui são suportados pela versão mais recente das placas XIAO RP2040.

Materiais Necessários

Hardware

Neste wiki, precisamos preparar os seguintes materiais:

pir

Configuração de Hardware

pir

Software

As bibliotecas necessárias estão listadas abaixo. É altamente recomendado que você use os códigos aqui para verificar se o hardware está funcionando bem. Se você tiver problema para instalar a biblioteca, consulte aqui.

Introdução

Primeiro vamos rodar alguns demos para verificar se a placa e a tela de exibição estão funcionando bem. Se as suas estiverem OK, você pode seguir para a próxima instrução.

Verificar a conexão do circuito e o acelerômetro

Abra a Arduino IDE, navegue até Sketch -> Include Library -> Manage Libraries... e procure e instale a U8g2 library no Library Manager.

pir

Após a instalação, copie o código a seguir e execute-o.

#include <Wire.h>
#include "MMA7660.h"
MMA7660 accelemeter;
#define CONVERT_G_TO_MS2 9.80665f

void setup() {
Serial.begin(115200);
while (!Serial);
accelemeter.init();
}


void loop() {

float ax, ay, az;
accelemeter.getAcceleration(&ax, &ay, &az);

Serial.print(ax * CONVERT_G_TO_MS2,4);
Serial.print('\t');
Serial.print(ay * CONVERT_G_TO_MS2,4);
Serial.print('\t');
Serial.println(az * CONVERT_G_TO_MS2,4);

}

Depois de fazer o upload do código e desconectar o Seeed Studio XIAO RP2040. Então, abra o monitor serial e você verá a saída assim:

pir

Se tudo estiver bem, podemos seguir e conectar o Seeed Studio XIAO RP2040 ao Edge Impulse.

Conectado com Edge Impulse

A precisão do modelo de treinamento é muito importante para o resultado final. Se os resultados de treinamento de saída forem tão baixos quanto menos de 65%, recomendamos fortemente que você treine mais vezes ou adicione mais dados.

pir

  • Passo 2. Escolha "Accelerometer data" e clique em "Let’s get started!"

pir

pir

  • Passo 3. Instale o Edge Impulse CLI no seu computador.

  • Passo 4. Execute o comando no seu terminal ou cmd ou powershell para iniciá-lo.

sudo edge-impulse-data-forwarder
  • Passo 5. Precisamos usar o CLI para conectar o Seeed Studio XIAO RP2040 com o Edge Impulse. Primeiro, faça login na sua conta e escolha seu projeto

Dê um nome ao acelerômetro e ao dispositivo.

Volte para a página "Data acquisition" do Edge Impulse, o resultado deve ser assim se a conexão for bem-sucedida. Você pode encontrar o dispositivo "XIAO RP2040" mostrado à direita da página.

pir

  • Passo 6. Selecione o sensor como "3 axes". Dê o nome up e down ao seu rótulo, modifique Sample length (ms.) para 20000 e clique em start sampling.

pir

  • Passo 7. Balance o Seeed Studio XIAO RP2040 para cima e para baixo e mantenha o movimento por 20 segundos. Você pode ver que a aquisição é mostrada assim:

pir

  • Passo 8. Divida os dados clicando na parte superior direita dos dados brutos e escolhendo "Split Sample". Clique em +Add Segment e depois clique no gráfico. Repita isso mais de 20 vezes para adicionar segmentos. Clique em Split e você verá os dados de amostra, cada um com 1 segundo.

pir

  • Passo 9. Repita o Passo 7. e o Passo 8. e rotule os dados com nomes diferentes para clicar em dados de movimentos diferentes, como circle e line e assim por diante. O exemplo fornecido está classificando para cima e para baixo, esquerda e direita, e círculo. Você pode mudar isso como quiser aqui.
nota

No Passo 8, o tempo de divisão é de 1 segundo, o que significa que você deve pelo menos fazer um movimento de subida e descida em um segundo no Passo 7. Caso contrário, os resultados não serão precisos. Enquanto isso, você pode ajustar o tempo de divisão de acordo com sua própria velocidade de movimento.

  • Passo 10. Criar Impulse

Clique em Create impulse -> Add a processing block -> Escolha Spectral Analysis -> Add a learning block -> Escolha Classification (Keras) -> Save Impulse

pir

  • Passo 11. Spectral features

Clique e configure

Clique em Spectral features -> Role a página para baixo para clicar em Save parameters -> Clique em Generate features

A página de saída deve ser assim:

pir

pir

  • Passo 12. Treinando seu modelo

Clique em NN Classifier -> Clique em Start training -> Escolha Unoptimized (float32)

pir

  • Passo 13. Teste do modelo

Clique em Model testing -> Clique em Classify all

Se sua acurácia estiver baixa, você pode verificar seu conjunto de dados aumentando o conjunto de treinamento e estendendo o tempo de amostra

Também podemos obter a avaliação ao baixar o modelo

pir

  • Passo 14. Construir biblioteca Arduino

Clique em Deployment -> Clique em Arduino Library -> Clique em Build -> Baixe o arquivo .ZIP

pir

  • Passo 15. O nome do arquivo .ZIP é muito importante, ele é definido como o nome do seu projeto do Edge Impulse por padrão. Como aqui o nome do projeto é "RP2040". Selecione o arquivo como ""Adicione o "arquivo .ZIP" às suas bibliotecas do Arduino

pir

  • Passo 16. Abra o Arduino -> Clique em Sketch -> Clique em Include Library -> ADD .ZIP Library

Copie o código abaixo, se o nome do projeto no edgeimpluse for personalizado, então o texto do arquivo zip terá o mesmo nome. Você pode alterar a primeira linha do include para o seu arquivo de cabeçalho.

#include <XIAO_RP2040_inferencing.h> // customed name need change this header file to your own file name
#include <Wire.h>
#include "MMA7660.h"
MMA7660 accelemeter;

#define CONVERT_G_TO_MS2 9.80665f
#define MAX_ACCEPTED_RANGE 2.0f

static bool debug_nn = false;

void setup()
{
Serial.begin(115200);
while (!Serial);
Serial.println("Edge Impulse Inferencing Demo");
accelemeter.init();
}

float ei_get_sign(float number) {
return (number >= 0.0) ? 1.0 : -1.0;
}

void loop()
{
ei_printf("\nStarting inferencing in 2 seconds...\n");

delay(2000);

ei_printf("Sampling...\n");

// Allocate a buffer here for the values we'll read from the IMU
float buffer[EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE] = { 0 };

for (size_t ix = 0; ix < EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE; ix += 3) {
// Determine the next tick (and then sleep later)
uint64_t next_tick = micros() + (EI_CLASSIFIER_INTERVAL_MS * 1000);
accelemeter.getAcceleration(&buffer[ix], &buffer[ix + 1], &buffer[ix + 2]);

for (int i = 0; i < 3; i++) {
if (fabs(buffer[ix + i]) > MAX_ACCEPTED_RANGE) {
buffer[ix + i] = ei_get_sign(buffer[ix + i]) * MAX_ACCEPTED_RANGE;
}
}

buffer[ix + 0] *= CONVERT_G_TO_MS2;
buffer[ix + 1] *= CONVERT_G_TO_MS2;
buffer[ix + 2] *= CONVERT_G_TO_MS2;

delayMicroseconds(next_tick - micros());
}

// Turn the raw buffer in a signal which we can the classify
signal_t signal;
int err = numpy::signal_from_buffer(buffer, EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE, &signal);
if (err != 0) {
ei_printf("Failed to create signal from buffer (%d)\n", err);
return;
}

// Run the classifier
ei_impulse_result_t result = { 0 };

err = run_classifier(&signal, &result, debug_nn);
if (err != EI_IMPULSE_OK) {
ei_printf("ERR: Failed to run classifier (%d)\n", err);
return;
}

// print the predictions
ei_printf("Predictions ");
ei_printf("(DSP: %d ms., Classification: %d ms., Anomaly: %d ms.)",
result.timing.dsp, result.timing.classification, result.timing.anomaly);
ei_printf(": \n");
for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
ei_printf(" %s: %.5f\n", result.classification[ix].label, result.classification[ix].value);
}
#if EI_CLASSIFIER_HAS_ANOMALY == 1
ei_printf(" anomaly score: %.3f\n", result.anomaly);
#endif

}

pir

  • Passo 17. Movimente ou segure o Seeed Studio XIAO RP2040 e verifique os resultados:

Clique no monitor no canto superior direito do Arduino.

Quando você mover o Seeed Studio XIAO RP2040 na direção de círculo e linha:

O monitor exibirá algo como:

15:45:45.434 -> 
15:45:45.434 -> Starting inferencing in 2 seconds...
15:45:47.414 -> Sampling...
15:45:48.439 -> Predictions (DSP: 6 ms., Classification: 1 ms., Anomaly: 0 ms.):
15:45:48.439 -> Circle: 0.59766
15:45:48.439 -> line: 0.40234
15:45:48.439 ->

Parabéns! Você chegou ao final do projeto. É encorajado que você tente mais direções e verifique qual delas terá o melhor desempenho de saída.

Recursos

Suporte Técnico e Discussão sobre o Produto

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...