Código de Pesquisa

Sensor de Gestos APDS-9960 com Arduino

Sensor de Gestos APDS-9960 com Arduino

O sensor de gestos APDS-9960 permite detectar gestos com a mão, como deslizamentos, e também proximidade. Neste tutorial, demonstraremos como conectar o APDS-9960 a um Arduino e programá-lo para reconhecer gestos. O resultado será uma configuração simples que pode detectar movimentos e relatá-los pelo monitor serial. Este guia ajudará você a entender a fiação e o código necessários para começar a usar o sensor de gestos. (no vídeo em 00:30)

APDS-9960 gesture sensor module -1

Hardware Explicado

O APDS-9960 é um sensor versátil que combina detecção de cor RGB, medição de luz ambiente, detecção de proximidade e capacidades de detecção de gestos. Ele se comunica com o Arduino via I2C, o que permite integração fácil com fiação mínima. O sensor opera somente a 3.3V, tornando essencial garantir níveis de tensão adequados para evitar danificar o dispositivo. Nesta montagem, usaremos o Arduino para ler os dados de gestos. O sensor envia informações de gesto por meio de interrupções, o que permite que o Arduino responda prontamente aos movimentos da mão. A integração do APDS-9960 com o Arduino abre muitas possibilidades para projetos interativos, incluindo dispositivos controlados por gestos.

Detalhes da ficha técnica

FabricanteBroadcom
Número da peçaAPDS-9960
Tensão lógica/E/S2.7 - 3.6 V
Tensão de alimentação3.3 V
Corrente de saída (por canal)1 mA
Corrente de pico (por canal)10 mA
Orientação sobre a frequência PWM100 Hz
Limiares de lógica de entrada0.3 x VDD(baixo), 0.7 x VDD(alto)
Queda de tensão / RDS(on)/ saturação0,5 V máx
Limites térmicos-40 a +85 °C
PacoteLGA de 6 pinos
Notas / variantesSuporta comunicação I2C

  • Certifique-se de que a tensão de alimentação não exceda 3.6 V para evitar danos.
  • Use resistores pull-up nas linhas I2C para uma comunicação confiável.
  • Mantenha o sensor afastado da luz solar direta para leituras precisas.
  • Certifique-se de inicializar o sensor corretamente no código.
  • Verifique as conexões de fiação para evitar entradas flutuantes.

Instruções de fiação

Arduino wiring for APDS9960 Gesture sensor
Arduino wiring for APDS9960 Gesture sensor

Para ligar o APDS-9960 ao Arduino, comece conectando a alimentação. Use um fio vermelho para conectar o pino VCC do APDS-9960 ao pino 3.3V do Arduino. Em seguida, conecte o pino GND do sensor a um pino GND do Arduino usando um fio preto. Agora, para a comunicação I2C, conecte o pino SDA do APDS-9960 ao pino A4 do Arduino. Da mesma forma, conecte o pino SCL ao pino A5 do Arduino. Por fim, conecte o pino INT do sensor ao pino 2 do Arduino. Isso permitirá que o Arduino responda às interrupções geradas pelo sensor.

Exemplos de Código e Guia Passo a Passo

O código fornecido inicializa o sensor APDS-9960 e configura o Arduino para ler gestos. Aqui está um breve trecho da função setup:

void setup() {
  pinMode(APDS9960_INT, INPUT);
  Serial.begin(9600);
  attachInterrupt(0, interruptRoutine, FALLING);
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 initialization complete"));
  }
}

Neste trecho, inicializamos o monitor serial e definimos o pino de interrupção. O sensor é inicializado e uma mensagem de confirmação é impressa no console. Em seguida, verificamos gestos na função loop:

void loop() {
  if( isr_flag == 1 ) {
    detachInterrupt(0);
    handleGesture();
    isr_flag = 0;
    attachInterrupt(0, interruptRoutine, FALLING);
  }
}

Aqui, o loop verifica continuamente a presença de gestos. Quando um gesto é detectado, a interrupção é desativada e a função handleGesture é chamada para processar o gesto. Finalmente, a função handleGesture processa os gestos detectados:

