Primeros pasos con el robotito Lego Mindstorms NXT. Información útil en la red sobre programación, comunicación, hardware, etc.

Acaba de caer en mis manos un NXT… ya, ya sé que es un juguetito para chavales de 12 o más años, así que si no cumples la edad… ;-)

Bueno, pues el caso es que este cacharrito está bastante chulo. Lo que sigue es mayormente información y referencias que he obtenido en la red.

Hardware

Las especificaciones del dispositivo son:

  • Micro principal: ARM7 de 32 bits (a 48 MHz), que cuenta con 256 KiB de Flash y 64 KiB de RAM (ya sé que parece poco, pero es suficiente para muchas cosas)
  • Micro de sensores: AVR de 8 bits (a 8 MHz), con 4 KiB de Flash y 512 bytes de RAM
  • Bluetooth (SPP, Serial Port Profile, class II Device, 10 metros)
  • USB 2.0 (12 Mib/s)
  • 7 conectores (RJ-12 con el tope a la derecha, de 6 hilos) para sensores/motores/etc.
  • Display LCD, con pad de 4 botones
  • Speaker interno
  • Alimentación: 6 pilas AA

Además, internamente tenemos un conector JTAG conectado directamente al micro ARM y otro para el AVR.

Bueno, no está mal, el ladrillo (¡ehh, que se llama así, brick!) tiene un micro principal, encargado de ejecutar el software que quieras (de fábrica cuenta con un firmware de LEGO) y del bluetooth, y uno secundario encargado de los sensores y los motores.

Una posible pega: las baterías, que lleva 6 pilas. La autonomía depende del uso que le demos, pero si no tiras mucho de los motores, no es del todo mala. Resolverlo es fácil: usar pilas recargables o alimentarlo directamente desde una fuente externa (con un par de pinzas de cocodrilo bastaría).

Software

Por desgracia, el software que te proporciona LEGO es para Windows. Este software sirve para programar el NXT, actualizar el firmware, controlarlo por medio de bluetooth, etc. En principio es muy sencillo de usar, sobre todo teniendo presente la audiencia a la que va destinado. El lenguaje usado es conocido como NXT-G, un lenguaje de programación gráfico muy sencillo. Pero, evidentemente, no vamos a mancillar nuestro precioso disco duro instalando un windows (¿verdad?), así que podemos buscar soluciones alternativas. En este caso, yo me voy a centrar en GNU/Linux.

Buscando en la página de Mindstorms, no se vé por ningún lado que haya una versión compatible de su software, pero sí se puede ver algo bastante interesante: ¡el sistema operativo que lleva el chisme tiene una licencia “Open Source”! Bien, es un buen indicativo. Además, Lego proporciona herramientas para desarrollar: SDK (Software Development Kit), HDK (Hardware D. K.) y BDK (Bluetooth D. K.). Todo se puede descargar desde NXTreme.

Bien, parece que se pueden hacer cosillas. En mi caso, lo primero que hice fue echar un vistazo al código fuente del firmware. En el EULA se nos explica que usaron el IAR Embedded Workbench que, en teoría, se adapta al ANSI C/C++. Si navegas un poco por las fuentes, descubrirás que el firmware es una implementación de una máquina virtual. Luego todo software que queramos correr sobre el NXT debe estar compilado para el bytecode que interpretará esa máquina virtual, en vez de ser código nativo para el ARM. Eso si no queremos hacer cambios sustanciales en el firmware (es decir, cambiarlo y poner otro, de lo que ya hablaremos).

Vale. Ahora echemos un vistazo a los SDK’s que ofrecen. El primero que aparece es el Fantom SDK, que no es otra cosa que el driver para Windows/Osx. Puede que haya algo de información en él, pero de momento, obviémoslo.

Lo siguiente que ofrecen en la web de NXTreme, es un pdf de documentación explicando el formato bytecode de la máquina virtual. Interesante, si fuera necesario escribir un compilador para la VM. De todos modos, siempre viene bien tener documentación a mano… :-p

El siguiente enlace (el de HDK) nos provee una inmensa cantidad de información acerca de la plataforma entera, en cuestiones de hardware. Tenemos esquemas, explicaciones, comunicaciones y no sólo del NXT sino también de algunos sensores… vamos, todo lo necesario para poder disfrutar del juguetito más todavía :-D. Podemos reconstruir el cacharrito en nuestro laboratorio particular, sus sensores, etc. Muuuy interesante.

También tenemos el BDK, Bluetooth Development Kit, que nos explica la interfaz entre el ARM y el core bluetooth. También los comandos que podemos enviar por bluetooth al NXT para controlarlo remotamente. Esto incluye el tratamiento de ficheros, upload, download, etc. Además, la capa de control de estos servicios está por debajo de la de bluetooth, lo que permite que los utilicemos tanto desde el bluetooth como desde el puerto USB.

