next up previous
Siguiente: Herramientas relacionadas con legOS Superior: Programación de LEGO MindStorms Anterior: Introducción

Subsecciones


La programación de los LEGO Mindstorms

LEGO Mindstorms es un producto diseñado como producto de consumo, lo que le dota de una gran calidad y además de una enorme flexibilidad. Permite construir una enorme variedad de robots, desde un brazo hasta un robot recolector, sin necesitar ninguna soldadura. Además, permite una gran libertad a la hora de colocar los sensores y los motores de los robots. El cerebro de estos robots está basado en un microprocesador Hitachi H8/300 con 32 Kbytes de RAM. Dispone de tres puertos de salida para conectar motores y tres puertos de entrada para conectar sensores, además de un puerto de infra-rojos para comunicarse con el ordenador que sirve de plataforma de desarrollo. Los sensores disponibles son el de luz ambiente, de luz reflejada, de colisión, de temperatura y de rotación.

Los LEGO Mindstorms se venden como kits completos formados por más de 700 piezas tradicionales de LEGO. Cada kit además incluye dos motores, dos sensores de contacto, uno de luz y el bloque del micro-procesador que se denomina habitualmente ``ladrillo'' o RCX (con la memoria y los puertos de entrada/salida). Además, el kit incluye un entorno gráfico de desarrollo y el equipo necesario para descargar el software desde un ordenador personal al ladrillo.

El entorno para el desarrollo de programas incluido en el kit Mindstorms 1.5 es un lenguaje gráfico de programación pensado fundamentalmente para niños o adultos sin ninguna preparación informática. Se trata de un entorno muy limitado, y que además no es requisito de ser software libre. Afortunadamente, los LEGO Mindstorms han recibido mucha atención por parte de la comunidad de software libre, con lo cual han aparecido varias opciones diferentes para su programación muchas de las cuales se analizan en el libro de Jonathan B. Knudsen [3]. Entre ellas destacan dos, NQC y LegOS, que se analizan en las siguientes secciones.


NQC

El acrónimo NQC [1] significa Not Quite C. Se trata de un simple lenguaje con una sintaxis muy similar a C que se puede usar para programar el ladrillo. Es, desde luego, la alternativa más sencilla al lenguaje de programación basado en iconos arrastrables que proporciona LEGO.

El aspecto de un programa en NQC es el siguiente:

/* Ejemplo en NQC */
int tiempo, giro;

task main() {
  SetSensor(SENSOR_1,SENSOR_TOUCH);
  SetSensor(SENSOR_2,SENSOR_TOUCH);
  start avanzar;
                 
  start evitar;
}

task avanzar(){
  while(true){
    OnFwd(OUT_A+OUT_C);
  }
}

task evitar(){
  while(true) {
    if (SENSOR_1 ==1) {
       stop avanzar;
       OnRev(OUT_C); Wait(50);
       start avanzar;
    }
    if (SENSOR_2 ==1) {
       stop avanzar;
       OnRev(OUT_A); Wait(50);
       start avanzar;
    }
  }
}

Este programa realiza el control del robot de la Figura 1. Este robot tiene dos ``palpos'' que al tropezar con algún escalón presionan un sensor, detectando el peligro. El objetivo es conseguir que el robot pasee aleatoriamente por una zona, por ejemplo sobre una mesa, sin caerse por ningún posible escalón.

Figura 1: Robot usado para los ejemplos
.80!robot.ps

El programa consta de tres tareas, una principal que configura el sistema (indica en que puertos están conectados los sensores) y arranca las otras dos (main). La segunda tarea hace avanzar en línea recta al robot (avanzar) y la tercera detecta los choques, y según el sensor que se haya activado hace girar al robot hacia atrás durante medio segundo.

NQC es software libre, distribuido bajo la Licencia MPL (Mozilla Public License). Sin embargo, usa el sistema operativo original de LEGO, lo que hace que no se cumpla el requisito previamente impuesto de emplear sólo software libre en las prácticas. Sin embargo esa no es la principal razón por la que se escogió legOS. NQC se diseñó para ser muy simple y para ser utilizable por personas con limitados conocimientos de programación. Todo ello se ha conseguido, pero a costa de una serie de limitaciones, de entre las cuales las más importantes son:

