Noticias:

¿Has Leído las Normas de HispaLUG? LEER AHORA

Menú Principal

Programa cronómetro

Iniciado por javinxt, 28 de Marzo de 2010, 10:17:18 AM

Tema anterior - Siguiente tema

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

javinxt

Hola,

he aprendido a hacer el cubo de rubik y tengo un NXT 2.0 y me gustaría hacer un cronómetro que funcione de la siguiente forma:
1. Pones las manos encima de los sensores de tacto
2. Cuando las quitas quiero que empiece a correr el cronómetro
3. Cuando le vuelves a dar quiero que el tiempo salga en la pantalla.


¿Cómo haríais el programa?

Legotron

Hola, ya que eres nuevo sería recomendable que te presentases en la sección de bienvenidas del foro para que todo el mundo te conozca y sepa con quien está hablando.

Un saludo y que disfrutes del foro.


60.000 bricks y subiendo...

Jetro

Hola javinxt - supongo que quieras programar en NXT-G

Ya has hecho un buen comienzo del programa escribiendo lo que quieres que haga, pero tienes que detallarlo un poquito más, hasta que cada línea contenga solamente una acción y con más información.

1. tienen que ser los dos sensores o solamente uno?

2. ¿Qué quieres mostrar en la pantalla? El tiempo trascurrido, pero ¿con qué exactitud? En NXT-G tienes un bloque 'timer' (está entre los bloques sensor) que te dará un valor en milisegundos. Para poder usarlo correctamente tendrás que resetearlo (poner el contador en cero)

3. Ahora toca mostrar el valor del contador (que después de ponerlo en cero se pone en marcha solo) en la pantalla

4. Finalmente hay que interrumpir el contador y quedarse con la última lectura en el momento que vuelves a tocar el/los sensor(es) de contacto.

De momento no te daré más pistas. Empieza a hacer tu lista de acciones paso a paso y con ella en la mano intenta hacer el programa en NXT-G. Cuando te encuentres con el siguiente obstáculo... avisa ;)

javinxt

Lista:

1. El temporizador se resetea
2. Pongo las manos encima de los DOS sensores
3. Cuando las quito el temporizador empieza a correr poniendo el  tiempo en la pantalla (cosa que no sé cómo hacer)
4. Cuando vuelvo a presionar los sensores el tiempo se para.
5. Cuando le doy al botón del NXT se quita el tiempo y se empieza otra vez

No sé si me he explicado bien pero eso es lo que quiero

Jetro

Cita de: javinxt en 29 de Marzo de 2010, 13:09:04 PM
Lista:

