Lendo os comentários no meu
artigo anterior sobre o APDS-9960, onde se tratava de reconhecimento de cores e nível de luz, duas coisas se tornaram óbvias para mim: 1) o tópico do reconhecimento de gestos é interessante e 2) esse tópico não é divulgado.
De fato, se eu peguei a descrição do APDS-9960, sem considerar os gestos, a descrição parece um pouco incompleta. Então encontrei algum tempo livre para explorar esse tópico também.
Neste artigo, chamo a atenção para você uma visão geral dos recursos de reconhecimento de gestos que o sensor APDS-9960 fornece.
O artigo considerará o mecanismo de configuração do sensor, coleta de dados, processamento e apresentação. Você pode ver como é fácil trabalhar com gestos usando o APDS-9960.
Como última vez, o artigo será acompanhado por um código, tudo o que acontecer, será descrito em detalhes. A versão completa do código está disponível no final do artigo.
Imediatamente uma pequena observação: o APDS-9960 não possui um mecanismo automático de detecção de gestos; isto é, tal que aqui mesmo, eu li, significa, o registro, e já existe o gesto processado - isso não está no APDS-9960; e isso significa que você deve escrever seu próprio algoritmo de interpretação de gestos, o que faremos mais adiante.
Em geral, isso é bom e não muito bom. Na verdade, não - porque pode complicar o estudo desse sensor para iniciantes, mas bom, porque, juntamente com os dados de aproximação, você pode, por refinamento, até criar seus próprios gestos de vários tipos e qualquer outro.
Porém, como este artigo tem apenas uma função de visão geral, nos restringimos apenas a gestos básicos UP-DOWN-LEFT-RIGHT.
Bem, vamos começar.
Teoria
Vou me permitir um pouco de material.
Para obter as informações necessárias sobre o movimento e a direção do movimento, o APDS-9960 usa um LED IR e quatro fotodiodos que, conforme ilustrado na figura abaixo, detectam sinais na faixa de infravermelho próximo (NIR).

O LED IR (LED) tem a função de luz de fundo e os fotodiodos (UDLR) registram a luz refletida no "obstáculo".
Os fotodiodos estão localizados no sensor de forma que, dependendo da direção do movimento do “obstáculo”, o fotodiodo correspondente receberá a maior parte do sinal infravermelho refletido na entrada e uma parte menor na saída. Ao mesmo tempo, a documentação do APDS-9960 indica inequivocamente que você pode interpretar a direção do movimento medindo e comparando a amplitude e a diferença de fase dos sinais dos fotodiodos UDLR.

Prática
Para trabalhar com o APDS-9960, bem como da
última vez , usaremos STM32VLDISCOVERY. A conexão também não mudou.
Configurar APDS-9960Fazemos a configuração inicial do sensor.
Assim:
APDS9960_initvoid APDS9960_init(void) { i2c1_write(APDS9960_CONTROL, DEFAULT_PGAIN); i2c1_write(APDS9960_GPENTH, DEFAULT_GPENTH); i2c1_write(APDS9960_GEXTH, DEFAULT_GEXTH); i2c1_write(APDS9960_GCONF2, DEFAULT_GGAIN); i2c1_write(APDS9960_GPULSE, DEFAULT_PULSE_LENGTH); i2c1_write(APDS9960_PPULSE, DEFAULT_PULSE_LENGTH); }
O que está acontecendo aqui? Vamos acertar.
i2c1_write(APDS9960_CONTROL, DEFAULT_PGAIN);
PGAIN (Proximity Gain Control) é um parâmetro que controla o ganho de sensibilidade de proximidade. Atribua a ele um valor 2, que corresponde a quatro vezes o ganho.
i2c1_write(APDS9960_GPENTH, DEFAULT_GPENTH); i2c1_write(APDS9960_GEXTH, DEFAULT_GEXTH);
GPENTH (Registro de limite de entrada por proximidade de gestos) - esse parâmetro define o valor do limite de proximidade para determinar o início do reconhecimento de gestos.
GEXTH (Registro de limite de saída de gestos), respectivamente, define um valor limite para determinar o final do reconhecimento de gestos.
i2c1_write(APDS9960_GCONF2, DEFAULT_GGAIN);
No registro GCONF2 (Gesture configuration two), definimos explicitamente apenas o parâmetro GGAIN (Gesture Gain Control) para quatro vezes o valor do ganho.
i2c1_write(APDS9960_GPULSE, DEFAULT_PULSE_LENGTH); i2c1_write(APDS9960_PPULSE, DEFAULT_PULSE_LENGTH);
Luz de fundo Por padrão, o valor da fonte atual da luz de fundo do LED infravermelho é definido como 0, o que corresponde a uma corrente de 100 mA, isso nos convém perfeitamente - não vamos alterá-lo.
A iluminação IR no APDS-9960 é uma sequência de pulsos e é caracterizada pelos parâmetros de registro correspondentes para os gestos GPULSE (contagem e comprimento de pulsos de gestos): GPLEN (comprimento dos pulsos de gestos) e GPULSE (número de pulsos de gestos), bem como a aproximação PPULSE (registro de contagem de pulsos de proximidade) ): PPLEN (Proximity Pulse Length) e PPULSE (Proximity Pulse Count) definem o número de pulsos e o período de cada pulso individual.
Defina que GPLEN e PPLEN terão um valor de 2 igual a 16 μs e GPULSE e PPULSE um valor de 9, que corresponde a 10 pulsos.
Como você pode ver, a configuração acabou sendo um pouco mais complicada do que a semelhante para reconhecimento de cores e iluminação da revisão anterior do APDS-9960.
Lendo dadosAgora, passaremos para o ciclo principal do programa, no qual começamos a registrar e interpretar dados de fotodiodos de vez em quando, e também aprenderemos a distinguir um gesto de outro.
Para começar, vamos começar o APDS-9960 com funções para trabalhar com gestos e zoom.
GesturesSet(GESTURES_START);
E imediatamente começamos a rastrear o parâmetro GVALID. GVALID (Gesture FIFO Data) é um parâmetro do registro GSTATUS (Gesture Status Register), que, estando em um estado diferente de zero, informa que o sensor possui dados de gestos utilizáveis.
A documentação nos ensina que as informações dos gestos estão no buffer, na área da RAM, que geralmente tem 32 x 4 bytes de tamanho.
Na prática, o tamanho real desse buffer pode ser encontrado lendo o valor do registro GFLVL (Gesture FIFO level), ou seja, de acordo com minhas observações experimentais puramente empíricas, é obtido o GFLVL * 4. Algo assim:

Bem, como segue o nome do buffer, os dados nele são organizados na ordem Primeiro a entrar - Primeiro a sair. Ou seja, grosso modo, quanto "mais cedo" o sinal de cada um dos fotodiodos chegava, mais "alto" ele fica na GFLVL.
Os dados dos fotodiodos (UDLR) podem ser lidos no registro FIFO gestual correspondente:
- GFIFO_U (dados FIFO de gestos, UP)
- GFIFO_D (dados FIFO de gestos, DOWN)
- GFIFO_L (dados FIFO de gestos, ESQUERDA)
- GFIFO_R (dados FIFO do gesto, DIREITO)
Após cada leitura dos valores desses registros, o GFLVL é diminuído; assim, de uma maneira boa, é necessário ler todo o buffer até que o GFLVL atinja zero.
Para definir gestos, precisamos apenas dos quatro primeiros bytes desse buffer, e não mais. Portanto, apenas os leremos.
GestureUp = i2c1_read(APDS9960_GFIFO_U); GestureDown = i2c1_read(APDS9960_GFIFO_D); GestureLeft = i2c1_read(APDS9960_GFIFO_L); GestureRight = i2c1_read(APDS9960_GFIFO_R);
Reconhecimento de gestosPara interpretar que tipo de gesto ocorreu, faremos cálculos simples:
GestUpDown = GestureUp-GestureDown; GestLeftRight = GestureLeft-GestureRight;
Para determinar qual dos gestos ocorreu no momento, não são os valores de GestUpDown e GestLeftRight que são importantes para nós, mas apenas o sinal de, por assim dizer, um número real.
Ou seja, tomando os valores negativos e positivos das variáveis GestUpDown e GestLeftRight como entrada, determinamos qual gesto é perfeito.
A tabela verdade para as variáveis GestUpDown e GestLeftRight é mostrada na figura abaixo.

Agora redefina o GFLVL:
GesturesSet(GESTURES_STOP);
... e de volta ao início do ciclo principal do programa.
E agora todo o código:
main.c #include "stm32f10x.h" #define APDS9960_I2C_ADDR 0x39 #define APDS9960_ENABLE 0x80 #define APDS9960_GSTATUS 0xAF #define APDS9960_GFLVL 0xAE
Quero observar que o mecanismo de gesto do APDS-9960 funciona muito bem. O reconhecimento é estável, os filtros incorporados no APDS-9960 UV e IR funcionam bem.
Espero que este material seja útil para alguém. Obrigado pela atenção.