domingo, 25 de março de 2012

Sensor de Luminosidade com LDR - Parte 2

Arduino by my Self
Esta barra, indica o nível de dificuldade encontrado para cada experiência realizada.
sendo:
"VERDE", indicação de nível 1 a 5 (Fácil);
"AMARELO", indicação de nível 6 a 8 (Médio);
VERMELHO, indicação de nível 9 e 10 (Difícil);



Bom vamos à parte prática do assunto de sensoreamento de luz.

Primeira experiência:

Esquema de Ligação do LDR e LED
Nesta experiência vamos verificar o controle PWM de um LED, partindo das informações provenientes de um LDR, ou seja:
Quanto maior a luminosidade incidente no LDR maior o brilho no LED vise-versa.
Usamos também a comunicação serial para fazer uma leitura dos dados obtidos pelo LDR.
Um controle bem simples, mas utilizado em muitos projetos relacionados com iluminação.

Abaixo listamos o hardware necessário:
1 x Arduino UNO ou Duemilanove
1 x Bread Board
1 x LDR
1 x LED
1 x Resistor 220O
1 x Resistor 10KO
Fios, Cabos e Jumpers



Você pode usar vários valores de resistor em conjunto com o LDR para formar o divisor de tensão para obter diferentes resultados e semsibilidades do sensor, dependendo que você quer medir (quantidade de luminosidade)

Abaixo o software comentado:


/* Sketch simples, para testes com LDR */

// definição de variáveis
int photocellPin = 0;     // o LDR e seu resistor de pulldown são conectados ao pino a0
int photocellReading;     // leitura analógica do divisor do sensor
int LEDpin = 11;          // pino do LED
int LEDbrightness;        // variável para conter o brilho do LED
void setup(void) {
  // envia informação para o monitor serial
  Serial.begin(9600);   // inicializa a comunicação serial
}

void loop(void) {
  photocellReading = analogRead(photocellPin); // faz a leitura do LDR  

  Serial.print("Leitura analógica = "); // escreve mensagem
  Serial.println(photocellReading);     // escreve a quantidade lida

  // LED brilhará mais no escuro 
  // isso significa que temos que inverter a leitura de 0-1023 para 1023-0
  photocellReading = 1023 - photocellReading;
  
  // mapeamento dos valores de 0-1023 para 0-255 que é o que o a função analogWrite usa
  LEDbrightness = map(photocellReading, 0, 1023, 0, 255);
  analogWrite(LEDpin, LEDbrightness); // acende o LED com o brilho determinado

  delay(100); // pausa
}

// Fim da compilação


Resultados:
O resultado esperado é uma leitura no monitor serial dos valores do LDR (dependendo do resistor utilizado como divisor de tensão) dentro de uma faixa
Aconselho colocar um potênciometro de 1MO em série com um resistor de 1KO, no lugar do resistor fixo de 10KO, para assim fazer o ajuste de sensibilidade.
Abaixo uma janela do monitor serial.

Relacionado ao LED, ele deve variar sua luminosidade conforme a faixa monitorada desde ausência de brilho até máximo brilho, conforme o LDR esteja iluminado ou sem iluminação, respectivamente (veja o vídeo abaixo).


Segunda Experiência:

Nesta segunda experiência, veremos como mensurar os valores com limiares pré estabelecidos de luminosidade.
Faixa de:

0 - 9 = escuridão
10 - 199 = penumbra
200 - 499 = iluminado
500 - 799 = brilhante
800 - 1023 = muito brilhante


Não será usado nenhum cálculo ou mapeamento.
A mensagem será mostrado no monitor serial, mas é facilmente adaptado em um display LCD 16x2

O hardware e o material utilizado podem ser os mesmos da primeira experiência, eliminando o LED que não será usado.

Programa comentado:


/* simples teste com LDR
para maiores informações: 
www.ladyada.net/learn/sensors/cds.html */

int photocellPin = 0;     // pino a0 conectado ao LDR e resistor dde 10K pulldown
int photocellReading;     // armazena o valor da leitura analógica

void setup(void) {
  // mostra os valores lido no monitor serial
  Serial.begin(9600);   // inicializa a comunicação serial
}

void loop(void) {
  photocellReading = analogRead(photocellPin);  // faz a leitura analógica do LDR

  Serial.print("Valor Analog. = ");   // mensagem
  Serial.print(photocellReading);     // o valor lido

  // alguns limiares para quantizar valores determinados
  if (photocellReading < 10) {
    Serial.println(" - Dark"); // escuridão
  } else if (photocellReading < 200) {
    Serial.println(" - Dim"); // penumbra, entardecer
  } else if (photocellReading < 500) {
    Serial.println(" - Light"); // luz
  } else if (photocellReading < 800) {
    Serial.println(" - Bright"); // brilhante
  } else {
    Serial.println(" - Very bright"); // muito brilhante
  }
  delay(1000);
}


