Medir velocidad entre 2 sensores infrarrojos

Hola, espero puedan ayudarme. Estoy haciendo un proyecto en el cual necesito saber el tiempo que tarda un objeto en pasar de un sensor a otro en un plano inclinado, el problema es que no se como programar el temporizador para que el programa detecte el tiempo entre esos 2 sensores. Estoy utilizando la librería timer one, el temporizador si empieza a correr al abrir el Monitor Serie pero no muestra los tiempos en el cual los sensores se activan. Este es el programa.


#include <TimerOne.h> 
int sensor1=6;
int sensor2=7;
int t1=0;
int t2=0;
int t12=0;
int valor=0;
volatile long int time=0;

void setup() {
  Serial.begin(9600);
  pinMode(sensor1,INPUT);
  pinMode(sensor2,INPUT);
  Timer1.initialize(1000000);
  Timer1.attachInterrupt(Temporizador);
  
  // put your setup code here, to run once:
}

void loop() {
  //digitalRead(sensor1);
  //digitalRead(sensor2);
  
  // put your main code here, to run repeatedly:
}

void Temporizador(void) {
  valor=digitalRead (sensor1);
  time++;
  if (valor==LOW); {
    t1=time;
    Serial.print("\nT1: ");
    Serial.print(time);
  }
  valor=digitalRead(sensor2);
    if (valor=LOW); {
      time;
      t2=time;
      Serial.print("\nT2: ");
      Serial.print(time);
      }
    
  t12=t2-t1;
  Serial.print("\nTiempo total: ");
  Serial.print(t12);
 
}

Hola

  1. Al publicar códigos aquí en el foro, las reglas indican que el código debe colocarse
    entre etiquetas </>.
    Vuelva a hacer su publicación inicial e incluya el código en etiquetas </>.

  2. No ha informado qué tipo de sensor está utilizando, no ha informado qué
    microcontrolador está utilizando, ni ha publicado un esquema que muestre cómo
    están conectados.
    Por favor hacer esto.

  3. Rehizo su código;
    Modifiqué los pines de entrada y el proceso de medición del tiempo.

    Vea si satisface sus necesidades.

RV mineirin

int sensor1 = 2;
int sensor2 = 3;
float tempo = 0;
bool flag_inicio = false;
bool flag_fim = false;
//---------------------------------------------------------------------------
void setup() {
  Serial.begin(9600);
  pinMode(sensor1, INPUT_PULLUP);
  pinMode(sensor2, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(sensor1), inicio, RISING);      // Habilita interrup
  attachInterrupt(digitalPinToInterrupt(sensor2), fim, RISING);         // Habilita interrup
  // attachInterrupt(digitalPinToInterrupt(sensor1), inicio, FALLING);  // Habilita interrup
  // attachInterrupt(digitalPinToInterrupt(sensor2), fim, FALLING);     // Habilita interrup
}
//---------------------------------------------------------------------------
void loop() {
  if (flag_fim == true)
  {
    flag_fim = false;
    Serial.print("Tiempo total: ");
    Serial.print(tempo / 1000,4);
    Serial.println(" Seg.");
  }
}
//---------------------------------------------------------------------------
void inicio() {
  tempo = millis();
  flag_inicio = true;
}
//---------------------------------------------------------------------------
void fim() {
  if (flag_inicio == true)
  {
    tempo = millis() - tempo;
    flag_fim = true;
    flag_inicio = false;
  }
}

Hola, estoy utilizando Arduino uno y dos sensores infrarrojos, ya probé tu programa pero no me funcionó.
Sobre un riel tengo 2 sensores infrarrojos colocados a cierta distancia uno del otro, este riel se encuentra inclinado para que pueda deslizarse una canica sobre el, y al bajar la canica sea detectada por los 2 sensores y así poder medir su velocidad, el problema es que no se como medir el tiempo en el que la canica pasa de un sensor a otro. Con el código que subí al inicio el tiempo si empieza a avanzar pero no almacena el tiempo transcurrido en el momento que el sensor infrarrojo se activa, simplemente sigue avanzando el tiempo.
Espero me hayas entendido mejor y puedas ayudarme, gracias.

Primer problema: No puedes desde una interrupción enviar datos por Serial. Las rutinas de interrupción deben ser cortas y rápidas.

Segundo problema:

Timer1.initialize(1000000);

está seteando el timer para que genere 1 interrupción por segundo. Tu canica cae mucho más rápido que eso, nunca detecta su paso por ambos sensores, a lo sumo y de pura casualidad va a detectar uno.

Entonces, las salidas a consola debes hacerlas en el loop() y debes setear el timer a un valor muchísimo más bajo para aumentar la frecuencia de las interrupciones.

Te sugiero que hagas una búsqueda porque un problema muy parecido se planteó aquí hace no mucho tiempo.

Saludos

Que debo de utilizar en lugar de serial? Me podrías ayudar poniendo las observaciones en el código que subí por favor? Realmente no se mucho de Arduino.

No debes usar serial en la interrupción lo tienes que hacer en loop() entonces usas una variable que te diga que hay datos para mostrar.
En loop() verificas la variable y si corresponde entonces sí lo envías a la consola.

Ahora bien, de la forma en que lo has encarado no parece ser la más efectiva.
¿Qué ocurre si la bola pasa por el primer sensor justo entre interrupciones? No la detectas.
Lo mismo puede pasar con el segundo, con igual resultado.

Una forma de resolverlo (pero sin usar interrupciones) podría ser

int sensor1 = 6;
int sensor2 = 7;

unsigned long t1 = 0;
unsigned long t2 = 0;
unsigned long t12 = 0;

void setup() {
  Serial.begin(9600);
  pinMode(sensor1,INPUT);
  pinMode(sensor2,INPUT);
}

void loop() {
  while(digitalRead(sensor1) == HIGH); // espera que pase por el 1er sensor
  t1 = micros();  // guarda el tiempo en useg
  while(digitalRead(sensor2) == HIGH); // espera hasta que pase por el 2do sensor
  t2 = micros();
  Serial.print("\nT1: ");
  Serial.print(t1);
  Serial.print("\nT2: ");
  Serial.print(t2);
  t12 = t2 - t1;
  Serial.print("\nTiempo total: ");
  Serial.print(t12);
  Serial.print(" useg");
}

Es solo a modo de prueba, fijate si hace lo que quieres

Saludos

1 Like

Ya lo probé y si me funcionó, muchas gracias! :smiley: