domingo, 10 de mayo de 2009

Máquina anti-aérea (programa)

En la entrada anterior puse las instrucciones de montaje parauna máquina antiaérea, pues bien, aquí dejo dos programas, manual y automático, para que probéis en vuestros robots:

1º)Manual:
http://www.megaupload.com/?d=29M1F97O

Bien, pues empecemos, este programa está compuesto por tres ramas, cada una de ellas activará un motor, así que vamos con la primera:

---Esta rama controlará el movimiento del motor A, que es el que hacer rotar nuestra base, se subdivide en dos bifurcaciones, que sólo se activarán si se pulsan los sensores de contacto, el del puerto 1 para girar a la derecha y el del puerto 2 para girar a la izquierda.
Si os dáis cuanta, todo esto está dentro de un bucle, que lo repetirá en "busca" de que alguien pulse los sensores, entonces moverá el motor hasta que se deje de pulsar el botón, y lo parará.

---La segunda rama controla el disparo, cuando el botón intro se pulse por primera vez tirará fuerte hacia atrás, activando los disparadores, y cuando se pulse por segunda vez, irá despacio hacia delante para que lo paremos cuando ya no pueda girar más.

---La tercera rama controla el motor B, encargado de subir o bajar el ángulo del motor C, que es el que dispara. Funciona igual que la primera rama, solo que con los botones derecho e izquierdo del ladrillo y con la diferenca de activar el motor B en lugar del A.

Finalmente, solo queda comentar que los motores A y B se mueven con mucha potencia, debido a que el uso de tornillos sin fin baja las revoluciones de salida en unas 150 veces en el A y en unas 100 en el B.

2º)Automático
http://www.megaupload.com/?d=IBJWQFCB
Bien, empezamos con el difícil, el automático.
Este programa está hecho para la versión tiragomas, ya que la otra es más difícil de conseguir.
Comienza con dos ramas, la primera es un simple visor de la distancia detectada por el sensor ultrasónico en la pantalla, la segunda ya es la que tiene el grueso:
Lo primero es poner algunas variables con sus valores iniciales.

Comenzamos con un primer bucle que será el encargado de decidir la distancia máxima para disparar, esto está aquí porque no siempre se usará el robot en el mismo sitio, y así podremos
ajustar la distancia al gusto.
El bucle comienza mostrando las instrucciones en pantalla, con tres visores, y después está el selector de distancia, que sólo se activará si pulsamos el sensor de contacto, una vez hecho esto, leerá la variable "ultrasonic_cm" y le sumará 10, hasta un máximo de 150, cuando volverá a ser 10, que es el valor inicial. Este valor será la distancia máxima a la que disparará el robot, es decir, que cualquier objeto por encima de esa distancia no será detectado.
Finalmente, dentro del bucle, iremos mostrando continuamente el valor de "ultrasonic_cm" en pantalla.

Después del bucle, sonará un sonido, indicando que el robot va a empezar sus maniobras, y después no encontramos de nuevo con dos ramas:

  1. La rama baja moverá nuestro robot, hacia la izquierda e ilimitadamente, hata que la variable "Disparando" sea verdadera, en cuyo caso deberá pararse, para no desviar el disparo. Volverá a moverse al transformarse en falsa.
  2. La segunda rama será la encargada de disparar. Empieza poniendo a 0 variables que se usarán dentro de esta rama, y después comienza un bucle. Dentro del bucle hay una gran bifurcación. Esta no tiene acciones en la parte falsa, y la parte verdadera solo se cumplira cuando los cm del ultrasónico sean menores a los ajustados en la variable "ultrasonic_cm". Una vez sea esto cierto, lo primero que encontramos es una espera de 4 segundos. Esto es para dejar que el motor A siga girando hasta tener centrado el objetivo. Una vez hecho esto, la variable "disparando" se hace verdadera, con lo que la base deja de girar. Una vez quieta, Guardaremos los grados de inicio del sensor de rotación del motor B en una variable, pues luego los necesitaremos. Hecho esto, los motores B y C comenzarán a girar, disparando y aumentando el ángulo a la vez, esto hará que disparen de dos a tres gomas en distintos ángulos. Una vez que el senso r de rotación del B sea mayor que 600 grados, los motores se pararán, y el motor B retrocederá los grados previamente recorridos. Una vez hecho esto, sed leerá la variable "reload" que es la encargado de ver si hace falta recargar la munición, esto sólo se hará cuando hayamos disparado tres veces, por lo que comienzo explicando la rama veradadera de la bifurcación que sigue a la variable: Debido a que la variable sería veradera cuando debe ser falsa, hay un cambio de lógica al inicio de la bifurcación, así que la parte verdadera en realidad sería la falsa. En esta parte verdadera, El motor A se moverá hasta que no se detecte ningún obstáculo, y continuará después durante 1 segundo para estar seguros de que ya se ha pasado de largo y no disparará de nuevo al mismo sitio. Luego, emitirá un sonido y la variable "disparando" se volverá falso para que vuelva a rotar la base. En la segunda parte, la falsa, El robot comienza pidiendo una recarga, y una vez hecha se deberá pulsar intro, entonces dará las gracias y hará lo mismo que en la anterior rama, con la diferencia de añadir una puesta a 0 de la variable "reload".

