Reconhecimento de Gestos com ESP32 e Acelerômetro Arduino 101 – Tutorial DIY Fácil
Componentes e Materiais
| Arduino 101 | Inclui acelerômetro embutido, não requer componentes ou circuitos adicionais. | 1 |
| Arduino UNO | Pode usar Arduino Uno (ou outro Arduino) em vez do Arduino 101, mas precisará de um acelerômetro também. | 1 |
| Acelerômetro Analógico Adafruit: ADXL335 | Use este (ou equivalente SparkFun) se estiver usando Arduino diferente do Arduino 101 (que tem acelerômetro embutido). | 1 |
| Breakout Acelerômetro Triple Axis SparkFun - ADXL335 | Use este (ou equivalente Adafruit) se estiver usando Arduino diferente do Arduino 101. | 1 |
Sobre o Projeto
Visão Geral
Este tutorial mostra como incorporar reconhecimento básico de gestos em seus projetos Arduino usando o sistema ESP. Por exemplo, você pode reconhecer diferentes gestos de tênis como forehand, backhand e saque; elementos de uma rotina de dança; gestos de levantamento de peso; etc. Os gestos são detectados usando um acelerômetro e enviados para a aplicação ESP rodando no seu computador. O ESP usa um algoritmo simples de aprendizado de máquina para combinar os dados do acelerômetro ao vivo com exemplos gravados de diferentes gestos, enviando uma mensagem de volta ao Arduino quando reconhece um gesto semelhante a um dos exemplos. O sistema reconhece apenas ocorrências individuais de gestos discretos; não fornece informações sobre como o gesto é executado. Ainda assim, pode ser usado para uma ampla gama de aplicações interativas.
Baixe a aplicação de reconhecimento de gestos ESP:
- Mac: ESP-Gestures-Mac-20161028.zip
- Windows: ESP-Gestures-Win-20161028.zip. Você também pode precisar do Visual C++ Redistributable (Update 3) da Microsoft.
- Ubuntu: ESP-Gestures-Ubuntu-20161028.tar.gz
- Gestos de Exemplo: ForehandBackhandServe.grt
Passo 1. Conecte seu acelerômetro.
Se estiver usando o Arduino 101, que tem acelerômetro embutido, pode pular este passo. Caso contrário, precisará conectar seu acelerômetro. Para isso, primeiro solde pinos de header macho na placa breakout, se ainda não o fez. Depois, conecte o acelerômetro ao Arduino.
Como atalho, você pode plugar o breakout do acelerômetro diretamente nos pinos de entrada analógica do Arduino Uno (ou outro Arduino com o mesmo fator de forma). Então no código Arduino, você pode configurar os pinos apropriados para fornecer alimentação e terra ao acelerômetro.

Alternativamente, você pode plugar seu acelerômetro em uma protoboard e conectá-lo ao Arduino, ligando seus pinos de alimentação e terra aos pinos 5V e GND do Arduino, e seus pinos dos eixos X, Y e Z a três entradas analógicas da placa Arduino.
Passo 2. Carregue o código Arduino.
Você pode usar um dos programas Arduino abaixo para ler dados do acelerômetro e enviá-los via serial (USB) para o computador. Primeiro, verifique se os pinos especificados no programa Arduino correspondem à forma como você conectou seu acelerômetro (ex: que xpin corresponde ao pino de entrada analógica conectado ao pino do eixo X do seu acelerômetro). (Isso não se aplica se estiver usando o Arduino 101, onde o acelerômetro é conectado internamente.) Então selecione a placa e porta serial apropriadas no menu Ferramentas do Arduino e carregue o sketch.
Passo 3. Verifique dados no monitor serial.
Abra o monitor serial do Arduino, defina para 9600 baud, e verifique se está recebendo dados do acelerômetro do seu Arduino. Você deve ver três colunas de números que mudam quando move o acelerômetro. Use o plotter serial do Arduino para ver um gráfico desses números.
Certifique-se de fechar o monitor serial e o plotter serial antes de continuar, pois caso contrário bloquearão a aplicação ESP de falar com seu Arduino.
Passo 4. Execute a aplicação de reconhecimento de gestos ESP e selecione sua porta serial.
Baixe a aplicação de reconhecimento de gestos ESP:
- Mac: ESP-Gestures-Mac-20160812.zip
- Windows: ESP-Gestures-Win-20160812.zip
Selecione a porta serial correspondente à sua placa Arduino no menu de configuração. (Clique no título "Selecionar uma porta serial" para abrir a lista de portas.)

Você deve ver dados ao vivo transmitindo no plot "Raw Data". As três linhas no plot correspondem aos três eixos do seu acelerômetro: a linha vermelha corresponde ao eixo X, verde ao eixo Y, e azul ao eixo Z.