Resultados:

Conforme o LDR é iluminado ou não, detectamos o quanto de luminosidade ele tem e de acordo com parâmetros de iluminação determinados pela tabela, informamos num display ou no monitor serial a  faixa que se encontra a iluminação do LDR.
Veja abaixo uma tela da comunicação serial recebendo os valores:





Abaixo o vídeo das duas experiências:

video



Espero que o tema tenha sido interessante e até o próximo post.


Dúvidas e sugestões enviem para: arduinobymyself@gmail.com









sábado, 24 de março de 2012

Sensor de Luminosidade com LDR - Parte 1

Arduino by my Self
Esta barra, indica o nível de dificuldade encontrado para cada experiência realizada.
sendo:
"VERDE", indicação de nível 1 a 5 (Fácil);
"AMARELO", indicação de nível 6 a 8 (Médio);
VERMELHO, indicação de nível 9 e 10 (Difícil);



Olá! a todos,

Neste post vamos aprender a trabalhar com o sensoreamento de LUZ, teremos uma grande quantidade de material para nos aprofundarmos , e no futuro fazer um projeto maior que é o ROBOT Seguidor de Linha.

Bom estudo!

Texto traduzido de http://www.ladyada.net/learn/sensors/cds.html, visitem!


LDR(Light Dependent Resistor)




Fotocélulas são sensores que permitem detectar a luz.
Eles são pequenos, de baixo custo, baixa potência, fácil de usar e não se desgastam.
Por esse motivo, muitas vezes aparecem em brinquedos, aparelhos e equipamentos.
Eles muitas vezes são referidos como células de CdS (eles são feitos de sulfato de cádmio).
São componentes cuja resistência é dependentes da luz incidentes (LDR), as chamadas fotorresistências ou  fotocélulas.

Então:
Fotocélulas são basicamente um resistor que muda seu valor de resistência (em ohms O) dependendo da quantidade de luz está brilhando sobre a sua face. Estes tipos de componentes de baixo custo são muitas vezes um pouco impreciso. Cada sensor de célula fotoelétrica actuará um pouco diferente do que o outro, mesmo se forem do mesmo lote.
As variações podem ser muito grande, 50% ou superior! Por esta razão, não devem ser utilizados para tentar determinar os níveis de luz precisos em lux ou millicandela. Em vez disso, você pode esperar apenas ser capaz de determinar mudanças básicas de luz.

Para a maioria dos projetos onde se necessita saber somente se temos "luz" ou "escuridão", ou se há algo na frente do sensor (que bloqueiam a luz), ou se há algo interrompendo um feixe de laser (os chamdos break-beam sensores), ou em alguns projetos saber dentre qual dos múltiplos sensores tem a luz mais forte; as fotocélulas pode ser uma boa escolha!



Como medir Luminosidade, usando um LDR

Como já dissemos, as mudanças de resistência em uma fotocélula depende de quanto ela está iluminada.
Quando a sua face esta no escuro, o sensor se parece com uma resistência muito grande de até 10MO, conforme aumenta-se o nível de luz, a resistência cai.
O gráfico abaixo indica aproximadamente a resistência do sensor a diferentes níveis de luz. Usar somente como um guia, pois cada fotocélula tem um comportamento e resistências diferentes!


Note-se que o gráfico não é linear, o gráfico é um log-log!

Fotocélulas, particularmente as células comuns CdS que você é provável encontrar, não são sensíveis a toda a luz. Em particular, eles tendem a ser sensíveis à luz entre 700nm (vermelho) e da luz 500nm (verde).


Muitos Datasheets usam o "lux" para indicar a resistência a certos níveis de luz.


IluminânciaExamplo
0.002 luxLuar  numa noite de céu claro
0.2 luxDesign minimo para luz de emergencia (AS2293).
0.27 - 1 luxNoite Limpa de lua cheia
3.4 luxLimite de iluminação civil c/ céu limpo
50 luxsala de estar familiar
80 luxbanheiro / entrada da casa
100 luxdia nublado escuro
300 - 500 luxnascer do sol ou por do sol em dia claro / escritório bem iluminado
1,000 luxdia nublado, iluminação de estúdio de TV
10,000 - 25,000 luxplena luz do dia (indiretamente para o sol)
32,000 - 130,000 luxplena luz do dia (diretamente para o sol)



A maneira mais fácil de determinar se uma fotocélula esta funcinando é conectar um multímetro em seus terminais e medir a sua resistência com ela iluminada e sem iluminação. Apenas certifique-se de verificar que  as fotocélulas tem resistência entre 1MO e 1kO.

