Pages: [1]   Go Down
Author Topic: CRONOGRAFO  (Read 1398 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola a tod@s y Feliz 2012!!!

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¿?

Un saludo y muchas gracias a tod@s
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,

¿Estás usando interrupciones?

Saludos!


Igor R.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Un saludo, gracias
« Last Edit: January 02, 2012, 08:38:56 am by djpiro » Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

7 milis me parece bastante tiempo, tienes el codigo y conexionado?
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

+1 algo raro hay.....

Pon el código, 2 ms son 500 Hz, que los mides sin problemas....
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bueno aqui dejo el codigo

Quote
#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;

}

Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,

De vistazo rápido:
- Las variables que se modifican dentro de una interrupción tienen que estar declaradas como volatile (http://en.wikipedia.org/wiki/Volatile_variable).
- 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....



Saludos


Igor R.
« Last Edit: January 02, 2012, 01:16:04 pm by Igor R » Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muchas gracias,lo probare el proximo finde ya que lo tengo en el pueblo.Ya os contare
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Djpiro a ver si me puedes hacer el favor de resubir el codigo con las modificaciones, y si has terminado el crono decir si esta bien o no.

gracias y saludos
Logged

Pages: [1]   Go Up
Jump to: