Go Down

Topic: Calcular el tiempo que tarda en caer una bola (Read 336 times) previous topic - next topic

iamjandrolopez

Hola, gracias a todos.
Estoy preparando una especie de clase práctica para mis chavales de física y quería demostrarles las leyes gravitatorias.

He cogido una tubería estrecha, a la que he acoplado un motor a pasos que mueve una compuerta que deja caer una pelota. La tuberia la he puesto vertical. Justo en la parte baja he puesto tanto un emisor láser como un receptor de luz de forma que detecta el momento en el que cae.

Sin embargo, no sé como puedo calcular el tiempo desde que se abre la compuerta de arriba hasta que la bola pasa por el láser.

¿Alguien podría echarme una mano? Muchas gracias!

surbyte

Ve a Documentación => Indice de temas tutoriales => millis()

millis() es tu solución.

Kike_GL

Depende del largo del tubo quizas mejor usas la funcion micros() que devuelve la cantidad de microsegundos desde que la placa Arduino comenzó a ejecutar el programa actual.

Este número se desbordará (volverá a cero), después de aproximadamente 70 minutos, pero en tu caso no importa porque solo tienes que restar llegada - salida.

En las placas Arduino de 16 MHz, esta función tiene una resolución de cuatro microsegundos (es decir, el valor devuelto siempre es un múltiplo de cuatro), pero es lo mejor que hay.

La idea es que al intante de accionar el pin de soltar bola guardes es una variable el valor de micros() y luego al llegar haces lo mismo en otra variable y luego restas ambas para saber el tiempo en microsegundos del evento.

Saludos, Kike_GL
Saludos, Kike_GL

surbyte

Quote
Este número se desbordará (volverá a cero), después de aproximadamente 70 minutos, pero en tu caso no importa porque solo tienes que restar llegada - salida.
Si se trata de una tubería de digamos 1 mt o algo mas, dime de qué modo se puede desbordar micros()?

Entiendo @Kike_GL lo que quisiste explicarle pero el desbordamiento no se aplicará jamás en una medición de ese tipo.

Kike_GL

Entiendo @Kike_GL lo que quisiste explicarle pero el desbordamiento no se aplicará jamás en una medición de ese tipo.
Cada 70 minutos la función micros() te volverá a dar un valor de 0. De modo que si el evento empieza unos microsegundos antes de que esto ocurra el tiempo calculado sera negativo.

Fuente: Reference > Language > Functions > Time > Micros

Saludos, Kike_GL
Saludos, Kike_GL

surbyte

Ahora entiendo lo que quisiste decir @Kike_GL y yo lo malentendí. Tienes razón

Lucario448

Este número se desbordará (volverá a cero), después de aproximadamente 70 minutos
O lo podemos evitar reiniciando manualmente los contadores. Suena inusual, pero es posible; al menos yo sé hacerlo en micros AVR...

surbyte

De todos modos ya habíamos debatido el tema con millis() que no era motivo de preocupación la situación de desbordamiento. Las cuentas siguen resultando correctas aun cuando un lectura este sobre el máximo de los 32 bits y la otra recién comenzando.

Este es el ejemplo que en su momento dió @noter
Duda millis()

Code: [Select]
unsigned long a=0xfffffff0;
unsigned long b=0xf;
unsigned long c=b-a;
Serial.println(c,HEX);


imaginen una situación alrededor de los 70 min y verán que las cuentas son correctas.

toysuperxoto

Yo personalmente usaría 2 láser, uno arriba y otro abajo, desde que inicia el movimiento hasta que la bolsa cae puede pasar algo de tiempo.

surbyte

Quote
La tuberia la he puesto vertical. Justo en la parte baja he puesto tanto un emisor láser como un receptor de luz de forma que detecta el momento en el que cae
no entiendo tu comentario @toysuperxoto? Solo repites lo que dice el autor del hilo.

Go Up