Manual

do

Maker

.

com

Sensor de gestos APDS9960

Sensor de gestos APDS9960

Esse sensor de gestos APDS9960 é uma das coisas mais divertidas que podemos encontrar em sensores. Dá pra fazer um monte de brincadeiras, além de ter não só a capacidade de identificar gestos, mas também de ser um sensor RGB.

Vamos ver como utilizá-lo de forma simples e rápida.

Sensor de gestos APDS9960 - características

Esse sensor tem nível lógico de 3v3, por isso a primeira coisa a considerar é a utilização de um step down. Ou então, utilizá-lo de forma transparente com um ESP8266 ou um ESP32.

Atrás da placa já vem impresso o endereço I2C, o que nos possibilita pular o passo de fazer scan no barramento para descobrir o endereço.

Ele possui um pino de interrupção, além dos tradicionais SDA, SCL, VCC e GND. A pinagem também está impressa na placa, restando apenas acertar os pinos I2C da MCU em questão. Vou fazer um código simples no ESP32, mas qualquer coisa de diferente, use o sketch de exemplo como base (lembrando que os exemplos estarão disponíveis na IDE do Arduino após instalar a biblioteca).

Esse sensor detecta movimentos laterias e aproximação/afastamento. Assim sendo, temos 6 possibilidades de gerar comandos.

Onde comprar?

Esse sensor de gestos APDS9960 está disponível em nosso parceiro CurtoCircuito, através desse link. Não deixe de visitar a loja para conhecer a grande diversidade de sensores que eles possuem.

Biblioteca SparkFun APDS9960

A SparkFun disponibiliza uma biblioteca para a utilização desse sensor. Essa biblioteca está disponível no repositório de bibliotecas do Arduino, bastando procurar por APDS9960.

Wiring do APDS9960 com ESP32

No caso, estou utilizando um ESP32 Wemos, bastante parecido com o ESP8266 Wemos D1 Mini. Mas não dá para confundir, porque o o ESP32 tem duas barras de pinos de cada lado, olhando isso, a identificação já é garantida.

Os pinos do ESP32 utilizados para a conexão I2C são os pinos 22 e 21 para SCL e SDA, respectivamente. VCC deve ser 3v3 e GND, bem, GND.

Código

No código está definido o pino de inturrupção ( veja: Interrupções e timer com ESP32), a instância do objeto apds, um manipulador do movimento e as configurações de interrupção no setup. Fiz a interrupção no estilo do RTOS, mas deve funcionar no modo do Arduino também.

#include <Arduino.h>
#include <Wire.h>
#include <SparkFun_APDS9960.h>

// Pins
#define APDS9960_INT   GPIO_NUM_27

bool is_isr = false;

SparkFun_APDS9960 apds = SparkFun_APDS9960();

void handleGesture();

//declaração da ISR
void IRAM_ATTR exec_isr(void *arg){
      if (!is_isr){
          gpio_intr_disable(APDS9960_INT);
          is_isr = true;
      }
}

//função para ISR
void handleGesture(){
    if (apds.isGestureAvailable()){
    switch (apds.readGesture()){
      case DIR_UP:
        Serial.println("UP");
        break;
      case DIR_DOWN:
        Serial.println("DOWN");
        break;
      case DIR_LEFT:
        Serial.println("LEFT");
        gpio_set_level(GPIO_NUM_2, HIGH);
        break;
      case DIR_RIGHT:
        Serial.println("RIGHT");
        gpio_set_level(GPIO_NUM_2, LOW);
        break;
      case DIR_NEAR:
        Serial.println("NEAR");
        break;
      case DIR_FAR:
        Serial.println("FAR");
        break;
      default:
        Serial.println("NONE");
    }
  }
}

void setup() {
  Serial.begin(9600);
  pinMode(2, OUTPUT);
  digitalWrite(2,HIGH);
  //configurando o LED onboard para responder a ligamento e desligamento
  //gpio_set_direction(, OUTPUT);
  gpio_set_level(GPIO_NUM_2, LOW);

  Serial.println("Ativando interrupções");
  gpio_set_direction(APDS9960_INT, GPIO_MODE_INPUT);

  gpio_set_pull_mode(APDS9960_INT, GPIO_PULLUP_ONLY);
  gpio_install_isr_service(0);
  
  gpio_set_intr_type(APDS9960_INT, GPIO_INTR_NEGEDGE);
  gpio_intr_enable(APDS9960_INT);
  gpio_isr_handler_add(APDS9960_INT, exec_isr, NULL);  
  
  if (apds.init()){
    Serial.println(F("APDS9960 inicializado"));
  }
  else{
    Serial.println(F("APDS9960 não inicializado"));
  }

  if ( apds.enableGestureSensor(true) ) {
    Serial.println(F("Sensor de gestos em execução"));
  } else {
    Serial.println(F("..."));
  }
}

void loop() {
    if (is_isr){
      is_isr = false;
      handleGesture();
      gpio_intr_enable(APDS9960_INT);
    }
}

Do jeito que aí está, o LED onboad é ligado ao passar a mão para a esquerda, e desligado ao passar a mão para a direita. Dá uma sensação boa de "futuro", até pretendo fazer mais umas soldas pra atuar no evento do sensor. Ainda vou escrever mais sobre ele, um pouco mais de aplicação e também sobre o sensor RGB, é só acompanhar.

Vídeo

Pretendo subir o vídeo em poucas horas. Se não é inscrito, inscreva-se em nosso canal DobitAoByteBrasil e clique no sininho para receber notificações de novos vídeos. Aproveite para deixar seu like quando assistir, ok? Até a próxima!

Projetos para sua empresa

Manual do Maker é mais do que um blog. Somos uma empresa de serviços, cuja principal atividade é desenvolvimento e implementação de projetos embarcados e IoT. Trabalhamos dentro da legalidade, emitindo nota fiscal de serviço, elaboração de requisitos de sistema e documentação do código. Não importa onde você esteja, montamos a prova de conceito e gravamos vídeo do projeto antes de entregar o código e/ou hardware configurado.

Em parceria com a AFEletrônica, projetamos e produzimos hardware industrial (também com nota), para lhe entregar a melhor experiência para seu projeto. Entre em contato: vendas@afeletronica.com.br Ou direto comigo: djames.suhanko@gmail.com

Será um prazer tê-lo como nosso cliente!

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.