Noticias:

¡Bienvenido a la HispaLUG! - Asociación para aficionados a LEGO®

Menú Principal

Cronómetro con sensor de color

Iniciado por Jevhy, 04 de Noviembre de 2011, 17:59:42 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Jevhy

Hola!

Llevo unas semanas intentando crear un programa dedicado a una práctica de física.
La práctica consiste en cronometrar el periodo de un péndulo (tiempo que tarda en dar una oscilación completa), y mi intención es utilizar el sensor de luz y color para ello, ya que siempre será más exacto que darle a un cronómetro de forma manual.

La estructura la tengo montada, mi problema es el programa.
De momento, buscando información por aquí he conseguido, que el cronómetro aparezca en la pantalla, que se inicie cuando pase el péndulo por delante suya, y que se detenga cuando vuelva a pasar. Pero lo que necesito es:

1º - una vez activado, espere a que el péndulo pase para activarse el crono  [conseguido]
2º - En la segunda pasada, debe contabilizarse que ha pasado, pero de manera que no se detenga el crono [Problema, no sé cómo hacerlo]
3º - Tercera y última pasada por delante del sensor, que se detenga, obteniendo así el tiempo que tarda en dar una oscilación completa.

No sé si se entiende muy bien la idea, intentaré buscar algún dibujo que se muestre mejor.
Aún así espero que alguien pueda ayudarme  :)




nxtorm

Hola Jevhy, y por lo que veo, bienvenido.

Me parece un programa muy atractivo, pero sin ver más, me costará echarte una mano. Todo lo más que puedo hacer es intentar sacarlo este finde si tengo tiempo. Si el programa no es muy largo, podrías intentar sacar una foto para darle un vistazo.

¿qué sensor estás usando? Lo digo para intentar programarlo igual, ya que hay varios.
Y el mecanismo en cuestión, lo mismo, ¿podías adjuntar una foto? Es también para ver cómo se suelta ¿bola? ¿eje?

Según cómo pongas en marcha el mecanismo, podrías tener error, especialmente si es a mano. Ya nos dices, que aunque los programas con el icono "timer" a veces son un poco puñeteros, yo creo que sale.

Así que para complicarlo, haré una sugerencia: usando el Data Logger (si tienes el NXT 2.0) podías almacenar los tiempos hasta que el péndulo se pare y no solo de 3 pasadas. Eso daría muchos más datos para estudiarlo, reduciendo el error del inicio.

Espero que salga adelante, que me parece muy chulo.

Blastem

Una idea que se me ocurre a vuelapluma
Periodo T= 2 pasadas
Haz dos variables que cuenten el tiempo cada vez que pasa, de tal manera que cuente primero una mitad del recorrido y luego la segunda.
No tengo la interfaz de NXT pero en c es bastante sencillo de lograr.

Aparte, y como comenta NXT, si tienes opción de datalogging, será cuestión de analizar los datos que te dé en x oscilaciones. Los errores relativos y absolutos bajarán y los tiempos serán más fiables :)

Por curiosidad... ¿Este experimento lo haces como aplicación práctica a una ley física?

Saludos!

Jevhy

Buenas.

Lo primero gracias por responder tan rápido  :)
A ver, el tema es que como llevo poco tiempo pues a la hora de programar sé lo básico, y los bloques naranjas con variables, constantes, etc.. se me escapan aún, de hecho esa que nombrais no tengo ni idea de como funciona.

El programa lo hice tomando como referencia el programa de un cronómetro pero para un cubo de rubik, lo típico que terminas y paras el crono pulsando los sensores de contacto. Así que tomando ese de ejemplo, y cambiando los sensores de contacto por los de color llegué a esto:

https://picasaweb.google.com/lh/photo/iF-gFxzwjRF1YT04I-xjHQ?feat=directlink

El sensor que utilizo es el de color y luz que viene con el kit nxt 2.0 y el "péndulo" es una bola que yo me he hecho con un cordón para simularlo, pero luego será uno de verdad, al que le pondré pegatinas rojas para que lo detecte.

Tengo el resto de fotos aquí.

De momento lo que nos ha dicho el profesor es que iremos al laboratorio, a cronometrar los periodos, y entonces se me ocurrió hacer un programa para ello, mucho más preciso sin duda, ya que también le gusta el tema de la robótica y en principio es para ver la diferencia entre una oscilación pequeña, pudiendo considerar dicho movimiento un m.a.s (movimiento armónico simple) o por el contrario una oscilación grande, con la cual deja de tener las propiedades del anterior.

A su vez nos dió una fórmula: T = 2(pi) x (la raiz cuadrada de la longitud del péndulo entre la gravedad)

Como todos los datos se saben, tán sólo hay que medir la longitud, y como yo lo que consigo medir es un medio del periodo, lo multipliqué x2, dando un resultado similar a la fórmula, con un error de 4 centésimas. Lo cual me resultó bastante grato haberle encontrado una aplicación útil :)


