Componentes Eletronicos

Identificando Movimentos e Cores com o Arduino

Eletrogate 28 de maio de 2021

Introdução

O Arduino é uma plataforma que nos dá uma vasta quantidade de sensores e módulos capazes de executar as mais diversas tarefas, coletando os mais variados dados do ambiente em que estão inseridos.

Hoje vamos apresentar o APDS-9960: um sensor capaz de reconhecer determinados padrões de movimentos e cores no padrão RGBC que pode agregar muito valor e conhecimento aos seus projetos. Veja um pouco sobre suas características e como utilizá-lo em conjunto com o Arduino:


Características e Funcionamento

O APDS-9960 é um módulo que possui um sensor de cor RGB, gestos e luminosidade em um único encapsulamento. É produzido pela Broadcom e uma das suas principais aplicações no mercado foi a interface de movimento e luminosidade presentes no Galaxy S5, da Samsung. Para o Arduino, o módulo traz uma interface de comunicação I2C, além de um pino para interrupção (INT) e um para infravermelho (VL).

Falando um pouco sobre cada sensor presente no módulo, temos:

Sensor de gestos: O sensor de gestos do módulo APDS-9960 é composto por quatro fotodiodos direcionais integrados com um filtro de bloqueio visível, o que permite a detecção de gestos como subir, descer, direita e esquerda a distâncias de até 10cm sem a necessidade de calibração por parte do usuário. Sempre que um movimento é realizado, o sinal infravermelho que é constantemente emitido reflete no objeto e então é detectado por pelos fotodiodos: se um movimento é feito da esquerda para a direita, o sinal IR refletido é detectado primeiramente pelos fotodiodos à esquerda do sensor e, dessa forma, o sensor entende que o movimento foi feito no sentido esquerda -> direita.

Sensor RGBC: O sensor de cor do módulo APDS-9960 é no padrão RGBC (Vermelho, Verde, Azul e Claro). Isso faz com que ele seja capaz de detectar a intensidade da luz sob várias condições de luminosidade graças aos materiais de atenuação presentes em seu sensor. Além disso, o módulo conta com um filtro de bloqueio UV-IR integrado que permite a medição da luz ambiente e cores correlacionadas de forma mais precisa.

Veja abaixo algumas características desse módulo:

  • Tensão de operação: 3.3V
  • Sensibilidade a luz ambiente e a cor RGB
  • Sensibilidade à proximidade
  • Detecção de gestos
  • Range de operação: 10-20cm
  • Interface I2C (I2C Address: 0x39)

Aplicações

O módulo APDS-9960 pode ser utilizado para detecção de gestos, sensor de luz ambiente e RGB, sensor de proximidade, etc. Ele pode ser usado para dar as classificações RGB da luz, quando é necessário manipular os valores e temperaturas da luz. É amplamente usado em muitos telefones, como dito acima, para controle de luminosidade, movimento e funções como desligar a tela ao aproximar o telefone do ouvido ou controlar o brilho da mesma. Também é usado na robótica devido à sua técnica avançada de detecção de gestos, permitindo detectar determinado movimento com alta precisão e velocidade e pode até mesmo ser utilizado como interruptor óptico, dependendo da aplicação.


Utilizando o APDS-9960 com o Arduino - Sensor de Gestos

Como dito anteriormente o módulo APDS-9960 possui dois sensores em seu encapsulamento. Vamos te mostrar como fazer o uso de cada um separadamente, começando pelo sensor de cor:

Materiais necessários para o projeto Identificando Movimentos e Cores com o Arduino

cta_cart

Conexões

As conexões do módulo seguem o padrão I2C, já conhecido por nós. Para o sensor de gestos, conecte-o ao Arduino como mostrado na imagem abaixo:

Código

