Custom Search

terça-feira, 10 de abril de 2012

Arduino + LDR (Light Dependent Resistor)



Olá povo, hoje vou fazer um pequeno exemplo de como usar um LDR (Light Dependent Resistor, ou em português Resistor Dependente de Luz).

Um LDR é um tipo de resistor cuja resistência varia conforme a intensidade de luz que incide sobre sua superfície. Portanto o LDR "transforma luz em valores de resistência".

A idéia é poder controlar a intensidade de um LED de acordo com a intensidade de luz que incide sobre o LDR, ou seja, quanto mais luz tivermos no local, menor será o brilho do LED e quanto mais escuro, maior será o brilho do LED.

Bom... então segue a lista de componentes:

1 - Arduino Duemilanove
2 - LDR 5mm
3 - LED
4 - Resistor de 10K
5 - Resistor 220
6 - Fios

O primeiro passo é fazer as devidas ligações como no circuito abaixo:




em seguida o código:

/*
***Arduino + LDR***
José Maria DVD
*/
int pinoLED = 9; // pino digital 9
int pinoLDR = 5; // pino analógico 5
int LDR = 0; // receberá o valor do LDR
int LED = 0; // valor do LED
void setup() {
Serial.begin(9600);
}
void loop(){
//O valor lido da porta será no intervalo (0 a 1023)
LDR = analogRead(pinoLDR);
//Mostra na serial
Serial.print("LDR = ");
Serial.println(LDR);
//Ajuste de valores para um melhor filtro
if(LDR > 600) LDR = 600;
else if(LDR < 100) LDR = 100;
//Tranforma uma escala de valores em outra (255 a 0).
LED = map(LDR, 100, 600, 255, 0);
analogWrite(pinoLED, LED);
delay(50);
}
Resultado final:





Veja o vídeo do funcionamento.




Observações e Comentários: 


1 - Você deverá fazer alguns ajustes dependendo da intensidade de luz no ambiente. No meu caso precisei ajustar a seguinte linha de código:


 //Ajuste de valores para um melhor filtro
  if(LDR > 600) LDR = 600;
  else if(LDR < 100) LDR = 100;
  //Tranforma uma escala de valores em outra (255 a 0).
  LED = map(LDR, 100, 600, 255, 0);
Normalmente o valor do LDR é de 0 a 1023 no entanto com os testes feito no ambiente, observei que o valor variava de 50 a 700. Portanto optei por diminuir o intervalo (100 a 600) e com isso obtive um resultado final mais concreto(o LED chegava a apagar totalmente).

 2 - Aconselho estudar um pouco sobre a função map, com ela boa parte de seus problemas serão resolvidos.

3 - O resistor de 10k é para o LDR e o de 220 é para o LED. Aconselho também estudar um pouco sobre Divisor de Tensão.

Até a próxima.



segunda-feira, 2 de abril de 2012

Arduino + Servo Motor




Olá pessoal, hoje vou mostrar como utilizei o meu arduino para controlar um servo motor.

Estou usando:
1 - Arduino Duemilanove
2 - Servo Motor HX5010
3 - Bateria
4 - Fios

O primeiro passo é montar o circuito abaixo:



OBS.: Dependendo do servo que esteja trabalhando, será necessário utilizar uma fonte externa para alimentação, o círculo vermelho indica onde deverá ser inserido. No meu caso usei uma bateria.

Bom, a ideia é que o servo se mova para a direita ou para a esquerda, usando a porta serial como parâmetro de entrada. Para fazer o controle do servo utilizaremos um biblioteca nativa do arduino chamada Servo.


OBS.: Para quem não sabe, o servo possui 180º de movimento(0 até 179 = 180 posições). Portanto usaremos uma variável chamada pos para fazer esse controle. Utilizaremos também uma outra chamada graus, que será o nosso incremento de posição.


Nesse caso a variável pos possui valor inicial 90 e a varável graus possui valor 10. Com isso teremos para a varável pos um valor mínimo de 0 e máximo de 170. Caso queira ter uma melhor precisão, basta diminuir o valor de graus.

Segue o código:

/*
** Servo **
José Maria DVD
*/
#include <Servo.h>
Servo servo1;
//variavel de posicao do servo, inicialmente com 90(meio), já que o servo varia entre 0-179 graus
int pos = 90;
int graus = 10;
char lado;
void setup()
{
servo1.attach(9); // Porta de dados do servo
Serial.begin(9600); // inicializa porta serial
}
void loop(){
lado = Serial.read();
//verifica a letra e se chegou ao valor máximp da posição, senão incrementa x graus
if (lado == 'l' && pos < (180-graus) ){
pos += graus;
}
//verifica a letra e se chegou ao mínimo da posição, senão diminiu x graus
else if (lado == 'r' && pos >= graus){
pos -= graus;
}
lado = 'n';
//muda de posicao
servo1.write(pos);
//delay de 350ms;
delay(350);
}

Em seguida salve e digite Ctrl + U ...

Trabalho Final:


Um vídeo para melhor visualização:


Até a próxima.