Blastem

No me deja ver tus fotos...  :confundido:

En fin, ahora que sé el experimento al que te refieres, sería tan sencillo como adivinar cómo se logra hacer un contador con la interfaz de NXT, y que cada vez que ese contador sea par (una oscilación completa), te apunte el tiempo en una variable.
Siento no poder ayudarte más pero no tengo la interfaz, y supongo que aún no habréis dado c++ para poder usarlo con robotc.

Sea como fuere, es muy interesante que apliquéis los teoremas al mundo real con LEGO  :guino: Mi enhorabuena a tu profesor  :}


Jevhy

#5
No sé por qué no se ve.. =S

Vale, ahora sí:



No no, en principio la idea ha sido mia, no damos robotica en el instituto, ha sido que se lo comenté y lo vio bien para verlo de manera más precisa.  :)

Blastem

Sigo sin poder verla a un tamaño adecuado, la has enlazado con el mínimo de resolución  :-\
Intenta hacer público el álbum en que la cuelgas o vuélvela a insertar con mayor resolución, porfa  :}

nxtorm

#7
Hola Jevhy.

Pues he pasado un rato de lo más entretenido con esto. El siguiente programa me ha funcionado perfectamente y como no acabo de ver tampoco las imagenes tuyas, te lo adjunto. Como "péndulo" he usado un folio que acercaba y quitaba a una distancia de 3 o 4 cm. Te sugiero que intercales algún icono de sonido para ver cuándo el programa avanza y coger el tranquillo a las distancias respecto al sensor o te irá loco.

A ver si logro explicarme. El programa es el siguiente:



He usado ese icono raro de la máscara como resumen de lo siguiente:



Es decir, cuando en el programa de arriba veas el icono de la máscara escribes textualmente lo de abajo. Como se repite 3 veces lo he puesto así para que no quede muy largo. El programa sin duda se puede optimizar, pero creo que así queda clara la idea.

El primer Timer está configurado en "reset". Puedes intentar también variar el valor de "40" que figura en la segunda imagen a otros valores que se te adapten mejor a tus distancias del péndulo.

Lo que hace la parte de abajo (es decir, cada una de las máscaras) es esperar a que le llegue el rebote de la luz y luego volover a esperar a que no haya rebote de luz para seguir. Así cada paso del péndulo por delante del sensor, por eso se repite 3 veces.

Si necesitas alguna explicación adicional, avisas. Suerte.

PD. He modificado un poco la explicación respecto al mensaje original para mayor claridad (espero).

Jevhy

#8
Perdón por la foto, me equivoqué al subirla, creo que ahora si se puede ver grande.

Nxtorm

Muchas gracias por el programa, ahora mismo lo pruebo y te cuento. Pero una cosa, ahora que ya se ve, podríais explicarme qué es lo que falla del mio  :confundido:

Yo por ejemplo para que lo hiciese dos veces puse una variable de numero dentro unida al contador del búcle, y tambien probé a meter todo el bucle dentro de otro, que lo repitiese dos veces..

bueno, muchas gracias de nuevo, ahora informo.

Edito

Acabo de programarlo, y perdona mi inexperiencia nxtorm, pero no me aclaro mucho..

Me lio un poco porque aparecen varios valores que van cambiando continuamente a cada paso del crono, y del folio que también he probado.
El caso es que parece que funciona mejor alejando y acercando el folio que con las pasadas del péndulo.

Mi idea era, poder ver el inicio del crono correr en la pantalla, y ver como se paraba justo cuando termina la oscilación.

Le he hecho una pequeña modificación (espero que no te moleste :S) he suprimido el bloque de "a", y he puesto una división entre el segundo timer y "number to text", dividiendo entre 1000, para que me aperezca el número en segundos, para facilitar los posteriores cálculos.

Un saludos, y perdón por ser tan tiquismiquis..

nxtorm

#9
No hombre, no, tranquilo. Haz todas las modificaciones que te parezcan oportunas, que para eso es tuyo. Yo intento darte la base y luego ya lo dejas a tu gusto.

Bueno, vamos por partes que hay varias cosas. De entrada te digo que tu programa parece más intuitivo que el mio, así que usaré el icono de espera como tú. El sensor de color tiene 2 modos de trabajo: como sensor de color y como sensor de luz reflejada. Yo he usado la segunda opción. Creo que tal como lo usas tú (detectando el color rojo), evitarás mejor las interferencias de la luz ambiente. Así que doble motivo para usarlo. Quedaría así:


https://www.hispalug.com/galeria/albums/userpics/45155/pendulo_3.jpg

