31 de agosto de 2013

Arduino: Sensor de proximidad por infrarrojos



Desmontar antiguos aparatos electrónicos da mucho de sí, siempre se puede aprovechar algo. En este caso, tenía varios ratones de bola para tirar y he pensado en quedarme con todo lo reutilizable (que es casi todo). La primera prueba, ha sido con los infrarrojos que usa para saber el movimiento de la bola. Desestañamos la LED IR y el sensor de IR y ya estamos listos para colocarlo en nuestra Arduino y jugar un poco.

Aquí podeis ver el emisor infrarrojo (el transparente) y el receptor (el de color negro) todavía en el ratón:


Este es el montaje que he realizado:


Personalmente he utilizado otro emisor de infrarrojo porque me resultaba más cómodo para las pruebas. Sí es importante, taparlo alrededor (con cinta aislante por ejemplo) para que el receptor no reciba infrarrojos todo el tiempo. En la siguiente imagen, vemos cómo ha quedado con el emisor aún sin tapar:


La gran cantidad de resistencias que se ven es porque no tenía a mano una de 100kΩ y he usado 10 de 10kΩ en su lugar.

Una vez colocado todo, vamos con el código para la Arduino:

// Sensor infrarrojo

#define LEDCerca 9 // led que brillará más cuanto más cerca estemos del receptor IR
#define IRRe A0 // receptor IR conectado en la entrada A0
#define IREm 2  // emisor IR conectado en la entrada 2
/* descomentar este trozo si usamos la primera parte del código en el loop
int valorIRReAmbiente = 0; // guardo el valor ambiental obtenido por IRRe
                           // cuanto más cerca, mayor es el valor
*/
int valorIRReEmitido = 0; // guardo el valor obtenido por IRRe con el emisor encendido
                          // cuanto más cerca, mayor es el valor
int brillo = 0; // brillo que emitiré en la led

void setup()
{
  // configuro entradas y salidas de los pines
  pinMode(LEDCerca, OUTPUT);
  pinMode(IRRe, INPUT);
  pinMode(IREm, OUTPUT);
  
  //inicializo el puerto serie
  Serial.begin(9600);
}

void loop()
{
  /*
   * Esta parte es para comprobar si hay infrarrojos en el ambiente
   *
  digitalWrite(IREm, LOW); // apago el emisor
  digitalWrite(LEDCerca, LOW); // apago LEDCerca
  delay(1);
  
  // Compruebo valor del receptor sin emitir nada y lo muestro. 
  // En mi caso 1024 indica que no hay señal.
  // También muestro el dato por el puerto serie
  valorIRReAmbiente = 1024 - analogRead(IRRe); // Leo el valor recogido por el receptor
  Serial.print("IR Ambiente: ");
  Serial.print(valorIRReAmbiente);
   *
   *
   */
  
  // Compruebo valor del receptor emitiendo y lo muestro.
  digitalWrite(IREm, HIGH); // Enciendo el emisor IR
  delay(1);

  valorIRReEmitido = 1024 - analogRead(IRRe); // Leo el valor recogido por el receptor 
  // descomentar lo de la siguiente línea si usamos la 1ª parte. 
  // el 100 es para quitar "ruido" 
  if(/*valorIRReAmbiente + */ 100 < valorIRReEmitido)
     // el brillo de la LED varía de 0 a 255, el valor del receptor va de 0 a 1023 
     // lo escalamos con map(valor, desde, hasta, desde, hasta) 
     brillo = map(valorIRReEmitido, 0, 1024, 0, 255); 
  else
     brillo = 0;
  Serial.print("\tBrillo: ");
  Serial.print(brillo);
  analogWrite(LEDCerca, brillo); 
  
  Serial.print("\tIR Emision: ");
  Serial.println(valorIRReEmitido);
}

Este sería el resultado final:


Espero que os haya resultado entretenido. Un saludo: Roi