Passo 5. Grave amostras de calibração.
Para permitir que a aplicação ESP entenda qual faixa de valores esperar do seu acelerômetro e Arduino, você precisará gravar uma amostra de calibração. Coloque seu acelerômetro em uma superfície plana, com o eixo Z voltado para cima. Pressione e segure a tecla "1" por um segundo ou mais para gravar a amostra de calibração "Vertical". Você deve ver um plot da amostra aparecer. Então, vire seu acelerômetro de cabeça para baixo e, mantendo-o plano e imóvel, segure a tecla "2" para gravar a amostra de calibração de cabeça para baixo. O sistema ESP usa estes dados para descobrir quais valores numéricos correspondem a 0g de aceleração (nos eixos X e Y) e quais correspondem a 1g de aceleração (no eixo Z).

Passo 6. Grave gestos de exemplo.
Vá para a aba "Treinamento" da aplicação ESP clicando nela ou digitando um "T" maiúsculo. Esta aba permite gravar ou carregar exemplos dos gestos que você quer que o sistema ESP reconheça. Você pode gravar exemplos de até nove gestos diferentes.

Para gravar um exemplo de gesto, faça o gesto enquanto pressiona a tecla correspondente ao rótulo que quer associar ao gesto. Por exemplo, para gravar um gesto com rótulo 1, segure a tecla "1" no teclado enquanto faz o gesto. (Alternativamente, você pode carregar os gestos de tênis de exemplo em ForehandBackhandServe.grt.)
Certifique-se de gravar os gestos de exemplo com o acelerômetro na mesma configuração que será usada depois, quando quiser que o sistema reconheça os gestos. Por exemplo, você pode segurar o acelerômetro na mão com uma orientação particular, ou anexá-lo a um objeto que segurará com uma orientação particular.
Uma boa amostra contém os dados correspondentes ao gesto inteiro, mas sem muitos dados de linha de base adicionais no início ou no fim. Ou seja, a amostra deve começar e terminar com um curto período de linhas relativamente planas, nem muito longas nem ausentes. Além disso, se seu gesto termina em um lugar diferente de onde começa, certifique-se de não gravar o tempo em que você está trazendo o acelerômetro de volta à posição inicial. Por exemplo, se estivesse gravando um gesto de deslizar para direita, você querer gravar apenas a parte do gesto quando sua mão está se movendo da esquerda para direita, não o tempo em que sua mão está retornando à posição inicial.

Cada exemplo adicional que você grava é outra amostra que o algoritmo de aprendizado de máquina pode combinar quando estiver reconhecendo gestos. Isso significa que se você quer que o sistema reconheça diferentes variações de um gesto (ex: as diferentes formas que é feito por diferentes pessoas), pode ajudar gravar amostras de cada variação. Por outro lado, se você tem amostras ruins, elas podem confundir o sistema; mais amostras não é necessariamente melhor. Em geral, tivemos boa sorte gravando algo em torno de 5 a 10 amostras para cada gesto, embora novamente, a qualidade das amostras individuais seja mais importante que a quantidade.

Se não gostar de uma amostra (ex: porque pressionou a tecla no momento errado e perdeu os dados correspondentes a parte do gesto), pode deletá-la clicando na caixa ao lado da palavra "delete" abaixo da amostra. Você pode aparar uma amostra clicando e arrastando no plot da amostra para selecionar a parte que quer manter, então clicando na caixa rotulada "trim". Você pode navegar entre as diferentes amostras em uma classe clicando nos ícones de seta abaixo do plot da amostra. Se gravou uma amostra na classe errada, pode movê-la clicando no botão "re-label" e então pressionando a tecla correspondente ao rótulo ao qual quer atribuir a amostra. Para nomear um gesto, clique no botão "rename", digite o nome e pressione enter.

Passo 7. Treine o sistema para reconhecer gestos.
Uma vez gravado alguns gestos de exemplo, você pode treinar o sistema ESP para reconhecer esses gestos a partir dos seus exemplos. Pressione a tecla "t" no teclado para treinar o sistema. Você deve ver a mensagem "training successful" aparecer na parte inferior da janela. Agora, quando você faz um gesto semelhante a um dos seus exemplos gravados, deve ver seu nome aparecer no plot de dados do sensor ao vivo.