Y esto es todo, este programa no es muy difícil, así que os animo a probarlo y, si queréis, mejorarlo añadiendo funciones.

Saludos

Máquina anti-aérea.

Bueno, como ya he prometido, aquí va el primer modelo para construir, hecho con el lego digital designer, que podéis descargar en el link de la entrada anterior.


Únicamente decir que hay unos fallitos, pues el programa no me dejaba poner las piezas adecuadas, ya que quedan un poco justas:




  1. En la base giratoria, en vez de una sóla barra y dos pines, van tres barras, colocadas igual que la central, pasando por los agujeros de las vigas y de la base giratoria.
  2. En el motor de abajo del todo, el engranaje adecuado para poner después del tornillo sin fin no es el de 24 dientes, sino el de 20
  3. En el motor superior faltan 4 disparadores, y dos gomas rojas que unen los disparadores a las vigas de 7 agujeros, esto es porque el programa no tiene estos componentes, además, aquí podéis inventar vosotros vuestra propia arma, no tiene por qué ser con disparadores, puede ser, por ejemplo, con un lanzador de gomas elásticas.
  4. En el primer engranaje del motor central, no funciona con el piñón de 20 dientes, hace falta uno de 24
  5. El útimo engranaje de la secuencia de engranajes del motor central va unido con una cadena al engranaje superior, pero no está puesta ya que el programa no las incorpora.
  6. En la versión disparagomas, el engranaje pequeño del motor superior tiene que sustituirse por uno negro, de 10 dientes.


Y esto es todo, el montaje lo tenéis aquí: (no os preocupéis por el tamaño del archivo , el programa los hace así de pequeños.)

AVISO: HE ACTUALIZADO LOS ARCHIVOS A UNOS MEJORES, CON MEJOR ASPECTO Y FUNCIONAMIENTO, RECOMIENDO DESCARGAR LOS NUEVOS.

Versión tiragomas: (Utiliza piezas básicas)
http://www.megaupload.com/?d=78BO2MYX
Versión normal: (Utiliza piezas que no vienen en el kit, al menos en el número utilizado.)



Saludos

Novedades

Bueno, esta entrada es solo para decir que en breve empezaré a poner modelos con instrucciones para su construcción, solo que en vez de poner todo foto a foto, haré los modelos con un programa de lego para este tipo de construcciones, que podéis descargar en su página:
http://ldd.lego.com/download/default.aspx
Así que, una vez descargado, podréis bajaros mis modelos y construirlos sin necesidad de ir viéndolos foto a foto, y con posibilidad de ver más de cerca el resultado final.
Aquí os dejo un modelo muy básico que sirve para el reloj y la calculadora:
http://www.megaupload.com/?d=BQ5EF3FB
Para construirlo, simplemente abridlo con el lego digital designer, pinchad en view, seleccionad building guide mode y el programa creará unas instrucciones para hacerlo paso a paso.

Saludos.

jueves, 7 de mayo de 2009

Reloj con alarma.

Bueno, esto, más que para ver la hora o usar nuestro NXT como despertador, nos va a valer para comprobar como para cosas simples se pueden necesitar programas no tan simples.El programa lo encontraréis aquí:
http://www.megaupload.com/?d=RAU8GV75


