LEDs Bi-Direccionais

Outubro 28, 2009 at 10:50 pm | In Arduino, Outros | Leave a Comment
Tags: , , ,

O que é que se pode fazer com um LED? Resposta: apenas luz. Errado! O que se pretende com este artigo é exactamente mostrar que os LEDs, para além de dispositivos de Output também podem funcionar como Input.

Estudos realizados comprovam que se acendermos um LED e invertermos a sua polaridade muito rapidamente, o tempo que o LED demora a ficar a zero depende da luz ambiente.
É claro que quando digo tempo, estamos a falar de fracções de segundo, que não se notam a olho nu, mas que um microcontrolador consegue medir.

Como funciona?

Pin 1 OUT HIGH -------( + LED - )------- Pin 2 OUT LOW
Delay 50ms
Pin 1 OUT LOW  -------( + LED - )------- Pin 2 OUT HIGH
Pin 1 IN
Medir tempo que Pin 1 leva a ficar 0
Repetir desde o início

Quando nós temos muita luz, o tempo vai ser menor.
Por outro lado, quando temos pouca luz, vai demorar mais tempo.

Experiência

Confesso que no início estava séptico em relação a estes conceitos novos. Fazer do LED um dispositivo de entrada é algo que nunca tinha ouvido sequer falar, muito menos tinha visto. Portanto, não há nada como testar.

É possível testar a validade destas novas ideias através do Arduino, utilizando apenas 2 Pinos e a porta de série.

O código:

int p1 = 2;
int p2 = 3;
int wait = 50;
int value;
void setup()
{
// Desactiva as resitências "pull-up" embutidas no Arduino
_SFR_IO8(0x35) |= 4;
_SFR_IO8(0x35) |= (1<<4);
pinMode(p1, OUTPUT); // Define p1 como uma saída (OUTPUT)
pinMode(p2, OUTPUT); // Define p2 como uma saída (OUTPUT)
Serial.begin(9600);  // Iniciar a ligação serial
}
void loop()
{
value = 0;
// Emitir LUZ
digitalWrite(p1, HIGH);
digitalWrite(p2, LOW);
delay(wait);
// Trocar os potenciais : LED = -5V
digitalWrite(p1,   LOW);
digitalWrite(p2, HIGH);
// Trocar o modo do pin
pinMode(p2, INPUT);
// Medir o tempo que o p2 leva a ficar a LOW
while(digitalRead(p2) != 0)
value++;
pinMode(p2, OUTPUT);
digitalWrite(p1, HIGH);
digitalWrite(p2, LOW);
Serial.println(value, DEC);    // Tira os // se quiseres mostrar o valor na consola
}

Façam upload do código, abram a Consola e confiram que o valor altera para diferentes luzes ambiente. Podem acender e apagar a luz, ou iluminar bem o LED e passar a mão por cima dele.

Mais além

Se quiserem ir mais além, lanço um desafio. Façam um 2º LED acender, conforme o valor  inferido pelo 1º LED.

Depois, adicionem novos pares e façam uma fila de LEDs, e criem um efeito com os dedos a passar por cima dos LEDs sensores.

Boas experiências ;)

Exemplo

Aqui está um exemplo do que se pode conseguir através deste princípio.

Fontes de Informação

http://projects.dimension-x.net/technology-and-projects/ledsensors

http://cs.nyu.edu/~jhan/ledtouch/index.html

http://www.edn.com/article/CA150821.html

Sem comentários ainda »

Feed RSS para comentários a este post. TrackBack URI

Publicar um comentário

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Blog em WordPress.com. | Theme: Pool by Borja Fernandez.
Entries and comments feeds.