Bien, hasta ahora tenemos suficiente información como para saber cualquier detalle de todo el juguetito. Además tenemos el código fuente del firmware oficial, detalles de programación, etc. Podemos modificar el sistema operativo o incluso crear uno nuevo. De hecho, ya lo han hecho, pero de eso hablaremos más tarde. Ahora, lo siguiente que puede interesarnos es comunicarnos con el chisme desde nuestro equipo.

Googleamos un poco, y tenemos:

  • jstuber, explica algunos detalles de cómo hacer pruebas con el bluetooth desde GNU/Linux y el NXT. Útil para comprobar que el chisme se enlaza y que el dispositivo bluetooth es compatible. En general, en la página existen algunas cosillas sobre el NXT, por ejemplo, fotos de las placas, o como instalarse la toolchain para el ARM en Debian (la toolchain para desarrollar código nativo, no para la máquina virtual). También tiene documentos sobre cómo hacerse un depurador JTAG para el NXT, o los datasheet del ARM.

La verdad es que hay mucha gente que ha escrito wrappers de la API del NXT para enviar comandos desde el PC por bluetooth o por el cable USB. Esta es una pequeña lista, con los lenguajes asociados:

Como ves, muchas opciones, de hecho para todos los gustos. Todo esto para escribir programas en nuestro equipo que actúan realmente en el NXT, usando el firmware original de Lego, con su protocolo de comunicaciones.

Ahora bien, quizá quieras hacer algo más chulo, y el firmware original no te lo permita. Evidentemente, se puede modificar, ya que disponemos del código. Quizá, con pocos arreglillos, sea compilable con GCC. De todos modos, también podemos instalar un nuevo firmware. Por ejemplo:

  • LeJOS NXJ, máquina virtual de Java para NXT (Lejos NXJ).
  • LeJOS OSEK, RTOS escrito en Ansi C/C++ para el NXT.
  • pbLua, interesante firmware que permite usar el brick como un periférico más, compilando software en el mismo. El lenguaje elegido es el casi desconocido Lua.
  • NXOS otro firmware, escrito en C. Todavía en fase beta.

Podemos desarrollar nuestro programita en Java, y ejecutarlo en la máquina virtual del NXT. Ellos nos proporcionan las herramientas para cargar el software. O, si usamos LejOS osek, tenemos el sistema operativo de tiempo real, y una toolchain que usa GCC para desarrollar nuestras aplicacioncillas. Mola, ¿no? :-p

Por si se queda algo en el tintero, aquí hay una lista completita de muchas alternativas.

  • teamhassenplug, lista y comparaciones sobre el software de desarrollo existente para NXT.

Pero, ¿qué pasa si no queremos modificar el firmware original? Pues nada. Tenemos otras alternativas, como por ejemplo:

  • bricxcc, dos lenguajes, NBC (NXT Byte Codes) y NXC (Not eXactly C), uno tipo ensamblador y otro pseudo-c, que se traduce al bytecode de la máquina virtual del NXT.
  • ntxassembler, un ensamblador para el firmware original un tanto peculiar: ensambla a partir de un xml.

Si te interesa escribir en ensamblador, puedes hacerlo directamente en el NBC. Si queremos un lenguaje de más alto nivel, tenemos NXC, que es muy parecido a C. En la web tienen las herramientas necesarias y bastante documentación sobre ambos, por lo que no es difícil utilizarlos.

Para los menos atrevidos, existe una utilidad para Windows que básicamente es un IDE integrado para el desarrollo con NXC. Es libre, y aunque en la forja sólo está disponible la versión para Windows, es posible conseguir el código. Lástima que esté en Delphi. :-(

Y, de momento, poco más. Si sabes algo interesante, no dudes en comentarlo apropiadamente. :-)

Más cosas

  • altnxt-g, programitas, artículos, cosas varias sobre programación del NXT.
  • raymond, una utilidad de shell para enviar comandos al ladrillo. Muy útil para comenzar. Se puede obtener información del NXT, así como enviar ficheros, descargarlos, etc. Usa USB.
  • linxt, como el anterior, pero escrito en perl.
  • nxtasy.org, blog con mucho relacionado con NXT
  • Bluetooth SSP to GNU/Linux
  • NXTRC, información sobre interconexión entre GNU/Linux y NXT usando bluetooth, además del práctico software NXTRC
  • Grupo de usuarios de NXT
  • Libnxt una librería interesante, tiene utilidades curiosas como fwexec que permite cargar en RAM un firmware para probarlo sin escribirlo en la FLASH.


blog comments powered by Disqus