Dicho esto, comienzo a explicar el programa, que utiliza el ladrillo y dos sensores de contacto (si no tenéis dos podéis reemplazar uno por un sensor de luz, por ejemplo, que detecte cuando es tapado y deja de recibir luz). Es, de nuevo, un programa que no utiliza apenas hardware, controlándose por 5 botones:

El programa utiliza 8 variables, tres para las horas, minutos y segundos, otras tres para las horas, minutos y segundos de la alarma, otra para sincronizar el inicio del programa, y una última para encender o apagar la alarma.

---Comenzamos por la primera rama, que es la que mantendrá la cuenta de la hora y la irá actualizando.
Vemos que comienza con un bucle que no terminará hasta que la variable "start" sea verdadera, esto ocurrirá cuando ajustemos la hora en la tercera rama.
Ya después, entramos en el bucle principal, que cada segundo sumará 1 a la variable "segundos", y cuando esta llegue a 59, la fijará en 0 y sumará 1 a la variable "minutos", que llegada a 59 volverá a ser 0 y sumará 1 a las horas, que llegadas a 23 se pondrán a 0 de nuevo.
Además, cada vez que una variable se resetea reiniciará el display, para evitar mostrar números duplicados.
Simple , ¿verdad?


---Ahora pasamos a la segunda rama, ésta rama es la encargada de mostrar en todo momento los valores de las variables de la hora, para verla en pantalla, además, mostrará unos puntos que separan la hora, básicamente, lo que hace es transformar el valor de las variables a texto, para mostrar este en la pantalla.


---Y bien, llegamos a la tercera rama, que es donde corre el grueso del programa.
Comienza marcando a 0 las variables que marcan la hora, pues ya dentro del bucle las ajustaremos a la hora conveniente.

  1. Ya dentro del bucle, hay 4 iconos de visualizar, que indicarán las instrucciones en pantalla. Después, el bucle comprueba si se pulsan o no los botones del ladrillo NXT, en caso de que no se pulsen, no pasará nada, pero si se pulsan leerá el valor de la varible seleccionada (botón izquierdo para "horas", central para "minutos" y derecho para "segundos"), le sumará 1, y comprobará si excenden su valor máximo (no existen las 16:87:67, por ejemplo), y si ha sido superado las volverán a poner a cero, de tal manera que la variable "horas" tomará valores entre 0 y 23, y las otras dos valores entre 0 y 59.
    Una vez pulsemos el sensor de contacto, saldremos del bucle, indicando que hemos fijado la hora adecuada.
  2. Ya fuera del bucle, marcará la variable "start" como verdadera, permitiendo a las partes primera, cuarta y quinta del programa comenzar a funcionar.(si recordamos, la primera era la encargada de actualizar la hora cada segundo, las otras dos vienen explicadas más abajo).
    Además. reiniciará la pantalla (para borrar las instrucciones) y marcará las variables de la hora de alarma a cero.
  3. El segundo bucle será el encargado de fijar la hora de alarma, actuando de igual manera que el primero, es decir, ajustando las horas, minutos y segundos cada vez que pulsemos un botón.
    Esto interactuará con la cuarta rama.

---La cuarta rama sólo se activa cuando la variable "start" es verdadera (es decir, cuando ya hemos ajustado la hora), por lo demás, esta rama actúa exactamente igual que la segunda, es decir, mostrando en pantalla la hora, con la diferencia que utiliza las variables de la alarma ("horas_a", "minutos_a" y "segundos_a"), además del texto "alarma" y unos puntitos que separan horas de minutos, y minutos de segundos.

---La quinta rama también se activa al terminar de ajustar la hora, y se subdivide a su vez en dos, controlando el funcionamiento de la alarma.

En la primera sub-rama, se está continuamente comprobando si la hora actual y la fijada en la alarma coinciden, en cuyo caso mirará si la variable "On/Off" es verdadera (esta variable detecta si está o no encendida la alarma), y si es verdadera nuestro ladrillo comenzará a sonar hasta que pulsemos el sensor de contacto, (durante 1 segundo mínimo, si no puede que no la apaguemos y siga sonando, evitando reconciliar el sueño, jajaja).