O código abaixo se encontra nos exemplos da biblioteca SparkFun APDS9960, que você precisará instalar em sua IDE. Para isso, basta ir em Sketch -> Incluir Bibliotecas -> Gerenciar Bibliotecas e buscar pela biblioteca de mesmo nome. Caso prefira, basta fazer o download do arquivo .zip quicando aqui. Para instalar, basta ir em Sketch -> Incluir Bibliotecas -> Adicionar Biblioteca .zip e localizar o arquivo baixado. Feito isso, basta carregar o código abaixo em seu Arduino e, em seguida, abrir o Monitor Serial. Seu funcionamento está comentado ao longo do sketch.

/****************************************************************
GestureTest.ino
APDS-9960 RGB and Gesture Sensor
Shawn Hymel @ SparkFun Electronics
May 30, 2014
https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor

Conexões

Importante: O módulo APDS-9960 funciona somente com 3.3V!!!
 
Arduino Pin  APDS-9960 Board  Function
 
 3.3V            VCC            Power
 GND             GND            Ground
 A4              SDA            I2C Data
 A5              SCL            I2C Clock
 D2              INT            Interrupt
 
****************************************************************/

//Inclusão de bibliotecas
#include <Wire.h>
#include <SparkFun_APDS9960.h>

//Pinos
#define APDS9960_INT    2 // Needs to be an interrupt pin

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

void setup() {

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

  //Inicializa a comunicação serial
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("SparkFun APDS-9960 - Teste de Gestos"));
  Serial.println(F("--------------------------------"));
  
  //Iniciando rotina de interrupção
  attachInterrupt(0, interruptRoutine, FALLING);

  //Iniciando o módulo APDS-9960
  if ( apds.init() ) {
    Serial.println(F("APDS-9960: Inicialização completa!"));
  } else {
    Serial.println(F("APDS-9960: Algo deu errado durante a inicialização!"));
  }
  
  //Iniciando o sensor de gestos
  if ( apds.enableGestureSensor(true) ) {
    Serial.println(F("O sensor de gestos está funcionando!"));
  } else {
    Serial.println(F("Algo deu errado durante a unidade do sensor de gestos!"));
  }
}

void loop() {
  
  //Lógica de interrupção
  if( isr_flag == 1 ) {
    detachInterrupt(0);
    handleGesture();
    isr_flag = 0;
    attachInterrupt(0, interruptRoutine, FALLING);
  }
}

//Função responsável pela interrupção
void interruptRoutine() {
  isr_flag = 1;
}

//função responsável por identificar e retornar os resultados da leitura
void handleGesture() {
    if ( apds.isGestureAvailable() ) {
    switch ( apds.readGesture() ) {
      case DIR_UP:
        Serial.println("CIMA");
        break;
      case DIR_DOWN:
        Serial.println("BAIXO");
        break;
      case DIR_LEFT:
        Serial.println("ESQUERDA");
        break;
      case DIR_RIGHT:
        Serial.println("DIREITA");
        break;
      case DIR_NEAR:
        Serial.println("APROXIMANDO");
        break;
      case DIR_FAR:
        Serial.println("DISTANCIANDO");
        break;
      default:
        Serial.println("GESTO NÃO RECONHECIDO");
    }
  }
}

Resultado Esperado

O resultado esperado pode ser visto no vídeo abaixo:


Utilizando o APDS-9960 com o Arduino - Sensor de Cor

Conexões

Para o sensor de cor, conecte-o ao Arduino como mostrado na imagem abaixo:

Código – Sensor de Cor

O código abaixo também se encontra nos exemplos da biblioteca SparkFun APDS9960, que você instalou anteriormente em sua IDE. Basta carregá-lo em seu Arduino e, em seguida, abrir o Monitor Serial. Novamente, seu funcionamento está descrito ao longo do sketch.

/****************************************************************
ColorSensor.ino
APDS-9960 RGB and Gesture Sensor
Shawn Hymel @ SparkFun Electronics
October 15, 2014
https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor

Conexões

Importante: O módulo APDS-9960 funciona somente com 3.3V!!!
 
Arduino Pin  APDS-9960 Board  Function
 
 3.3V            VCC            Power
 GND             GND            Ground
 A4              SDA            I2C Data
 A5              SCL            I2C Clock
 
******************************************************************/

//Inclusão de bibliotecas
#include <Wire.h>
#include <SparkFun_APDS9960.h>

