CONECTAR UN NUNCHUK
Actualización 27/11/11: el programa en NXT-G (bajar aquí).
Actualización 2/12/11: ajuste fino (más preciso) del Nunchuk (bajar aquí).
Si sigues este tutorial, acabarás conectando un Nunchuck al NXT y podrás programarlo con el NXT-G, el software de origen. Para facilitarte las cosas, te puedes descargar un bloque (My Block) ya creado para su control.
Este montaje tiene algunas peculiaridades:
1. Dejaremos un Nunchuck inservible para su uso con la Wii. La parte buena es que por unos 10 o 15€ puedes tener un acelerómetro de 3 ejes, un joystic completo y 2 botones en un solo puerto.
2. Hay que soldar.
3. Lo puedes programar en NXT-G.
4. Obviamente (y como siempre) no me hago responsable de los daños que puedas causarle al mando, a la Wii, al NXT o cualquier otra cosa.
1 Nunchuck (obviamente), que quedará inutilizado para la wii.
2 resistencias de 33K
1 diodo 1N4148
Cable fino de colores
Un soldador y estaño.
Un cable del NXT para cortar por la mitad.
Tubo termoretráctil o cinta aislante.
Una placa para soldadura (opcional).
Lo primero que hay que hacer es quitar el dichoso tornillo "triwing" de la parte de atrás de la carcasa del Nunchuck para poderlo abrir. El tornillo tiene una cabeza de 3 puntas un poco raras:
Con mucha paciencia, pude encontrar un destornillador plano de los de relojero (el típico estuchito con destornilladores pequeños) y los pude quitar. Al final los sustituí por unos de estrella de los de todo la vida que tenía por ahí.
Una vez hemos quitado los 2 tornillos de la parte trasera, la carcasa quedará entreabierta. "Clavamos" la punta de la uña y vamos recorriendo todo el perfil del mando y acabará saltando la pieza. Si no te aclaras, tienes un video de youtube de cómo abrirlo aquí. Nos encontraremos con esto:
Ahora vamos sacando los elementos de su alojamiento. A la hora de volver a montar no es complicado porque las piezas solo admiten ua posición. Si lo montas mal, se nota enseguida. La cosa quedará así:
Con un ligero vaivén, saldrá el cable de su sitio. Fíjate bien cómo va montado, que luego cuesta un poco. La pieza blanca tiene dos ganchos en la parte de abajo. Con un poco de cuidado, también sale.
Bueno, ahora empieza ya lo complicado. Lo primero que hay que hacer, es quitar las resistencias R1 y R2 de la placa del Nunchuck. Para eso es necesario usar el soldador.
Saltan como si fueran manchas de obra sobre un cristal y les pasaras por encima una rasqueta. Es decir, no hay que sacarlas de su alojamiento con pinzas. Simplemente aplicando encima el soldador y enpujando con un cuter o unas pinzas de depilar, saltarán. Eso sí, hay que tener la placa firmemente sujeta para poder hacer fuerza y no quemarte con el soldador.
Vamos ahora a soldar un pequeño circuito que irá alojado dentro del mando. Es muy simple. No uses una placa muy grande para que luego quepa bien. El circuito es este:
Los elementos simplemente están colocados sin soldar en la placa. Si no dispones de una, supongo que no será una barbaridad usar un trocito de cartón, no se. Si no se quema...
Las líneas de color, son los cables que hay que soldar y que se corresponden con los colores del Nunchuck. Este circuito habrá que intercalarlo en el mando cuando cortemos sus cables.
Verás que el diodo tiene una franja negra. Ese lado debe quedar del lado del Nunchuck.
Por el lado del Nunchuck, los 3 elementos, las dos resistencias y el diodo, quedan soldados entre sí y se conectan a un cable rojo, tal como se ve en la imagen. Los otros cables, los que irán al NXT, se conectan cada uno a un color:
Por la parte de atrás se observa la soldadura y las conexiones.
Ahora la parte dolorosa de cortar los cables dentro del Nunchuck. No cortes el cable negro, no es necesario. El blanco tampoco es necesario (ver circuito), pero lo corté por error, así que luego me tocó soldarlo de nuevo.
Ahora ponemos tubitos negros termoretráctiles antes de soldar los cables. Recuerda la parte que va hacia el Nunchuck y la que va hacia el NXT. Aunque realmente el único con el que hay que tener cuidado es con el rojo, ya que los cables verde y amarillo que salen del circuito que hemos hecho son equivalentes, da igual el que cojas. Intercalamos el circuito y soldamos.
Colocamos los tubitos negros en su sitio, calentamos con un mechero y listo. Alojamos de nuevo los elementos en la carcasa del mando y atornillamos. Mucho cuidado que no se toquen entre sí ningún elemento, pueden hacer un cortocircuito. Pon cinta aislante si es necesario.
Ahora el últomo paso, unir un conector del NXT. Cortamos uno por la mitad y pelamos los cables. El blanco y el negro del conector del NXT no sirven para nada, así que lo mejor es cortarlos y aislar las puntas con tubo termoretráctil.
Pasa tubo termoretráctil antes de soldar los cables, teniendo en cuenta que los colores no coinciden. El circuito anterior ya lo hemos hecho pensando en esto.
Y una vez recubierto con el tubo negro (si no se te ha olvidado), el resultado final es este:
Lo primero de todo, quiero agradecer las explicaciones aportadas por el usuario 3,14159 en el foro de Hispalug. Sin estas aclaraciones, no hubiera sacado el programa.
Bueno, vamos al tema. Intentaré explicar todos los pasos para que lo puedas programar por tu cuenta, pero si no te interesa, te puedes descargar el siguiente icono e instalarlo. Con él podrás controlar TODAS las funciones del nunchuk sin necesidad de leer todas las explicaciones que vienen a continuación. Eso si, lee las NOTAS siguientes.
NOTAS:
1. Es un "My Block". Para instalarlo, descarga el archivo y lo pegas en el directorio (y no en otro): [...]/LEGO Creations/MINDSTORMS Projects/Profiles/Default/Blocks/My Blocks.
2. Para que el icono funcione correctamente, DEBERÁS disponer de los siguientes bloques instalados en tu ordenador: Write, Read y Mask. Todos ellos los puedes encontrar en la sección de Software.
3. Verás que el icono tiene 2 salidas lógicas correspondientes a cada uno de los botones del mando. 2 salidas más correspondientes al eje X e Y del Joystic y 3 salidas adicionales para los datos procedentes de los ejes X, Y y Z del acelerómetro. Entre paréntesis tienes los valores que pueden tomar esas variables.
4. Como cualquier otro dispositivo I2C, de vez en cuando se queda colgado. Desenchufa el Nunchuk y espera unos segundos y/o reinicia el programa.
5. DEBES conectar el mando en el puerto 1 del NXT. Si lo quieres modifcar, debes entrar en la configuración del My Block haciendo doble click sobre él y guardando después.
6. Todos los mandos NO son iguales ni tienen los mismos valores de respuesta ante los movimientos. Si el mando no responde bien, tendrás que hacer pequeños ajustes en el My Block, pero espero que no sea necesario.
7. Más abajo en esta página tienes otro "My Block" más preciso que este, aunque funcionan ambos según lo que quieras hacer.
El Nunchuk se comunica con el protocolo I2C. Este protocolo implica la existencia de un "master" (el NXT) y un "esclavo", el mando. Esto permite que hayan muchos esclavos conectados a un único master y que nos podamos comunicar con cada uno de ellos.
La forma en la que el NXT se comunica con ellos, es enviando una señal o telegrama al dispositivo con el que quiere comunicarse, en este caso el Nunchuk, para "iniciar la conversación". La direccion fija (Address) para comunicarnos con el Nunchuk es 164 y esta no cambia. Esa forma de iniciar la comunicación es como sigue, y será lo primero en el programa:
La tabla de direcciones para leer los datos procedentes del mando es esta:
Es decir, leyendo el registro 2 (siempre de la dirección 164), obtendremos los datos del eje X del acelerómetro del mando. Cada vez que queramos conocer un valor, hay que empezar con:
Fíjate bien en la configuración de las pestañas "WriteReg", unas veces están activadas y otras no. Bueno, ya tenemos los 4 primeros iconos escritos. Ahora, ya podemos preguntar por el valor que queremos conocer:
Tiene poco sentido preguntar 1 sola vez el valor. Para que aparezca el resultado en pantalla en tiempo real, solo hay que usar un bucle. Con todo lo visto, el programa completo queda así:
Si quieres visualizar 2 variables a la vez, el registro 2 y el 3 por ejemplo, repite TODO lo que hay en el interior del bucle, seleccionando el registro 3:
La sistemática para leer cada registro es la que acabamos de ver. El protocolo I2C tiene un reloj interno que va aumentando y leyendo consecutivamente cada registro. De esta forma, si empezamos leyendo el registro 2 y queremos leer uno o varios iconos consecutivamente, no es necesario que llamemos con los 2 iconos iniciales. Es decir, el programa anterior funcionaría igual así:
Otra excepción que no he podido entender bien es la lectura del eje X del joystic. Es el único para el que la pestaña "WriteReg" NO debe estar activada cuando lo leemos:
La información de estos botones se obtiene de forma un poco distinta que la del resto. Se encuentra en el registro 5. Cuando leemos este registro, vemos que va absolutamente loco. Los valores aportados por los "Read" varían entre 0 y 255. Este número es decimal. Abre la calculadora de Windows, selecciona Ver/Calculadora científica y escribes 255. Ahora pulsa "Bin" y obtendrás el número en binario, el 1111 1111.
Bueno, pues si lees el registro 5, obtendrás un número. Pásalo a binario. El último dígito de la derecha corresponde al botón Z. Y el penúltimo, al botón C. Para obtenerlo en NXT-G, necesitamos descargar el icono Mask. Acude al final de la sección de Software. Allí hay una breve explicación de cómo funciona el icono.
Brevemente, introducimos en la entrada "A" del icono el cable del registro 5 (ver imagen). La máscara sirve para filtrar el número obtenido y leer solo el dígito que nos interesa. Nos interesa el último. En binario es: 0000-0001. Este número en decimal es el 1. Y eso es lo que escribimos en la máscara (ver flecha en la imagen).
Para el segundo botón, nos interesa la segunda posición por el final, es decir: 0000-0010. Este número en decimal es el 2. Poniendo la máscara en 2, obtenemos el valor de la C. El programa completo para leer el botón Z quedaría así:
Una cosa que puedes hacer ahora es comprender la programación interna del My Block anterior para despejar dudas y ver un ejemplo completo.
En el "My Block" anterior hemos usado los datos procedentes del registro 2 para recoger y visualizar los datos del eje X. Los valores del registro 2 (como los del Y y el Z) varían entre 0 y 255, o lo que es lo mismo, entre 0000-0000 y 1111-1111 en binario. Es decir, 8 dígitos o bits. Bueno, pues el Nunchuk tiene más precisión, (10 dígitos) aunque es un poco liado.
Esto que en principio es bueno, tiene un problema: el ruido y las vibraciones de la mano también se reproducen de forma más precisa. Usa este icono o el anterior en función de la precisión que necesites en tu proyecto. Lee las notas que ponía más arriba, ya que son igualmente aplicables aquí.
Como antes, puedes descargarte directamente el siguiente "My Block", con bastante más precisión que el anterior y pasar de todas las explicaciones siguientes, pero si te interesa cómo está programado, sigue leyendo.
Al igual que en el caso del My Block básico de 8 bits, en este My Block avanzado puede que se de el caso de pequeños ajustes. Si fuera necesario, se debe a que la fabricación de cada mando y/o acelerómetro puede ser ligeramente distinto. De ser así, haz pruebas, anota resultados, haz doble click sobre el My Block y corrige los iconos de resta al final del todo del programa. Cierra y graba.
El registro 5
Este registro es un pequeño cajón de sastre. El registro 5 también es un número entre 0 y 255 o en binario, entre 0000-0000 y 1111-1111: 8 bits en total. Bueno, pues cada uno de esos bits corresponden a: ZZYYXXCZ. Los 2 valores de la derecha corresponden a los botones C y Z (pulsados o no).
Explicaremos los valores de los 2 dígitos XX, ya que el resto es igual. El registro 2 nos aporta 8 dígitos. Pues estos 2 dígitos XX hay que ponerlos al final. Por ejemplo, imagina que el registro 2 nos aporta el dato 1000-1000 y el registro 5 nos da el dato 11 para las posiciones XX. El valor total uniendo los datos de ambos registros es por tanto: 1000-1000-11, diez dígitos.
Este ejemplo que acabamos de ver en números decimales sería así: Reg. 2: 136. Reg 5 (valores XX): 3. Todo junto: 547. Para entender todo esto, hay que pensar en binario, pero para programar el NXT-G hay que escribirlo en decimal. En binario, hemos añadido los 2 dígitos XX procedentes del registro 5 al final del registro 2. ¿Cómo traducir esto a decimal para poder programar?
Los pasos a dar.
Lo primero es "rescatar" los 2 dígitos de interés del registro 5. Para ello usamos el icono "Mask", poniendo en la configuración un "12", que corresponde en binario a 0000-1100 para coger los dígitos ZZYYXXCZ. En este ejemplo lo hemos guardado en la variable [XX Reg 5].
El siguiente paso se explica mejor en decimal. Si tienes un número cualquiera y quieres dejar 2 espacios al final "en blanco" para añadir ahí otros dos números, habría que multiplicar x100. De esa forma se "desplaza" el número hacia la izquierda dejando el espacio correspondiente.
Así, 2654 se convierte en 265400. ¿Cómo hacer esto en binario? Multiplicando x4. Mira el ejemplo anterior: teníamos Reg. 2: 136. Reg 5: 3. Todo junto: 547. La operación a realizar es: 136x4+3=547. Y esto es lo que tenemos que programar. Si no ves bien la imagen, sigue leyendo.
Como me temo que no se ve muy bien, en la siguiente imagen he eliminado los iconos amarillos, que son siempre los mismos. O sea, que este programa NO FUNCIONA, pero se ve bien:
Ahora solo tienes que representar en pantalla ese valor y ya tienes el eje X con precisión de 10 bits. Te podrás imaginar que los otros 2 ejes se programan igual. Resumiendo, hemos unido el registro 2 con el dato procedente del registro 5 al que le hemos aplicado un valor de máscara de 12. Para el resto es:
Así que ahora ya puedes hacer doble clik sobre el "My Block" anterior y entenderlo todo.
Los ejes y los movimientos
De forma muy breve, el Eje X presenta los movimientos cuando giras el mando de derecha a izquierda. El eje Y, cuando apuntas al techo o al suelo. Y el Eje Z simplemente comprueba si el botón del joystic está cara arriba o cara abajo, es decir, cómo está respecto al plano del suelo.
Con ayuda del Data Logger he representado los movimientos del nunchuk durante 12 segundos. Eje X al moverlo de izquierda a derecha, primero lento (curva suave) y luego rápido (picos agudos). Al final, posición horizontal sin movimiento
El eje Y, primero lentamente hacia abajo y luego hacia arriba. A continuación, un movimiento rápido de abajo a arriba (los picos). Acaba con el joystic parado en horizontal.
Por último, el eje Z. Lo muevo bruscamente de arriba a abajo 2 veces. Finalmente lo devuelvo a la posición de "arriba" poco a poco. En el eje Z hay que destacar la cantidad de ruido que hay. Ya te digo que mi mano no tiembla tanto :-)
Tienes algunas aplicaciones en la sección de Proyectos/Nunchuk.
Existen varias páginas que aportan código para el Nunchuk en otros lenguajes de programación. Una de ellas corresponde al mensaje de 3,14159 en el foro Hispalug. Una de las primeras páginas que pude encontrar con información en NXC fue esta.
En cuanto a referencias e información complementaria sobre el Nunchuk, puedes consultar en esta página o también aquí en castellano.
Cualquier duda adicional o aplicación nueva, no dudes en acudir al foro.