Es mi primer post desde que empece con arduino, hasta ahora no habia tenido necesidad de abrir ninguno ya que mis proyectos eran de bajo nivel y todas mis dudas se resolvieron leyendo otros post pero he llegado a un punto que no encuentro nada relacionado con mi problema o no lo he sabido buscar.
Os comento:
Mi intencion es desarrollar un cronografo(para medir velocidad de una pistola de paintball)este medidor me tiene que dar lecturas de hasta 100m/s >>>300FPS.
Por el momento he desarrollado un codigo muy basico, 2 entradas digitales conectadas a 2 barreras laser que detectan el paso del proyectil(en este caso bola de pintura)al detectar el primer sensor asigno a una valiable el valor de Milis, al detectar el paso por el segundo sensor asigno a otra valiable el valor de Milis,hago la diferencia entre ellos con lo que obtengo el valor del tiempo total entre los 2 sensores, el problema me viene que el valor mas bajo de tiempo que puedo obtener es de 7milis y con la distancia que tengo actualmente entre los sensores 200mm me da una velocidad maxima de 30m/s.
Alguien tiene alguna idea de como disminuir el tiempo de procesamiento entre las 2 señales para evitar tener que ampliar la distancia entre sensores¿?
Hice un primer codigo sin interrupciones que me daba un tiempo minimo entre sensores de 20milis, luego con el uso de una interrupcion baje este tiempo a 7Milis pero lo tengo que bajar aun hasta 2milis...Esta tarde subo el codigo que tengo cargado actualmente
#include <LiquidCrystal.h>
long time1=0; //Variable de tiempo para el inicio.
long time2=0; //Variable de tiempo para el final.
LiquidCrystal lcd(12, 11, 5, 4, 13, 10);
float distancia=200;//valor distancia entre sensores en mm
int c1=2;//pin celula1
int c2=3;//pin celula2
int led1=8;//led celula 1 encendido si no detecta
int led2=9;//led celula 2 encendido si no detecta
float velocidad=0.0000;//velocidad en mm/ms-->m/s
float tiempo=0;
float FPS=0;
boolean f1=true;
void setup() {
pinMode(c1,INPUT);
pinMode(c2,INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
Serial.begin(9600);
//attachInterrupt(0, ss1, FALLING);
attachInterrupt(1, ss2, FALLING);
lcd.begin(16, 2);
lcd.print("---Cronografo---");
lcd.setCursor(0, 1);
lcd.print("------PIRO------");
}
void loop() {
if (digitalRead(c1)==LOW && f1==true){
time1 = millis(); //comprueba el tiempo al activar c1
f1=false;
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
}
}
void ss2() {
Serial.println("celula 2");
time2 = millis(); //comprueba el tiempo al activar c2
tiempo=time2-time1;
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
velocidad=distancia/tiempo;
FPS=velocidad/0.304;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("VELOCIDAD en FPS");
lcd.setCursor(0, 1);
lcd.print(velocidad);
f1=true;
}
Las rutinas que se ejecutan dentro, tienes que intentar que sean lo más pequeñas posibles.
Podrías usar las dos entradas de interrupción que tiene Arduino (tiene pinta que lo intentaste asi por la linea comentada). Lo digo, porque digitalRead es lento.
Si esperas tiempos pequeños, puedes usar micros() para tener más precisión.
Yo cambiaría que velocidad=(float)distancia/(float)tiempo;
El Serial.println("celula 2"); antes de recoger el tiempo, te está metiendo mucho retraso, ya que se queda esperando hasta que termina de mandar dicha cadena a 9600 bps (8 +2 (CR+LF) bytes a 960 bytes/s). Sólo esa linea antes de recoger tiempo, te mete un error considerable....
Porque respondes un hilo que desde 13-02-2013, 19:33:53 no tiene movimientos? Y ademas no usas etiquetas para el codigo. Lee las normas del foro y no vuelvas a hacerlo. Hilo cerrado