1. El temporizador se resetea
2. Pongo las manos encima de los DOS sensores
3. Cuando las quito el temporizador empieza a correr
3a inicia un bucleque finaliza si se cumple una condición (true/false)
3b Convierte el valor que muestra el temporizador en texto (no puedes poner números tal cual en la pantalla)
3c Borra la pantalla y coloca el 'texto' en la pantalla
3d comprueba si la condición es verdadera (ambos sensores están apretadas
3e si la condición es falsa repite el bucle, de lo contrario sal del bucle
Citar
4. Cuando vuelvo a presionar los sensores el tiempo se para.
5. Cuando le doy al botón del NXT se quita el tiempo y se empieza otra vez
y se para el programa
6 Vuelves a darle al botón naranja y se reinicia el programa

Ahora manos a la obra. Empieza tu programa y cuando tengas dudas saca un pantallazo de lo que tienes ya (Tols > Save Screenshot) y pregunta en este mismo hilo.

javinxt

Bueno, he hecho lo que he podido y sorprendentemente va todo bien hasta el final, cuando se tiene que parar.

Ya sé que lo del principio no está muy bien hecho pero era la única forma que he encontrado para que empezaran a la primera.

Otra duda: ¿Cómo hago para que en la pantalla salga el número con los segundos bien diferenciados? Es que sale un número pero normal. Ej: 4683 donde cuatro son los segundos

Jetro

Un buen comienzo. Casi nunca las cosas salen perfectas a la primera, pero lo importante es intentarlo y aprender de los errores ... y de los aciertos.

Al inicio efectivamente haces algo extraño, porque el programa solamente responde a uno de los dos sensores de contacto - al conectado al puerto 1. El del 2 como si no estuviera.. ¿Realmente necesitas que se toquen ambos sensores para iniciar y parar. Salvo que haya una razón de peso parece un poco redundante usar dos sensores para una tarea que solamente requiere uno.

Luego el programa no para... ¿Te has dado cuenta de que la variable que usas para determinar si hay que salir del bucle nunca es modificada? Solamente la lees, pero no escribes en ella.

Lo que necesitas conseguir es algo así:

¿Está pulsado el sensor 1? Si es así la primera condición es correcta
¿Está pulsado el sensor 2? Si es así la segunda condición es correcta
¿Son correctas tanto la primera como la segunda condición? En ese caso se interrumpe el bucle.

Repito, en este momento parece completamente redundante usar 2 sensores de contacto... salvo que tengas una razón de peso para querer usar ambos...

javinxt

He puesto lo que me has dicho con solo un sensor pero aún no sé cómo hacer para que se pare y para poner los segundos bien diferenciados.



Jetro

Vayamos por partes.

- Si solo usas un sensor (y si usas dos también) no te hacen falta dos vigas. Ahora el cronómetro empezará tan pronto lo pongas el programa en marcha y eso tampoco es lo que quieres.

- Con un solo sensor de contacto puede usar un bucle que finaliza al detectar el sensor de contacto directamente (en vez de un bucle lógico)

- Para saber qué tienes que hacer con el formato del cronómetro piensa en lo que ves (y descríbelo) y lo que quisieras ver (y describe la diferencia).

javinxt

#9
Bueno, tengo otro problema, ahora lo hace bien a veces pero otras sale un 1 en la pantalla y no sé que hacer  ???

El otro es que ya sé lo que hay que hacer con el tiempo: dividirlo entre 1000 y sé que es con el bloque MATH pero no sé cómo conectarlo.

Jetro

Veo que vas aprendiendo...

Uno de los problemas que pueden surgir es que  como el NXT procesa el programa a una velocidad muy alta (desde el punto de vista humana) que si programas el inicio con un toque de sensor y el final con el mismo tipo de toque del mismo sensor... inicio y final se pueden leer casi seguidos. Es decir, que si no tienes cuidado al iniciar el programa lo terminas también. Para evitar esto puedes usar diferentes comportamientos del sensor. Por ejemplo. Para empezar puedes usar 'bump' (tocar y soltar el sensor de contacto) y para parar solo touch (pulsar).

Para dividir el resultado del temporizador entre 1000, el primer número que necesitas es el del temporizador por lo que tienes que conectar la salida del temporizador a la entrada A del bloque Math. Luego en el panel de configuración de ese bloque verás que el primer campo está inaccesible (eso ya lo determina el bloque temporizador) y pones 1000 en el segundo. Finalmente tienes que elegir la operación - "division"

javinxt

#11
He hecho un cambio radical al programa fijándome en el del MORPH y está todo solucionado menos una cosa: el cronómetro empieza cuando le doy al botón del NXT y no cuando presiono el sensor de contacto.


Jetro

Si pones cosas en vigas diferentes estas cosas sucederán a la vez y salvo en el caso de escribir una variable en una viga y leerla en otra, lo que se hace en una viga no influye en otra. Es por ello que como en la viga central lo primero que haces es poner el temporizador en 0 efectivamente nada más iniciar el programa el cronómetro empieza a funcionar.

Asimismo sucede algo extraño con las vigas superior e inferior: cada una hace exactamente lo mismo que la otra! O sea, una de las dos es redundante.

Pero puedes prescindir de ambas ya que si en vez de usar un bucle infinito usas un bucle que termina por la acción de un sensor (el de contacto conectado al puerto 1 en tu caso) consigues el mismo efecto de manera mucho más sencilla.

También querías que el programa terminara al pulsar el botón naranja del NXT, pero la única manera de terminar tu programa es interrumpirlo con el botón gris ya que no hay manera de salir de ese bucle.

Tengo preparado un sencillo programa que hace exactamente lo que tú querías (con 1 sensor de contacto). Pero te voy a dar un poco más de tiempo para que pienses como mejorar el que ya tienes (o reescribirlo desde 0) - probando se aprende mucho ;)

javinxt

Yo ya no sé que más hacer, lo de antes ha sido lo más cercano a lo que yo quiero. Envíame el programa y te pregunto las dudas que tenga ¿ok?

Jetro

Te adjunto un pantallazo más el programa comprimido.