O sistema pode não funcionar bem na primeira vez que você treiná-lo. É útil treinar e testar o sistema frequentemente enquanto grava seus gestos de exemplo, para ter uma noção de como ele está se comportando.
Em particular, se o sistema não está reconhecendo gestos que você acha que deveria, pode querer gravar exemplos adicionais desse gesto. Se o sistema está reconhecendo gestos quando não deveria, pode querer deletar ou aparar exemplos que parecem diferentes dos outros, ou que contêm longos períodos de linhas relativamente planas. Certifique-se de pressionar "t" após modificar seus exemplos para re-treinar o sistema.
Passo 8. Ajuste a configuração do sistema conforme necessário.
Embora modificar seus exemplos de treinamento seja provavelmente o meio mais importante de ajudar o sistema a funcionar corretamente, o ESP também permite configurar alguns parâmetros subjacentes do sistema. Para fazer isso, clique no rótulo "clique para abrir configuração". Você deve ver dois parâmetros: variabilidade e timeout. Note que após alterar estes parâmetros, você precisa re-treinar o sistema pressionando "t".
O parâmetro de variabilidade controla quão diferente um gesto pode ser de um dos exemplos gravados e ainda ser reconhecido. Quanto maior o número, mais diferente pode ser. Se o sistema parece exigir que seus gestos sejam excessivamente semelhantes aos seus exemplos gravados, você pode tentar aumentar este número. (Você também pode tentar gravar exemplos adicionais.) Se o sistema reconhece gestos espúrios, você pode tentar diminuir este número, embora também possa tentar deletar quaisquer exemplos de treinamento que pareçam ruins.
O parâmetro de timeout controla quanto tempo após reconhecer um gesto o sistema espera antes de reconhecer um novo. É medido em milissegundos (milhonésimos de segundo). Se o sistema parece estar perdendo gestos feitos em sucessão próxima a outro gesto, tente diminuir este número. Cuidado, porém, porque se você tornar este número muito baixo, o sistema pode reconhecer um único gesto múltiplas vezes. Se o sistema parece estar reconhecendo múltiplos gestos quando você faz apenas um (ex: se vê um forehand seguido de um backhand quando você fez apenas um forehand), pode tentar aumentar este parâmetro.
Passo 9. Incorpore reconhecimento de gestos em seu projeto Arduino.
Quando o sistema ESP faz uma previsão, ele envia uma mensagem ao seu Arduino com o número do gesto que reconheceu (como texto ASCII seguido de nova linha, ex: "1\n"). Lendo estas previsões na porta serial, você pode fazer seu Arduino responder ao gesto de várias formas.
As previsões também são enviadas via TCP para um servidor rodando em localhost porta 5204 (no mesmo formato que para o Arduino). Por exemplo, isso poderia ser um jogo escrito em Processing ou outro software. Certifique-se de que o servidor TCP esteja rodando antes de iniciar a aplicação ESP.
Como Funciona
Esta aplicação ESP particular usa um algoritmo chamado Dynamic Time Warping (ou DTW). Este algoritmo deforma o sinal do sensor ao vivo eliminando ou duplicando leituras individuais, gerando um array de variações e verificando o quão semelhantes são às amostras gravadas. O algoritmo procura a amostra de treinamento mais próxima dos dados do sensor ao vivo. Se a diferença entre os dois for menor que um certo limiar, considera uma correspondência e produz uma previsão correspondente à classe de treinamento contendo aquela amostra. Você pode ajustar a distância necessária usando o parâmetro "variabilidade" no menu de configuração.
Reconhecimento de gestos é apenas um domínio ao qual o sistema ESP pode ser aplicado. O ESP é construído sobre o Gesture Recognition Toolkit (GRT), que, apesar do nome, na verdade contém uma ampla gama de algoritmos de aprendizado de máquina que podem ser aplicados a uma ampla gama de aplicações de sensoriamento em tempo real. O ESP pega código para uma aplicação particular e o traduz em uma interface de usuário personalizada para trabalhar com aquele pipeline de aprendizado de máquina. Estes programas específicos de aplicação incluem um pipeline de aprendizado de máquina GRT, especificação de entradas de sensores, definição do processo de calibração, e especificações para os parâmetros ajustáveis. Construímos exemplos ESP para detecção de cor, detecção de pose usando acelerômetros, e reconhecimento de áudio simples. Veja o GitHub do ESP para mais informações.
Código
Código Arduino ADXL335
Este código lê de um ADXL335 conectado a um Arduino: o pino do eixo X do acelerômetro deve ser conectado ao pino A5 do Arduino, o eixo Y ao A4, e o eixo Z ao A3. Leituras são enviadas pela porta serial (USB) a 9600 baud, como dados ASCII terminados em nova linha, separados por tabulação.
Código Acelerômetro Arduino 101
Lê dados do acelerômetro do acelerômetro embutido em um Arduino 101. As leituras são enviadas pela porta serial (USB) a 9600 como dados ASCII terminados em nova linha, separados por tabulação.
Processo de manufatura
- Sistema de Presença RFID Confiável com Arduino e Python
- Controle Remoto Universal Android com Arduino, 1Sheeld e IR
- Construa um Voltímetro Inteligente com Arduino e Smartphone – Projeto DIY Fácil
- Construa um Pote Inteligente IoT com ESP8266, Arduino e Sensor Ultrassônico – Monitoramento em Tempo Real
- Medição Precisa de Frequência e Ciclo de Trabalho com Arduino UNO
- Controle um Rover Arduino com Firmata e Gamepad Xbox One
- Medição de Distância em Tempo Real com Sonar Arduino e Visualização no Processing
- Controle Suave de Brilho de LED com Bolt IoT e Arduino UNO
- Braço Robótico Inteligente Controlado por Arduino: Tutorial DIY Fácil
- Construa uma Bússola Digital em Tempo Real com Arduino e Processing