domingo, 16 de diciembre de 2012

Arduino: medidor de velocidad




El objetivo del siguiente montaje es medir la velocidad de un balín disparado por una carabina sin tener contacto con la bala. Este circuito es de muy fácil realización y programación.

Material necesario:

  • 2xR 330ohm
  • 2xR 1kohm
  • 2xLED
  • 2xLDR

El montaje es el siguiente:



Los leds y los ldr están enfrentados en parejas.
Los rectángulos blancos son de depron, para hacer que los ldr dependan únicamente de la luz que le llega del led.
El led verde no es necesario.

Principio de funcionamiento:

  1. Antes de pasar la bala la resistencia del ldr es baja (le llega luz de led)
  2. Cuando la bala está pasando por ldr1 saca por el puerto el tiempo que lleva el arduino corriendo el programa.
  3. [En este caso mientras pasa la bala por ldr1 toma 5 medidas]. Primera parte horizontal de la gráfica.
  4. Cuando termina de pasar por el ldr1 se produce un gran incremento de tiempo (comparado con el incremento de tiempo entre las 5 primeras medidas. Vértical en la gráfica.
  5. Cuando comienza a pasar por ldr2 se ha producido el gran incremento de tiempo. [En este caso la bala impacta contra ldr2 quedando aislado de la luz y por tanto enviando indefinidamente micros()]. Segunda parte horizontal de la gráfica.

Pasos a seguir:

  1. Disparamos
  2. Copiamos los datos de consola y pegamos en Excel.
  3. Hacemos las columnas A y B
  4. Calculamos el intervalo de salida de ldr1 y entrada a ldr2 (Δt). [en este caso 1736-680=1056]
  5. Medimos la distancia entre los 2 ldr (Δe). [en este caso 7cm]
  6. v=Δe/Δt
Columna A: tiempo que lleva el arduino corriendo el programa
Columna B: incremento de tiempo entre cada fila de la columna A

CÓDIGO:

int LDR1=0;
int LDR2=0;
int ledpin=13; //solo se enciende cuando pasa la bala, no es necesario
void setup()
{
  pinMode(13,OUTPUT);
  Serial.begin(9600);
}
void loop()
//Los valores de 560 y 870 dependen del ldr utilizado y
//de la luz que le llega. Por tanto se debe ajustar antes
//del primer disparo.
{
  LDR1=analogRead(A0);
  if(LDR1>=560) //ajustar
  {
    digitalWrite(ledpin,HIGH);
    Serial.println(micros());//este es el tiempo 1
  }
  else
  {
    digitalWrite(ledpin,LOW);
  }
  LDR2=analogRead(A1);
  if(LDR2>=870) //ajustar
  {
    digitalWrite(ledpin,HIGH);
    Serial.println(micros());//este es el tiempo 2
  }
  else
  {
    digitalWrite(ledpin,LOW);
  }
}

CÓDIGO DEL CIRCUITO DE AJUSTE LDR1 Y LDR2:

Se deben ajustar unos 5 puntos más del valor LDR1 Y LDR2 que salga aquí, es decir si aquí sale LDR1=800 pondremos if(LDR1>=805)...


int LDR1;
int LDR2;
void setup()
{
  Serial.begin(9600);
}
void loop()
{
  LDR1=analogRead(A0);
  LDR2=analogRead(A1);
  Serial.print(LDR1);
  Serial.print(",");
  Serial.println(LDR2);
  delay(1000);
}