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)

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
| Fabricante | Broadcom |
|---|---|
| Número da peça | APDS-9960 |
| Tensão lógica/E/S | 2.7 - 3.6 V |
| Tensão de alimentação | 3.3 V |
| Corrente de saída (por canal) | 1 mA |
| Corrente de pico (por canal) | 10 mA |
| Orientação sobre a frequência PWM | 100 Hz |
| Limiares de lógica de entrada | 0.3 x VDD(baixo), 0.7 x VDD(alto) |
| Queda de tensão / RDS(on)/ saturação | 0,5 V máx |
| Limites térmicos | -40 a +85 °C |
| Pacote | LGA de 6 pinos |
| Notas / variantes | Suporta 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

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.

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
/*
* 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");
}
}
}
/*
* 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
-
Biblioteca do sensor de gestos APDS-9960da Robojax.com
robojax-gesture-APDS9960-Library.zip0.30 MB