Lo de IN y OUT que ves se refiere a la configuración del icono: "Inside Range" y "Outside Range", siempre en la modalidad de "Sensor de Color". Por cierto, el programa solo visualiza el tiempo total, no aparece el crono en marcha en pantalla.

Cita de: Jevhy en 05 de Noviembre de 2011, 11:34:56 AM
he suprimido el bloque de "a"
Esto se me olvidó comentarlo. Suprime la "a" siempre y cuando actives la pestaña "clear" del display. En caso contrario, se solaparán los resultados en pantalla. Quizás el problema antes fuera ese. Te recomiendo la "a" mejor al "clear" porque si quieres ver varios valores a la vez en líneas diferentes (el tiempo total y el parcial por ejemplo), evitarás parpadeos de pantalla. Para que funcione correctamente la "a", DEBES escribir 3 o 4 espacios en blanco en la casilla B de su configuración.

Cita de: Jevhy en 05 de Noviembre de 2011, 11:34:56 AM
podríais explicarme qué es lo que falla del mio?
Por cierto, supongo que tu ciclo está configurado en "Outside Range". Siendo así, tu programa (creo) hace lo siguiente:

1. Espera a detectar rojo (paso de la bola)
2. Pone en marcha el crono.
3. Espera a dejar de ver rojo (el Outside Range del ciclo), es decir, espera a que la bola se marche.
4. En ese momento se para.

Por tanto lo que estás haciendo es... medir el tiempo que la bola está delante del sensor.

La secuencia que he usado en el programa que te propongo es:

1. Esperar a detectar rojo.
2. Esperar a que deje de detectar rojo. Es decir, en conjunto, esperamos a que toda la bola pase por delante del sensor.
3. Ponemos en marcha el crono.
4. Esperamos que vuelva a pasar 2 veces (repetir pasos 1 y 2 dos veces)
5. Paramos el crono.

No olvides que mientras la bola está delante del sensor, aunque sean pocos milisegundos, está detectando todo el rato el rojo. Por eso hay que alternar esos dos primeros pasos 1 y 2.

En fin, siento el rollo que he soltado, pero así ha salido. Ya nos cuentas. Espero haberme explicado algo, si no, ya sabes  :guino:

Jevhy

Para nada rollo, se agradecen las explicaciones tan detalladas, sobretodo cuando eres nuevo..

A ver voy por partes:

- He hecho el programa tal cual los has puesto, añadiendo la división entre 1000, para ver el tiempo en segundos. Y.. Funciona!!  :}

- Pero tengo unas dudas..  si yo lo dirijo con la mano, el péndulo, lo reconoce perfectamente y a la tercera pasada pone el tiempo. Pero probando y probando he visto que la primera vez cuenta tres pasadas, las segunda vez que lo hago ya cuenta 2 solamente.. puede ser? Esto, la verdad es solo por curiosidad para entender el funcionamiento del programa, porque con las primeras tres pasadas me vale de momento.

- Lo segundo, es que he dicho que yo lo dirijo, pero cuando le doy al péndulo y se mueve solo, es como si no lo detectase algunas veces pudiendo pasar hasta 4 o 5 veces y que no se pare el tiempo, esto por qué puede ser?? se supone que si es tan rápido y el rojo pasa por delante, debería detectarlo al momento no?  :confundido:

- Y lo último (que pesado.. ) es que sí que se solapan, creo que hay algo que no configuro bien porque a cada nuevo tiempo que aparece, se sobreescribe al anterior, he probado a que se vayan moviendo pero sin éxito.

Bueno, muchas gracias de nuevo por la ayuda y paciencia  :guino:

PD: Nxtorm, me he quedado muerto cuando he visto en tu firma tu página y al entrar.. resulta que es la página que tantas veces he visitado buscando ayuda para usar los bloques. Enhorabuena por ella, porque está genial y es de gran ayuda!

nxtorm

Bueno, empiezo por el final: muchas gracias por tus palabras. Y me alegro que la página te resulte útil.

Me alegro también de que haya funcionado, al menos en parte. A mi me funciona bien si paso el sensor sobre una superficie plana de color rojo y poca distancia y sin inclinarlo, es decir, completamente perpendicular a la superficie, pero de vez en cuando me pasa como a ti. Los sensores de luz son muy puñeteros para estas cosas. Especialmente si no es una superficie plana como es el caso. A mitad de la bola puede por una fracción de tiempo pequeña que mida una zona oscura e interprete que no es rojo y de ahí que cuente solo 2 veces. Podrían haber también interferencias de la luz ambiente, la televisión del saloncito...

O sea, que en principio está bien programado, pero quizás no sea ese el mejor sensor para esa aplicación. Para que puedas comprobar esto que te digo, puedes intentar medir la bola a distintas distancias y con distintos ángulos. Para ello, simplemente selecciona el icono del sensor de color (flecha roja), espera medio segundo y mira el resultado en la ventanita inferior izquierda (flecha negra):