Por otra parte, la segunda sub-rama es la que enciende o apaga la alarma, utilizando El sensor de contacto del puerto 2, sustituible por otro sensor.
Primero marca la variable "On/Off" como falsa, así que la alarma comienza apagada, y cuando el sensor de contacto (2) sea pulsado, cambiará su valor, pues lee el acual, el cual asigna a una bifurcación lógica, dentro de la cual se cambia su valor. A la vez, cuando no está pulsado, asigna el valor de la variable "On/Off" a otra bifurcación lógica, y escribe en la pantalla su correspondiente valor.




Y ya hemos terminado, por último, comentar que no he mencionado muchos reseteos de pantalla que encontraréis por el programa, simplemente son para evitar acumulación de números en pantalla, por lo que los considero poco relevantes.

Saludos.

miércoles, 6 de mayo de 2009

Sigue líneas/ Dibuja líneas.

*NOTA IMPORTANTE* Este programa es muy sensible a cambios en las rectas, por lo que se recomienda usar tramos de 15 cm en recta y 20-25cm en curva, además, cada tramo deberá estar separado por una línea blanca de unos 12mm de largo, y las líneas curvas deben ser de 90º.

Para este programa, lo que necesitaréis será el robot que viene en el kit básico, con ese valdrá para dibujar las líneas, pero si hacéis otro modelo más ligero (sólo con los dos motores, el ladrillo, y los sensores necesarios), posiblemente mejore.


Dicho esto, paso a expicar el programa, que encontraréis aquí:
http://www.megaupload.com/?d=2F56Z5FF

---Lo primero es empezar calibrando los sensores, tendremos que usar una línea negra, con discontinuidades blancas y con fondo más o menos marrón, si no habrá que cambiar la ecuación de la 3ª rama. En este paso, unos 15 bloques calibrarán nuestros sensores, diciéndonos en la pantalla si estamos calibrando el máximo o el mínimo de luz, una vez acabado, sonarán tres pitidos y comenzará el programa.

---Lo primero que encontraremos será un pequeño bucle donde se estará actualizando constantemente el valor del sensor de luz, que veremos en pantalla. Además, hay una pequeña rama (3ª) que reseteará la pantalla una vez para que esto funcione bien.