void handleGesture() {
  if ( apds.isGestureAvailable() ) {
    switch ( apds.readGesture() ) {
      case DIR_UP:
        Serial.println("UP");
        break;
      case DIR_DOWN:
        Serial.println("DOWN");
        break;
      // Additional cases...
    }
  }
}

Nesta função, o gesto é lido e a ação correspondente é executada com base na direção detectada. Isso permite um controle interativo com base nos movimentos da mão. Para uma compreensão completa do código, consulte o programa completo incluído abaixo do artigo.

APDS-9960 gesture sensor -3

Demonstração / O que Esperar

Quando a configuração estiver completa, você pode esperar que o Arduino leia gestos e exiba a direção detectada no monitor serial. Testes simples incluem mover a mão para cima, para baixo, para a esquerda ou para a direita em frente ao sensor. Se tudo estiver ligado corretamente, você deverá ver a saída correspondente no monitor serial, confirmando o reconhecimento do gesto. Tenha cuidado com entradas flutuantes, pois elas podem levar a leituras inconsistentes (no vídeo em 05:20).

Marcas de tempo do vídeo

  • 00:00- Introdução
  • 01:15- Visão geral do hardware
  • 03:00- Instruções de fiação
  • 04:30- Revisão do código
  • 06:15- Demonstração

Imagens

APDS-9960 gesture sensor module -2
APDS-9960 gesture sensor module -2
APDS-9960 gesture sensor module -1
APDS-9960 gesture sensor module -1
APDS-9960 gesture sensor -3
APDS-9960 gesture sensor -3
Arduino wiring for APDS9960 Gesture sensor
Arduino wiring for APDS9960 Gesture sensor
1-Code for an APDS-9960 gesture sensor for Arduino
Idioma: C++
/*
 * Código para o sensor de gestos APDS-9960 para Arduino  
 * Este código serve para detectar gestos da sua mão, seja movendo-a para cima, para baixo, para a esquerda ou para a direita; outros gestos podem ser detectados e usados para controlar algo diferente.  
 * 
 * Assista ao vídeo do sensor de gestos APDS-9960 https://youtu.be/qzSgZV_fbxI  
 * Obtenha este código em https://robojax.com  
 * 
 * Código utilizado no vídeo por Ahmad Shamshiri para Robojax.com  
 * em 31 de dezembro de 2016, às 6:53 AM em Ajax, Ontário, Canadá  
 * Permissão concedida para compartilhar este código, desde que esta  
 * nota seja mantida com o código.  
 * Isenção de responsabilidade: este código é "COMO ESTÁ" e para fins educacionais apenas.  
 * 
 * GestureTest.ino  
 * Sensor RGB e de Gestos APDS-9960  
 * Shawn Hymel @ SparkFun Electronics  
 * 30 de maio de 2014  
 * https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor  
 * 
 * Testa as habilidades de detecção de gestos do APDS-9960. Configura  
 * o APDS-9960 via I2C e aguarda eventos de gestos. Calcula a  
 * direção do movimento (cima, baixo, esquerda, direita) e exibe isso  
 * em um console serial.  
 * 
 * Para executar um gesto PERTO, mantenha sua mão  
 * longe do sensor e mova-a perto do sensor (dentro de 2  
 * polegadas). Mantenha sua mão lá por pelo menos 1 segundo e depois mova-a  
 * para longe.  
 * 
 * Para executar um gesto DISTANTE, mantenha sua mão a até 2 polegadas do  
 * sensor por pelo menos 1 segundo e depois mova-a para longe (fora  
 * da faixa) do sensor.  
 * 
 * Conexões de hardware:  
 * 
 * IMPORTANTE: O APDS-9960 só pode aceitar 3.3V!  
 * 
 * Pino do Arduino Função da Placa APDS-9960  
 * 
 * 3.3V VCC Alimentação  
 * GND GND Terra  
 * A4 SDA Dados I2C  
 * A5 SCL Clock I2C  
 * 2 INT Interrupção  
 * 
 * Recursos:  
 * Inclua Wire.h e SparkFun_APDS-9960.h  
 * 
 * Especificações do ambiente de desenvolvimento:  
 * Escrito em Arduino 1.0.5  
 * Testado com SparkFun Arduino Pro Mini 3.3V  
 * 
 * Este código é beerware; se você me ver (ou qualquer outro funcionário da SparkFun) no local, e você achou nosso código útil, por favor, nos compre uma bebida!  
 * 
 * Distribuído como está; nenhuma garantia é dada.
 */