https://www.hispalug.com/galeria/albums/userpics/45155/pendulo_4.jpg

Esto te puede dar alguna pista de lo que te contaba. Basta una lectura no esperada durante 1 milésima para que se pierda la secuencia del programa.

Como alternativas pueden haber muchas, es cuestión de que pruebes la que mejor se adapta. Te sugiero algunas:

- Probar con una bola de otro color. El rojo puede verse afectado por las luces de dentro de casa.
- Probar una superficie plana oscilante en lugar de una bola.
- Probar primer programa que te puse más arriba. Allí se usa el sensor en modo "luz reflejada". En el cuadro de configuración, verás un "compare" con una barra deslizante y unas pestañas a sus lados. Si pones ahí "40" y pulsas la pestaña de la derecha le estás diciendo: detecta cuando la luz recibida supere el valor de 40. Si pulsas la pestaña de la izquierda, le estás diciendo: detecta cuando la luz  recibida sea ínferior a 40. O sea, es más configurable que el icono de espera.
- Prueba a poner una pared de bricks blancos delante del sensor, de forma que la bola pase entre el sensor y esa pared. Lee los valores "en tiempo real" con y sin bola y programa en consecuencia con el programa que te propuse al principio (sensor en modo luz reflejada). Creo que esta es la opción que más me gusta y que mejor puede funcionar.
- Podrías incluso probar con el sensor de ultrasonidos a ver qué pasa.

Bueno, ya tienes un rato de pruebas. Pero si no me he explicado bien o no sacas el programa, me dices y mañana (si puedo) lo intento probar, no tengas problema en decirlo. Aunque lo más probable es que lo intente de todas formas. Suerte, a ver quién lo saca antes. :lengua:

Por cierto, para el solapamiento en pantalla, usa la "a" como te expliqué más arriba, poniendo 3 o 4 espacios en la "B" del panel de configuración y sin el "clear" activado en el display.

nxtorm

#12
Fue cerrar el ordenador anoche y caer en la siguiente posible solución, de lo más sencilla. Creo que puede ser la definitiva, incluso con bola:


https://www.hispalug.com/galeria/albums/userpics/45155/pendulo_5.jpg

La única condición para que el sensor de color funcione bien es que pase muy cerca de la bola. Solo tienes que ajustar los tiempos adecuadamente en los bloques de espera. Te lo explico.

El problema del anterior programa eran los segundos bloques de color, los que se programaban en "Outside Range", ya que el NXT podía interpretar mal algún punto más oscuro (o más claro) de la bola y pensar que no era rojo. Quedaba por tanto "fuera del rango" erróneamente y el programa avanzaba cuando, en realidad, la bola aun no se había ido. La idea de este programa es eliminar ese icono problemático.

Cuando la bola pasa por delante del sensor, seguro que en algún punto de la superficie detecta "rojo", sea donde sea. En ese momento, esperarmos 2 o 3 décimas de segundo a que la bola se vaya. No hace falta detectarlo, simplemente esperamos. Así contará las pasadas de la bola correctamente.

He adjuntado también la configuración del bloque "a". Verás ahí los espacios en blanco en la línea "B" y el bloque "display", sin el "clear" activado. De esta forma no deberían solaparse los datos en pantalla. A ver si este es el definitivo.

Jevhy

Increíble!  :P

Ahora funciona genial nxtorm. Muchas gracias por tu ayuda!!

Lo único que no termino de saber configurar lo de "a". Lo coloco en el mismo lugar que tu, con 4 espacios en la casilla B, y sin el clear activado en el display, y aun así se siguen solapando los tiempos.

PD: Tenías razón, cuanto más cerca del sensor y más perpendicular pase por delante de él mejor funciona.

nxtorm

#14
Biennnn!

Para lo del icono "a", lo primero asegurate de las conexiones de los cables del programa y que no hayas cruzado la entrada A con la B. En el icono "a", mete sin problemas 6 o 7 espacios en la B. Seguro que así no se solapa. El icono "display" tiene 15 dígitos por línea´, así que vas sobrado.

Lo que hace el icono "a" es escribir en una única línea de la pantalla del NXT los textos de A+B+C. En tu caso, la A es la información que llega del timer, por ejemplo 2.34. A eso le añadirá por detrás 6 espacios, borrando así lo que hubiera antes en esa línea. Podrías incluso poner en la B la expresión "s" (de segundos) para que quede mejor y los 7 espacios en la C. Quedaría: "2.34s     ". Espero que te funcione.

Por curiosidad, al final ¿cómo lo has hecho, con sensor de color o de luz reflejada?

PD.: muy bueno tu blog y muy prometedor. Cuantos más proyectos originales metas, más interés despertará. Muchos ánimos (y paciencia). Suerte.