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:
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:
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.
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:
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:
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"); } } }
O resultado esperado pode ser visto no vídeo abaixo:
Para o sensor de cor, conecte-o ao Arduino como mostrado na imagem abaixo:
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); }
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é?
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!
|
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!