Devido fotocélulas serem basicamente resistências, elas não são polarizada. Isso significa que você pode conectá-los com os pinos independentes de polaridade positiva/negativa no circuito.

Medida com o LDR iluminado

Medida com o LDR sem iluminação




Como conectar seua fotocélula?

A maneira mais fácil de ligar  um sensor resistivo é conectar um terminal ao VCC e outro para um resistor de pull-down para o GND . Em seguida, o ponto situado entre a resistência de pulldown fixo e a fotocélula  é ligado à entrada analógica de um microcontrolador, tais como um Arduino.

Esquema de conexão

Diagrama Filiar

Para este exemplo estamos mostrando o uso de uma fonte de 5V, mas note que você pode usar também com uma fonte de 3.3V facilmente. Nesta configuração as gamas de tensão de leitura são de 0V (terra) a cerca de 5V (ou aproximadamente o mesmo que a tensão de alimentação).

A forma como isto funciona é que, como a resistência das fotocélulas diminue, a resistência total da célula foto-eléctrica e o resistor pulldown diminui a partir de 600KO para 10KO. Isso significa que a corrente que flui através de ambos os resistores, que por sua vez faz com que a tensão através do resistor fixo 10KO  aumente.

Luz ambiente como...Ambient light (lux)Photocell resistance (O)LDR + R (O)Current thru LDR +RVoltage across R
Corredor0.1 lux600KO610 KO0.008 mA0.1 V
Luar1 lux70 KO80 KO0.07 mA0.6 V
Quarto escuro10 lux10 KO20 KO0.25 mA2.5 V
Dia encoberto, quarto brilhante100 lux1.5 KO11.5 KO0.43 mA4.3 V
Dia nublado1000 lux300 O10.03 KO0.5 mA5V
Esta tabela indica que a tensão aproximada com base no sensor de luz / resistência / uma fonte de 5V e resistor pulldown 10KO.

Se você está planejando para que o sensor em uma área brilhante e usar um pulldown 10KO, ele vai rapidamente saturar. Isso significa que ele vai bater o "teto" de 5V e não ser capaz de diferenciar entre meio brilhante e muito brilhante. Nesse caso, você deve substituir o suspenso 10KO com um pulldown 1k. Nesse caso, não será capaz de detectar diferenças de nível escuro, bem mas será capaz de detectar diferenças de luz brilhante melhor. Esta é uma compensação que você terá que decidir!
Ambient light like…Ambient light (lux)Photocell resistance (O)LDR + R (O)Current thru LDR+RVoltage across R
Moonlit night1 lux70 KO71 KO0.07 mA0.1 V
Dark room10 lux10 KO11 KO0.45 mA0.5 V
Dark overcast day / Bright room100 lux1.5 KO2.5 KO2 mA2.0 V
Overcast day1000 lux300 O1.3 KO3.8 mA3.8 V
Full daylight10,000 lux100 O1.1 KO4.5 mA4.5 V
Esta tabela indica que a tensão aproximada analógico com base no sensor de luz / resistência w / uma fonte de 5V e uma resistência de 1K pulldown
Note-se que o nosso método não proporciona tensão linear relativamente ao brilho! À medida que aumenta o nível de luz, a tensão analógica sobe muito embora a resistência cai:
Vo = Vcc (R / (R + Fotocélula))
Isto é, a tensão é proporcional ao inverso da resistência da célula fotoeléctrica, que é, por sua vez, inversamente proporcional aos níveis de luz.


Bom! espero que toda esta teoria possa ajudar a compreender melhor o uso deste tipo de sensor.
No próximo post veremos a parte prática, então até lá!
Dúvidas e sugestões enviem para: arduinobymyself@gmail.com









Arduino, Termômetro

Arduino by my Self
Esta barra, indica o nível de dificuldade encontrado para cada experiência realizada.
sendo:
"VERDE", indicação de nível 1 a 5 (Fácil);
"AMARELO", indicação de nível 6 a 8 (Médio);
VERMELHO, indicação de nível 9 e 10 (Difícil);



Olá! a todos,

Neste post veremos como usar um Thermistor como componente de sensoreamento da temperatura ambiente.  E como usar o Arduino para adquirir as informações e visualizar isto em um display LCD 16 x 2.
Ajuste necessário: um termômetro digital para saber a temperatura do ambiente e assim ajustar o Arduino Termômetro.

O HARDWARE:
Para esta experiência necessitaremos de:
1 x Arduino UNO ou Duemilanove
1 x Bread Board
1 x LCD 16x2 I2C
1 x Thermistor de 10KO
1 x Potenciômetro de 50KO
Fios e Cabos


O CIRCUITO:

Ligar os pinos do LCD da seguinte forma:
GND ao negativo da alimentação
VCC ao positivo da Alimentação
SDA ligar ao pino analógico 4 do Arduino
SCL ligar ao pino analógico 5 do Arduino

