terça-feira, 15 de dezembro de 2020

 

Circuito detector de cores

  Olá. Nesta aula vamos aprender a construir um circuito capaz de detectar 3 cores (vermelho, verde e azul) usando nosso Arduino Uno. Para realizar este experimento vamos precisar de:

1 Arduino Uno;

1 proto board;

1 display LCD 16X2 com módulo I2C,;

1 led RBG (anodo comum);

1 LDR (resistor sensível a luz);

3 resistores de 330 Ohms;

1 resistor de 1K Ohms;


  Teremos também que usar uma biblioteca especial para controlar o módulo I2C. Ela está disponível no seguinte link:

https://drive.google.com/file/d/1bSa5tyCN3MOfJj4zkT1RD-bnLCxr6tFv/view

  Para fazer a configuração correta do módulo I2C recomendo fortemente que você assista o seguinte vídeo, e já aproveite e se inscreva no canal do Brincando Com Idéias:

https://www.youtube.com/watch?v=5OSPk5oHhVM&ab_channel=BrincandocomIdeias

  Neste vídeo o professor Flavio Guimarães explica passo a passo como realizar todos os procedimentos para o seu display funcionar direitinho.

  Para encontrar o endereço correto do seu display use este sketch disponibilizado pelo Brincando Com Ideias, do professor Flávio:

https://drive.google.com/file/d/1MpaTS5dSHf7mNvZ74nVYYtVA4E-Znb03/view

  Aqui vai um link de um sketch que ele fez para testar o display:

https://drive.google.com/file/d/18m5zvSUqzwgyWSn31uCAueJZIULrBP4S/view

Montagem do Circuito

  A montagem do circuito vai ficar assim:


Obs.: não encontrei uma imagem do módulo I2C no Fritzing, por isso coloquei apenas aquela caixa de texto para indicar as conexões. O módulo I2C é este que está logo a baixo:

Este módulo costuma vir soldado na parte traseira do display lcd.  A montagem do circuito ficou assim:



    Vocês podem ver na imagem que eu não usei o proto board. Preferi fixar tudo em uma tabuinha branca e montar o sensor em forma de um "módulo". Soldei os componentes do circuito em uma plaquinha de circuito impresso para ficar um pouco mais resistente e esteticamente mais organizado. Também usei um tubo preto de borracha para proteger o sensor da luz externa. Nele fiz uma divisória interna que impede que o LDR receba luz diretamento do led RGB. Atrás do display está uma bateria que fiz na impressora 3D. dentro estão duas capsulas de bateria de notebook, que juntas geram aproximadamente 8v. 
   A próxima imagem dá uma ideia do anteparo para a luz. Ele pode ser feito de qualquer material, até de papel, de preferência na cor preta. 


  O anteparo deve ter uma altura suficiente para que o led RGB fique totalmente dentro dele mas próximo à borda. O LDR deve ficar em uma posição entre o meio e o fundo do tubo, para impedir que ele receba luz externa que não venha do objeto refletor, mas ao mesmo tempo, que receba o máximo possível da luz refletida. Desta forma a luz precisa ser emitida para fora do tubo e ser refletida em algum objeto, para só então chegar no LDR. Este é o "segredinho" deste sensor... Para que isso aconteça, você terá que encontrar o ajuste correto ai no seu projeto.



Como Isso Funciona?

  O princípio de funcionamento deste sensor é, na verdade, bem simples. O que ele faz na prática é emitir cada uma das 3 cores (vermelho,verde e azul) de cada vez, e medir separadamente, a intensidade de luz que retornou do objeto do qual se deseja saber a cor. Sabemos que um objeto de cor vermelha por exemplo, terá sua maior intensidade de luz refletida na faixa do vermelho, e uma menor intensidade de luz refletida no verde e no azul. Desta forma o programa identifica em qual das três cores a intensidade de luz refletida foi mais intensa e exibe esta informação na tela do display lcd. É claro que ele não funciona perfeitamente. Ele se "perde" um pouco quando tentamos identificar algumas tonalidades de cores intermediárias. É que este sketch está bem simples. O programa pode funcionar bem melhor com alguns aprimoramentos. A ideia aqui é apenas mostrar uma alternativa para a construção de  um sensor de cores simples e de baixo custo.

Obs.: dentro da parte que identifiquei como:  "LÓGICA DE DEFINIÇÃO DE COR PREDOMINANTE" precisei definir um limite para que o programa não ficasse tentando encontrar alguma cor mesmo sem que houvesse algum objeto refletindo, o que sempre resultaria em erro. Determinei um limite máximo para a cor azul, por isso o "200" dentro dos "ifs". Quando o valor da variável "ldrEMazul" ultrapassa 200, o programa imprime no canto inferior direito do display lcd o texto "INDEF" que quer dizer "indefinido". Dependendo de como ficar o seu projeto, você terá que modificar este valor de 200 para mais ou para menos.

 Sketch do Detector de Cores

Copie e cole o seguinte sketch no IDE do Arduino:

/*
   Neste sketch vamos controlar um display lcd de duas linhas
   e 16 colunas; Vamos usar um sensor de cores composto por um LDR
   e um led RGB anodo comum; A cor detectada será escrita na tela do
   display lcd;
   OBS.: Para este tipo de led, o Anodo comum deve ser conectado no vcc
   e para aciona-lo o catodo deve estar em nivel lógico baixo;
*/