#include <Wire.h>
#include <SparkFun_APDS9960.h>
Servo myservo; // criar objeto de servo para controlar um servo

 // Pinos
#define APDS9960_INT    2 // Precisa ser um pino de interrupção.

 // Constantes

 // Variáveis Globais
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;

void setup() {

 // Configure o pino de interrupção como entrada.
  pinMode(APDS9960_INT, INPUT);

 // Inicializar porta Serial
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("SparkFun APDS-9960 - GestureTest"));
  Serial.println(F("--------------------------------"));

 // Inicializar rotina de serviço de interrupção
  attachInterrupt(0, interruptRoutine, FALLING);

 // Inicializar APDS-9960 (configurar I2C e valores iniciais)
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9960 init!"));
  }

 // Iniciar o motor do sensor de gestos APDS-9960
  if ( apds.enableGestureSensor(true) ) {
    Serial.println(F("Gesture sensor is now running"));
  } else {
    Serial.println(F("Something went wrong during gesture sensor init!"));
  }
}

void loop() {
  if( isr_flag == 1 ) {
    detachInterrupt(0);
    handleGesture();
    isr_flag = 0;
    attachInterrupt(0, interruptRoutine, FALLING);
  }
}

void interruptRoutine() {
  isr_flag = 1;
}

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");
        break;
      case DIR_RIGHT:
        Serial.println("RIGHT");
        break;
      case DIR_NEAR:
        Serial.println("NEAR");
        break;
      case DIR_FAR:
        Serial.println("FAR");
        break;
      default:
        Serial.println("NONE");
    }
  }
}
2-Source code for controlling a servo with your hand
Idioma: C++
/*
 * Modificado para RoboJax por A.B.S. em 09 de maio de 2017 em Ajax, Ontário, Canadá. www.RoboJax.com
 * 
 * Fonte Original:
 * Sensor RGB e de Movimento APDS-9960
 * Shawn Hymel @ SparkFun Electronics
 * 30 de maio de 2014
 * https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
 * 
 * Distribuído como está; nenhuma garantia é oferecida.
 */
#include <Wire.h>

 // adicionado por RoboJax
#include <Servo.h>

#include <SparkFun_APDS9960.h>


Servo myservo; // criar objeto servo para controlar um servo // adicionado por RoboJax

 // Alfinetes
#define APDS9960_INT    2 // Precisa ser um pino de interrupção

 // Constantes

 // Variáveis Globais
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;

void setup() {
 myservo.attach(9); // anexa o servo no pino 9 ao objeto servo
 // Defina o pino de interrupção como entrada
  pinMode(APDS9960_INT, INPUT);

 // Inicializar a porta serial
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("SparkFun APDS-9960 - GestureTest"));
  Serial.println(F("--------------------------------"));

 // Inicializar rotina de serviço de interrupção
  attachInterrupt(0, interruptRoutine, FALLING);

 // Inicializar APDS-9960 (configurar I2C e valores iniciais)
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9960 init!"));
  }

 // Inicie o motor do sensor de gestos APDS-9960.
  if ( apds.enableGestureSensor(true) ) {
    Serial.println(F("Gesture sensor is now running"));
  } else {
    Serial.println(F("Something went wrong during gesture sensor init!"));
  }
}

void loop() {
  if( isr_flag == 1 ) {
    detachInterrupt(0);
    handleGesture();
    isr_flag = 0;
    attachInterrupt(0, interruptRoutine, FALLING);
  }
}

void interruptRoutine() {
  isr_flag = 1;
}

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");
        myservo.write(180); // adicionado por RoboJax
        break;
      case DIR_RIGHT:
        Serial.println("RIGHT");
        myservo.write(0); // adicionado por RoboJax
        break;
      case DIR_NEAR:
        Serial.println("NEAR");
        break;
      case DIR_FAR:
        Serial.println("FAR");
        break;
      default:
        Serial.println("NONE");
    }
  }
}

Recursos e referências

Ainda não há recursos.

Arquivos📁

Outros arquivos