A pesar de estas limitaciones, NQC es un lenguaje muy popular entre los usuarios de baja formación informática, debido sobre todo a su simplicidad, pero también a la abundante documentación y a la existencia de herramientas como el RCX Command Center para MS-Windows que facilitan el desarrollo y la descarga de programas. En el caso de GNU/Linux, se dispone de un compilador que produce código directamente descargable en el robot, pudiendo utilizarse como editor cualquiera que edite texto ASCII, como por ejemplo Emacs.

Sin embargo, si se quieren realizar programas que requieren cierto almacenamiento de datos, por ejemplo crear un mapa, o simplemente que sean más grandes, NQC no es opción y hay que utilizar un lenguaje de programación real (C, C++, Forth, Ada, etc.) lo cual obliga a cambiar el sistema operativo del ladrillo y en consecuencia a usar LegOS.


LegOS

LegOS es un sistema operativo libre diseñado para el LEGO Mindstorms, diseñado e implementado fundamentalmente por Markus Noga [4]. Comparado con el sistema operativo original de LEGO, ofrece muchas ventajas además de mejores prestaciones y mayor flexibilidad. Entre las características más importantes de la versión legOS 0.2 se pueden destacar:

LegOS es solo el sistema operativo, lo que quiere decir que se necesita el soporte de un compilador capaz de generar código para el H8 a partir del lenguaje de programación que deseemos y para el que existan las librerías adecuadas de LegOS. Para ilustrar el aspecto de dichas librerías se incluye a continuación un ejemplo del mismo programa anterior realizado en esta ocasión en C:

#include <conio.h>
#include <unistd.h>
#include <dsensor.h>
#include <dmotor.h>

/*Declaro una función que se ejecutará al detectar la colisión*/
wakeup_t colision(wakeup_t dato);

int main(int argc, char *argv[]) {
  int dir=0;
    
  while(1) {
    /* arranco
       - Fijo velocidad*/
    motor_a_speed(MAX_SPEED);          
    motor_c_speed(MAX_SPEED);
    /* - Avanzo*/
    motor_a_dir(fwd);
    motor_c_dir(fwd);

    /* Espero */
    wait_event(&colision,0);
    /* Me apunto en que lado fue la colisión*/
    if(SENSOR_1<0xf000)               
      dir=0;
    else
      dir=1; 

    /* reculo */
    motor_a_dir(rev);
    motor_c_dir(rev);

    /* - el ratito que reculo*/
    msleep(500);

    motor_a_speed(MAX_SPEED);           
    motor_c_speed(MAX_SPEED);

    /* Una vez reculado, ahora giro un pelín*/
    if(dir==1) {
      motor_c_dir(fwd);
    } else {
      motor_a_dir(fwd);
    }
    /* - ratito para girar */
    msleep(500);
  }
}

wakeup_t colision(wakeup_t dato) {
        lcd_refresh();
        /* Los sensores están conectados a los puertos 1 y 2 */
        return SENSOR_1<0xf000 || SENSOR_2<0xf000;
}

La estructura del programa es equivalente a la del anterior en NQC, pero en esta ocasión sólo se utiliza una tarea que espera en un bucle infinito a que se produzca un evento, la pulsación del sensor, para realizar el giro. Se han añadido suficientes comentarios al código como para que no merezca la pena entrar en más detalles de su descripción.

El entorno de programación bajo GNU/Linux incluye el compilador de C de GNU (gcc) compilado como cruzado para el Hitachi H8, para lo que hace falta usar las binutils. La distribución para GNU/Linux de LegOS incluye varias herramientas que permiten descargar el código de forma dinámica, descargar el firmaware o sistema operativo, así como varios ejemplos.

Además, alrededor del sistema operativo LegOS se han desarrollado múltiples herramientas auxiliares, como por ejemplo simuladores que hacen más fácil la depuración al permitir ejecutar programas en la propia plataforma de desarrollo usando un depurador tradicional de GNU/Linux como por ejemplo gdb. Algunas de estas herramientas se analizan en la próxima sección.


next up previous
Siguiente: Herramientas relacionadas con legOS Superior: Programación de LEGO MindStorms Anterior: Introducción

Download this document: [src.tar.gz][ps.gz][html.tar.gz][dvi.gz]

Congreso HispaLinux 2000