int ledVermelho = 9; // porta onde está conectado o catodo do led vermelho;
int ledVerde = 10;  // porta onde está conectado o catodo do led verde;
int ledAzul = 11; // porta onde está conectado o catodo do led azul;
int ldrEMvermelho; // valor do ldr com reflexo de luz vermelha;
int ldrEMverde;  // valor do ldr com reflexo de luz verde;
int ldrEMazul; // valor do ldr com reflexo de luz azul;
int LDR = A0; // porta de entrada de sinal do LDR;
int tempo1 = 1000; // variável para armazenar um dado valor para usar ao longo do programa;
int tempo2 = 10;

// VARIÁVEIS DE NIVELAMENTO
/*
   estas variáveis serão usadas para igualar as intensidades refletidas quando a cor for branca;
*/

int corrVermelho = 474;
int corrVerde = 575;
int corrAzul = 687;

// INCLUSÃO DE BIBLIOTECAS
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// DEFINIÇÕES
#define endereco  0x3F // Endereços comuns: 0x27, 0x3F
#define colunas   16
#define linhas    2

// INSTANCIANDO OBJETOS
LiquidCrystal_I2C lcd(endereco, colunas, linhas);

void setup() {
  Serial.begin(9600);// inicia comunicação serial com o arduino para que possamos receber informações
  // por meio do monitor serial;
  lcd.init(); // INICIA A COMUNICAÇÃO COM O DISPLAY
  lcd.backlight(); // LIGA A ILUMINAÇÃO DO DISPLAY
  lcd.clear(); // LIMPA O DISPLAY

  pinMode(ledVermelho, OUTPUT);
  pinMode(ledVerde, OUTPUT);
  pinMode(ledAzul, OUTPUT);
  pinMode(LDR, INPUT);

  //TESTE DOS LEDS:

  // desliga todos os leds;
  digitalWrite(ledVermelho, HIGH);
  digitalWrite(ledVerde, HIGH);
  digitalWrite(ledAzul, HIGH);
  delay(tempo1);

  // liga led vermelho;
  digitalWrite(ledVermelho, LOW);
  digitalWrite(ledVerde, HIGH);
  digitalWrite(ledAzul, HIGH);
  delay(tempo1);

  // liga led verde;
  digitalWrite(ledVermelho, HIGH);
  digitalWrite(ledVerde, LOW);
  digitalWrite(ledAzul, HIGH);
  delay(tempo1);

  // liga led vermelho;
  digitalWrite(ledVermelho, HIGH);
  digitalWrite(ledVerde, HIGH);
  digitalWrite(ledAzul, LOW);
  delay(tempo1);

  // desliga todos os leds;
  digitalWrite(ledVermelho, HIGH);
  digitalWrite(ledVerde, HIGH);
  digitalWrite(ledAzul, HIGH);
  delay(tempo1);

}

void loop() {

  // ROTINA DE MAPEAMENTO DE CORES:
  //vermelho:
  digitalWrite(ledVermelho, LOW);
  digitalWrite(ledVerde, HIGH);
  digitalWrite(ledAzul, HIGH);
  delay(tempo2);
  ldrEMvermelho = analogRead(LDR) - corrVermelho;

  //verde:
  digitalWrite(ledVermelho, HIGH);
  digitalWrite(ledVerde, LOW);
  digitalWrite(ledAzul, HIGH);
  delay(tempo2);
  ldrEMverde = analogRead(LDR) - corrVerde;

  //azul:
  digitalWrite(ledVermelho, HIGH);
  digitalWrite(ledVerde, HIGH);
  digitalWrite(ledAzul, LOW);
  delay(tempo2);
  ldrEMazul = analogRead(LDR) - corrAzul;

  digitalWrite(ledVermelho, HIGH);
  digitalWrite(ledVerde, HIGH);
  digitalWrite(ledAzul, HIGH);
  delay(tempo2);

  lcd.clear(); // LIMPA O DISPLAY
  lcd.setCursor(0, 0);
  lcd.print("vm =");
  lcd.setCursor(4, 0);
  lcd.print(ldrEMvermelho);
  lcd.setCursor(8, 0);
  lcd.print("vd =");
  lcd.setCursor(12, 0);
  lcd.print(ldrEMverde);
  lcd.setCursor(0, 1);
  lcd.print("az =");
  lcd.setCursor(4, 1);
  lcd.print(ldrEMazul);
  delay(tempo2);
  //*************************************************

  // LÓGICA DE DEFINIÇÃO DE COR PREDOMINANTE

  if (ldrEMvermelho < ldrEMverde & ldrEMvermelho < ldrEMazul & ldrEMazul < 200) {
    lcd.setCursor(8, 1);
    lcd.print("VERMELHO");
  }
  if (ldrEMverde < ldrEMvermelho & ldrEMverde < ldrEMazul & ldrEMazul < 200) {
    lcd.setCursor(8, 1);
    lcd.print("VERDE  ");
  }
  if (ldrEMazul < ldrEMvermelho & ldrEMazul < ldrEMverde & ldrEMazul < 200) {
    lcd.setCursor(8, 1);
    lcd.print("AZUL   ");
  }
  if ( ldrEMazul > 200) {
    lcd.setCursor(8, 1);
    lcd.print("INDEF");
  }

  //*************************************************
}

  Muito obrigado por visitar este blog. Espero ter ajudado. Caso você tenha alguma observação, ou queira fazer alguma sugestão, sinta-se a vontade. Toda a ajuda é bem vinda.  Um forte abraço a todos e até a próxima. ☺

Nenhum comentário:

Postar um comentário