17 feb 2012

Tec4º. Arduino. Sensores LDR

Uso de Sensores LDR

 

El ejemplo más sencillo pasa por utilizar 2 LDR situados en los laterales del robot para permitirle detectar niveles de iluminacióin y por tanto programarlo para que evite objetos, por ejemplo.

Construiremos, sobre una pequeña placa perforada-estañada, unos conectores para que los valores de variación de la resistencias se envíe a 2 de las entradas analógicas de Arduino y los motores actuen en consecuencia.
Veamos el circuito de las LDR:
 

Ahora como queda en la placa:


Por fin el robot completo:
 

El código del programa:
Suponemos que vamos a usar 2 motores DC conectados a M3 y M4 (ver comentarios en código) y uso de motores

#include "AFMotor.h"
// La librería AFMotor.h para control de motores
//***************EL MOTOR IZQ(mirando desde encima al robot, va al revés por su colocación)************************
AF_DCMotor motor3(3, MOTOR12_1KHZ); // crea motor #1, 64KHz pwm MAYOR FRECUENCIA MÁS PRECISIÖN -> Más CONSUMO
AF_DCMotor motor4(4, MOTOR12_1KHZ); // crea motor #2, 64KHz pwm
int LDR_D = 0;   // LDR derecho (vista superior desde atrás);analog pin 0
int LDR_I = 1;   // LDR izquierdo ;analog pin 1
int LDR_D_val = 0;  // variables para leer el valor del LDR 
int LDR_I_val = 0; 

void setup() {
  Serial.begin(9600);      // Para imprimir mensajes por pantalla (monitor serie)
  // PONEMOS LAS VELOCIDADES
  motor3.setSpeed(100);     // velocidad de 0-255
  motor4.setSpeed(100);
}
void loop() {
  LDR_D_val = analogRead(LDR_D);
  LDR_I_val = analogRead(LDR_I);  
//Calibramos los LDR para ver los valores que devuelven, en este caso, el izquierdo devuelve un valor un poco menor por eso se suman 8ç
  Serial.print("LDRDerecha = ");
  Serial.println(LDR_D_val);
  Serial.print("LDRIzquierda = ");
  Serial.println(LDR_I_val+8);
   // Compara los valores devueltos por las LDR y produce el cambio de dirección de los motores
   if (LDR_D_val > LDR_I_val+8) 
    {
      Serial.println("D>I");
        motor3.run(BACKWARD); // tuerce derecha  
        motor4.run(RELEASE);
        delay(100);
    } 
    else if (LDR_D_val < LDR_I_val+8) 
    {
      Serial.println("I>D");
         motor3.run(RELEASE);
         motor4.run(FORWARD); // tuerce izquierda
         delay(100);      
    }
    else if (LDR_D_val == LDR_I_val) 
    {
      Serial.println("D=I");
         motor3.run(BACKWARD);  // centro
         motor4.run(FORWARD);
        delay(100);
       }
 motor3.run(RELEASE);
 motor4.run(RELEASE);
}