---Ya en la rama principal, marcamos las variables con sus valores iniciales, y entramos en el bucle principal, que consta de varias partes:
  1. Tenemos un Mini-Bucle que esperará a que la variable que busca luz blanca ( "light light") sea verdadera, entonces dará paso a la siguiente acción.
  2. Ahora medimos los sensores de rotación, y los comparamos sacando tres resultados distintos: El primero, detectará que no hay apenas diferencias entre las lecturas y marcará la variable "counter_1" con el valor 1, que más adelante significará "tramo recto". Si por el contrario, la variable no está en ese intervalo, comparará losdatos de los sensores y determinará dos cosas; si la lectura del sensor c es menor a la del b, supondrá que giramos a la derecha, marcando "counter_1" con el valor 2, si sucede lo contrario, la marcará con el valor 0. Después el programa esperará 0,3 segundos para que esta rama se alinee con las demás.
  3. Esta es la parte que dibujará las líneas. Primero leerá la variable "counter_1", y determinará si hemos girado a derecha o izquierda, o si hemos seguido rectos, tomando un camino u otro. Dentro de todos estos caminos, está una bifurcación (Parecida en los tres, con diferencias mínimas que hay que ver, así que os explico el funcionamiento básico de una de ellas), que lee la variable "dir" y determina la dirección en la que veníamos ( norte, sur este u oeste), y depediendo de ello, dibujará en la pantalla una cosa u otra, leyendo las variables para posicionar la línea ("Inicio_X" e "Inicio_Y), donde dibujará el comienzo, y después a dichas variables les sumará un número que será el final de la línea y además su nuevo valor, es decir, de donde comenzará la siguiente línea, así, obtendremos rectas en caso de que haya seguido recto, y diagonales en caso de que haya girado.
  4. Por último, emite un leve "bip" para indicar que ha dibujado algo, y reinicia los sensores de rotación para empezar a leer el siguiente tramo.

---La tercera rama se encarga del seguimiento de las líneas, así que cuenta con un sistema que relaciona la luz recibida con la potencia de los motores, para que tienda a estabilizarse entre los colores negro y marrón claro, de forma que sigue el borde de la línea. Ahora bien, cuando la varible "light light" sea verdadera, esperará 0,3 segundos a alinearse con el resto del programa, y andará unos 2 cm hacia delante para volver a estar en posición de línea negra, una vez allí, se reiniciará el bucle.

---La cuarta rama es la que determina en cada momento el valor de la variable "light light", para saber nuestro robot ha tocado línea blanca o no. Cuando la toca, la variable se marca como verdadera, y espera 0,2 segundos a remarcarla como falsa ( si recordáis, en las anteriores ramas esperamos 0,3 segundos, esto es para evitar que se cumplan sus acciones por duplicado), entonces espera de nuevo 1,5 segundos, para que no toque de nuevo la línea blanca y se produzcan duplicaciones.

Y esto es todo, este es un programa en el que hay que ajustar muchas cosa, para que funcione bien el en terreno a utilizar, se podría mejorar implementando un sensor de color en lugar del actual de luz, en cualquier caso, dentro del programa he hecho unas anotaciones en los lugares que puedan necesitar reajuste, aunque quizá necesitéis hacer más ajustes en otras zonas, eso lo dejo a vuestra elección.

Saludos.

Calculadora NXT

Bueno, quizá este proyecto sea algo difícil para los que estén empezando, pero ya que es de los más recientes que tengo y no necesita más que el ladrillo procesador y un sensor de contacto, lo publico el primero para que lo podáis usar todos.
Bien, como ya he indicado, lo único que necesitaréis es el ladrillo y un sensor de contacto, colocado con un par de pines en alguno de los agujeros que tiene el ladrillo, en el lado que queráis. El programa, bastante simple,pero muy largo, lo podéis descargar aquí.

http://www.megaupload.com/?d=BMIRGZZT
La estructura básica la componen tres ramas, superior, media e inferior:

---Empezaré por la rama media que es la que contiene la estructura basa de nuestra calculadora:
Al principio de ella se reinician todas las variables (8 en total). Estas variables se dividen en 3 grupos:





  1. Grupo 1: Las 4 primeras, todas numéricas, dos de las cuales tienen por nombre "resultado" y las otras dos "número", indicando al lado con un 1 o un 2 a qué parte del programa pertenecen (1 al primer número, 2 al segundo).La variable "número" está continuamente actualizándose, tomando valores del 0 al 9 (los 10 dígitos posibles) indicando así el valor de las unidades del número a operar. La variable "resultado" se multiplica por 10 cada vez que introducimos un nuevo dígito, guardando el número que estamos operando. Para explicar esto mejor pondré un ejemplo: Supongamos que tenemos el nº 37, y queremos poner 378, entonces, al introducir un nuevo dígito (8), la variable resultado (=37) se multiplicará por 10, para así sumarle el 8 y obtener 37x10 + 8 = 378, que es el nº deseado.
  2. Grupo 2: Las 3 siguientes, todas variables lógicas, que cominzan siendo falsas par air tomando valores verdaderos a medida que se completa el programa, y así ir poniendo en pantalla los datos necesarios (Más explicado en la rama inferior)

  3. Grupo 4: Una última variable numérica, que guardará los datos de la operación a realizar con nºs del 1 al 4, así, un "1" será una suma, un "2" una resta...



Bien, explicadas las variables,pasamos a lo siguiente, aquí se mostrará durante un segundo el texto "reiniciando...", con la opción "borrar" activada, para asegurarnos de que se borra toda la pantalla y vuelve a cero (sobre todo en el caso de hacer una segunda operación después de la primera), luego se reinicia definitivamente la pantalla, y después ya comienza el resto del programa.




Vamos a las operaciones, las del 1er bucle son iguales a las del tercero (estos bucles se corresponden a los números a operar), así que explicaré el funcionamiento de uno solo:

  1. La primera bifurcación es la encargada de controlar el valor de la variable "número", que es el último dígito que estará escrito en la pantalla. Cuando el botón derecho es pulsado, se le suma 1 a la variable "número", y en el caso de que sea mayor que 10 (no existe un dígito para mostrar ese valor), será reajustada a 0, de tal manera que pulsando repetidas veces el botón derecho la variable irá tomando los distintos valores entre 0 y 9.

  2. Esta segunda bifurcación es la encargada de actualizar el resultado cada vez que pulsamos el botón izquierdo (=añadir dígito) leyendo la variable "resultado", mutiplicándola por 10 (ya que usamos el sistema decimal) y sumándole la variable "número", que será el dígito que hayamos decidido añadir, después, volverá a escribir la variable "número" con el valor 0.

  3. La última bifucación es la única que actúa en sus dos ramas ( ya que en las otras, si no pulsamos un botón, no debe pasar nada).La rama de arriba sólo se cumplirá si el resultado es 0, en cuyo caso sólo mostrará en pantalla la variable "número". En caso contrario, a la variable"resultado" se le asignará un texto (numérico) que se sumará a la variable "número", para mostrar en todo momento en pantalla el valor del resultado final.

  4. Por último, el bucle se cerrará en caso de que pulsemos el botón intro, saliendo ya al exterior. Para terminar, ya fuera de la bifurcación, debemos marcar el resultado final, ya que si queremos poner, por ejemplo, el número 459, tenemos un "45" (en la variable "resultado") y un "9" (en la variable "número"), así que multiplicamos el primero por 10, y le sumamos 9, reescribiendo esto en la variable "resultado".



El segundo bucle es muy simple, consta de dos partes:

  1. La primera, idéntica a la parte del bucle anterior que escribía la variable "número", con la diferencia que aquí escribe la variable "operación", y que sólo toma valores del 1 al 4 (las 4 operaciones básicas)

  2. En la segunda, a cada número se le asigna la imagen de un símbolo matemático (+,-,x,:) y la muestra en la pantalla, actualizándose cada poco para ver si ha habido cambios en el tipo de operación.



El tercer bucle es igual que el primero, con la diferencia de que utiliza distintas variables.




Ya para terminar, al haber marcado del último número, el programa esperará hasta que el sensor de contacto sea pulsado, para reiniciar la calculadora.Se me olvidó decir que al final de cada bucle, se marca como variable verdadera una de las tres "terminado", esto nos será útil para mostrar el resultado en pantalla sólo cuando hallamos terminado con las operaciones.




---Bien, ahora pasamos a la rama superior, que será la encargada de mostrar el resultado final:

Empezamos con un bucle, que contiene una bifurcación, ésta sólo se efectuará en el caso de que las tres variables "terminado" estén marcadas como verdaderas (esto ocurre al terminar de introducir los números), en este caso, leerá el valor de la variable "operación" y lo asignará a una bifurcación con varias salidas, dependiendo del valor de la entrada. Dentro de éstas, leerá las dos variables "resultado" haciendo con ellas la operación asignada a la variable "operación", y mostrará el resultado en pantalla.

---Por último, la rama inferior se encarga de ir mostrando los distintos números en pantalla, cuando ya nos hemos salido de sus bucles en la rama media, ya que de lo contrario se borrarían. Comienza mostrando una línea en pantalla (para separar las operaciones del resultado) que será permanente, ya que está dentro de un bucle que se reinicia constantemente.




El resto se divide en tres partes:

  1. La primera parte sólo se activará al terminarar de introducir el primer número, cuando la variable "terminado_1" sea verdadera, entonces, leerá el valor de la variable "resultado_1" y lo mostrará en pantalla.

  2. La segunda parte se activa al ser verdadera la variable "terminado_2" y mostrará el signo matemático correspondiente al valor de la variable "operación"

  3. Por último, esta parte se activa al ser verdadera la última variable lógica ("terminado_3), y mostrará el valor del segundo número en pantalla.


Bien, pues ya está todo explicado, si os queda alguna duda, no dudéis en comentar, decir que he omitido algunas cosas que ocurren que considero irrelevantes, si tenéis dudas sobre ellas, ya sabéis, un comentario y lo soluciono.




¿Creíais que una calculadora iba a ser sencilla?

Saludos.

P.D: Ya sé que dije que no soltaría grandes parrafadas, ya lo sé...

martes, 5 de mayo de 2009

Presentación del blog

Hola a todos.

Bueno, ante todo, quisiera dar la bienvenida al blog a todos los aficionados de lego NXT.
Procuraré escribir lo más posible, y al gusto de todos, es decir, que si tenéis alguna idea no dudéis en decírmela.
Por último, decir que quizá haga traducciones de parte de las entradas al inglés, para mostrar a más gente el contenido del blog, y que el resto de las entradas serán tan largas como esta, así que no esperéis grandes parrafadas, si tenéis dudas, consultadlas y responderé ampliando la entrada.

Saludos