//Instanciando o objeto "apds" e atribuindo como valor uma função existente na biblioteca
SparkFun_APDS9960 apds = SparkFun_APDS9960();

//Variáveis globais
uint16_t ambient_light = 0;
uint16_t red_light = 0;
uint16_t green_light = 0;
uint16_t blue_light = 0;

void setup() {
  
  //Inicializando a comunicação serial
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("SparkFun APDS-9960 - Sensor de Cor"));
  Serial.println(F("--------------------------------"));
  
  //Inicializa o módulo APDS-9960
  if ( apds.init() ) {
    Serial.println(F("APDS-9960: Inicialização completa!"));
  } else {
    Serial.println(F("APDS-9960: Algo deu errado durante a inicialização!"));
  }
  
  //Executa o sensor de luminosidade
  if ( apds.enableLightSensor(false) ) {
    Serial.println(F("O sensor de luz está funcionando!"));
  } else {
    Serial.println(F("Algo deu errado durante a unidade do sensor de luz!"));
  }
  
  // Aguarde a inicialização e calibração terminar
  delay(500);
}

void loop() {
  
  // Lê os níveis de luminosidade (ambiente, vermelho, verde, azul)
  if (  !apds.readAmbientLight(ambient_light) ||
        !apds.readRedLight(red_light) ||
        !apds.readGreenLight(green_light) ||
        !apds.readBlueLight(blue_light) ) {
    Serial.println("Erro ao ler os valores de luminosidade");
  } else {
    Serial.print("Ambiente: ");
    Serial.print(ambient_light);
    Serial.print(" Vermelho: ");
    Serial.print(red_light);
    Serial.print(" Verde: ");
    Serial.print(green_light);
    Serial.print(" Azul: ");
    Serial.println(blue_light);
  }
  
  // Espera 1 segundo e executa a próxima leitura
  delay(1000);
}

Resultado Esperado

O resultado esperado pode ser visto no vídeo abaixo:

Note que há uma variação na leitura ao aproximar uma luz diferente da ambiente. Para simplificar, vamos analisar o frame a seguir:

A variação é causada pela intensidade da luz incidente no sensor. Essa variação é exibida da seguinte forma:

Ambiente: índice de luminosidade local
Vermelho: índice do espectro vermelho na luz captada
Verde: índice do espectro verde na luz captada
Azul: índice do espectro azul na luz captada

Quando há um aumento na intensidade em determinada faixa de cor, como no azul destacado acima, os valores lidos são significativamente maiores naquela faixa que os demais. Isso nos permite desenvolver algoritmos que detectam as mínimas variações em um determinado espectro e retornem com precisão a cor reconhecida (lembre-se que, para essa finalidade, devem ser consideradas apenas as leituras de vermelho, verde e azul, ok?). Legal, né?


Conclusão

Hoje você conheceu mais um sensor muito legal e extremamente útil e versátil em aplicações que envolvam luz. Esperamos que esse post te ajude e te motive a conhecer ainda mais o fantástico mundo do Arduino e suas infinitas possibilidades. Um forte abraço e até a próxima!


Se você deseja adquirir mais sensores como esse, visite a nossa loja e conheça nossa linha de produtos voltadas para o Arduino e robótica. Nos siga no Instagram e, se você desenvolveu qualquer projeto com base no blog ou com nossos produtos, tire uma foto e nos mencione. Estamos ansiosos para ver a criatividade dos nossos leitores e clientes!

Conheça a Metodologia Eletrogate e ofereça aulas de robótica em sua escola!


Sobre o Autor


Samuel Martins
@samuel.martins192

Cursando Eletroeletrônica no SENAI CETEL. Fanático por eletrônica, automação, impressão 3D e afins, dedico meu tempo livre a pesquisas e projetos ligados às principais áreas de interesse, pratico aeromodelismo e sou curioso por astrofotografia.


Eletrogate

28 de maio de 2021

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Conheça a Metodologia Eletrogate e Lecione um Curso de Robótica nas Escolas da sua Região!

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!