O Thermistor deve ser ligado da seguinte maneira:
Um terminal do Thermistor deve ser conectado diretamente ao VCC, o outro terminal deve ser ligado ao pino 2 de um potenciômetro.
O pino central do potenciômetro deve ser ligado ao pino 1 dele mesmo, e o pino 1 deve ser conectado ao GND.
Na junção, entre o terminal do Thermistor e o pino 2 do potenciômetro, deve ser ligado o pino analógico 0 do Arduino.


                                  _                                ________
                                   \                              c|               |
VCC |---------------/\/\/\/\-------------2-/\/\/\/\-1-----+-------|GND
                                       \                           Potenciômetro
                                      Thermistor


Qual é a necessidade do potenciômetro?
O Thermistor é de 10 KO à temperatura ambiente de 25 Graus Celcius. Isso significa que se estivermos a 25 Graus Celsius, sua resistência terá exatamente 10KO e se colocarmos uma outra resistência fixa de 10KO como divisor de tensão, teremos metade do valor de VCC, ou seja 2,5V no pino analógico 0 do Arduino. Assim fica fácil parametrizar que quando tivermos 2,5V no pino analógico 0 , termos 25 Graus Celcius.
Como geralmente nosso ambiente não estará a 25 Graus Celcius, necessitamos do potenciômetro para saber qual resistência devemos colocar como divisor de tensão, e assim fazer um ajuste fino.
De posse de um termômetro digital (quanto mais preciso melhor), podemos fazer o ajuste;

Nota: se girarmos totalmente o POT em direção ao negativo o circuito nunca mostrará nenhuma temperatura.  Se quiser pode ser colocado um resistor de 5KO em série com o POT e assim ter um valor fixo e ajustar o valor somente dentro de uma faixa.

Existem dispositivos semicondutores que podem ser usados para medir a temperatura ambiente com maior precisão que um Thermistor, por exemplo o LM35,  ou o LM335, mas isto será tema de um outro post.

Vejamos o circuito feito em fritzing:

Arduino Termômetro - Esquema

O SOFTWARE:
Abaixo o software completo e comentado.
Visite para maiores informações; http://arduino.cc/playground/ComponentLib/Thermistor2


/*
  Este exemplo é um código de domínio público.
*/


#include <Wire.h> // inclui a biblioteca Wire


 #include <LiquidCrystal_I2C.h> // inclui a biblioteca do LCD

 // initialize the library with the numbers of the interface pins
 LiquidCrystal_I2C lcd(0x27, 16, 2); // inicalização do LCD com o endereço de 
                                     // pinos utilizados no Arduino
                                     
 //Código extraído de ...http://www.arduino.cc/playground/ComponentLib/Thermistor2

 #include <math.h> // inclui a biblioteca math

 double Thermister(int RawADC) { 
                                 // pega os dados lido do Thermistor quando chamada a função
                                 // e armazena em RawADC, este é um valor relacionado a
                                 // queda de tensão
 double Temp; // variável usada no cálculo
 Temp = log(((10240000/RawADC) - 10000));
                                         // relaciona o valor de queda de tensão lido com resistência
                                         // 10000 é o valor da resistência do Thermistor
                                         // se for necessário usar um Thermistor diferente
                                         // ajustar o valor corretamente

 // formula para dar a temperatura em Kelvin
 Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp)); 
 Temp = Temp - 273.15;            // converte de Kelvin para Celcius

 return Temp; // retorna o valor da temperatura calculada
 }

 void setup() {
   // configura o LCD
   lcd.init();                           // inicializa o lcd 
   lcd.backlight();                  // com luz de fundo
   Serial.begin(9600);           // inicializa a comunicação serial
   // imprime mensagens no LCD
  
 }

 void loop() {
   
   lcd.clear();                                      // limpa o LCD
   lcd.setCursor(0,0);                         // posiciona o cursor na coluna 0 x linha 0
   lcd.print("Temp. Ambiente: ");         // texto para colocar significado ao que for apresentado
   lcd.setCursor(0,1);                        // posiciona o cursor na coluna 0 x linha 1
   lcd.print(int(Thermister(analogRead(0))));  // imprime o valor lido do thermistor correspondente
                                                                    // à temperatura
   lcd.print(" Graus C");                    // imprime a unidade medida
   delay(1000);                                // pausa até executar uma nova leitura e visualização
 }
 // Fim da Compilação



O VÍDEO:

Dúvidas e sugestões enviem para: arduinobymyself@gmail.com

Nesta experiência não teremos vídeo, pois ela é bem simples e está bem documentada.

Segue fotos do projeto.

Visão Geral
Temperatura no Display
Thermistor em azul
Pinagem


Até o próximo post, Bons experimentos!