TALLER DE INTRODUCCION AL LENGUAJE DE PROGRAMACION ROBOTC

“Del juego al robot el camino es Lego”

Contenido:
Presentación Conociendo al NXT RobotC Motores Sensores Trabajando con pantalla Anexo

www.creativecommons.org

Presentación

- ¿Con qué vamos a trabajar?
“Antes de que acabe este siglo, los seres humanos ya no serán los seres más inteligentes o más capaces del planeta...” Ray Kurzweil

Cuando se asiste a una exposición de robótica, en la mayoría de los casos se espera encontrar una ‘Robotina’ o un ‘R2D2’ totalmente funcional con el cual poder conversar. En un principio, estas expectativas parecían sueños solo alcanzables por el séptimo arte. Sin embargo, durante el último lustro el avance tecnológico nos permite suponer que estamos muy cerca de ver realizados estos sueños. Actualmente podemos ver robots realizando tareas humanas en industrias como la automotriz, la aeronáutica e incluso en situaciones de alto riesgo como es durante la negociación con criminales en casos de rehenes o en la exploración de terrenos peligrosos. La robótica se muestra como un nuevo horizonte para la humanidad; el momento en que se logre crear un robot totalmente inteligente, será probablemente el momento más importante de toda la Historia, pues el hombre habrá creado una inteligencia tan inteligente como la suya. Desde luego, este evento, aunque cercano, aún se encuentra a unas décadas de distancia. Por lo pronto, considerables sectores de la humanidad se unen a esta búsqueda de conocimiento, en parte, gracias al abaratamiento de los materiales y las tecnologías necesarias para construir un robot. También los países subdesarrollados, como es nuestro caso, pueden explorar e incluso innovar en esta área, ejemplo de ello son los logros alcanzados por la Facultad de Ingeniería de la UNAM que entre otros, este año se posiciono como tercer lugar a nivel mundial en la creación de un robot para el hogar (dicho de otra forma: una robotina). Tan es así, que actualmente podemos encontrar en el mercado juguetes que son en realidad pequeños robots, tal es el caso del Lego NXT. Es precisamente con este juguete tan especial con el cual vamos a trabajar durante el curso. El Lego NXT nos permite introducirnos de una manera práctica y sencilla al mundo de la robótica, gracias a que se encuentra diseñado de forma tal que tan sólo es necesario armar y programar, sin que el usuario se vea en la necesidad de diseñar y construir los Sensores o los Teparacho - UNAM motores incluso el propio microprocesador. Gracias a estas ventajas, resulta bastante ameno construir pequeños robots, que con un poco de paciencia y algo de ingenio son capaces de realizar las más bastas tareas.

Elaborado por: Eduardo Muñíz Trejo. Octubre 2007

2

Sin embargo, para poder utilizar este robot (a partir de ahora lo nombraremos NXT) es necesario saber programar. El NXT incluye un lenguaje de programación grafica bastante sencillo de utilizar pero que limita al usuario, es preferible utilizar lenguajes de bajo nivel como el C o el JAVA, en este curso utilizaremos una adaptación comercial del lenguaje C, llamada RobotC, este lenguaje nos facilita la programación debido a que incluye las funciones y los comandos necesarios para manejar el NXT y sus componentes, de esa forma solamente es necesario programar para resolver en lugar de programar para controlar. El presente documento no supone una guía completa de RobotC, mas bien una introducción muy rápida y sencilla a este lenguaje y a los componentes del NXT. Se espera dotar al alumno de los conocimientos básicos necesarios para que pueda seguir su aprendizaje de manera autodidacta, no solo en el manejo de este lenguaje también como incentivo para aprender otros lenguajes y otras tecnologías que le permitan, en un futuro, poder construir sus propios robots. El curso se encuentra dividido en dos partes: la primera nos muestra la estructura física del NXT y la segunda se enfoca a la programación. Es importante abordar el curso en este orden, ya que no es posible programar un sensor sin saber como funciona, ni mucho menos suponer como va actuar el NXT con X o Y instrucción si no sabemos como funciona, ni como se comporta físicamente.

Elaborado por: Eduardo Muñíz Trejo. Octubre 2007

3

Conociendo al NXT

-

Nuestro robot de práctica

El Lego NXT es el último modelo de la serie de juguetes MindStorms que fabrica la popular compañía Lego, aunque esta dirigido a niños de 12 años en adelante, en la realidad los que más utilizan este juguete son los adultos, en parte por lo sofisticado de sus componentes y en parte por el amplio horizonte de cosas que se pueden hacer con él. Durante este apartado conoceremos las características técnicas del NXT y de sus componentes más comunes. De esta forma podremos comprender su funcionamiento, lo que nos permitirá programarlo en el siguiente apartado. El NXT se puede conseguir a través de Internet o dentro del país en tiendas dedicadas como Robotics3d o Robodacta, también es posible hallarlo en algunos Samborns de la capital pero su precio aumenta considerablemente, regularmente éste oscila entre $ 4,000 y $ 5,000 pesos (MX) pero varía según la paridad del dólar (US). Lo venden como un Kit, que contiene una batería, tres servomotores, cuatro sensores, un Brick, un cable USB, llantas de diversos tamaños así como varias decenas de piezas que permiten armar diversas estructuras y formas asi como un manual básico de construcción. Las partes que conforman el NXT se pueden agrupar en: 1. 2. 3. 4. El Brick, los motores, los sensores y los accesorios.

1988: LEGO y el MIT colaboran en el desarrollo de un “ladrillo inteligente” que de vida a las creaciones LEGO vía programación por ordenador. En 2006 Surge el NXT.

La parte más importante del NXT es el Brick, en él se encuentra el procesador y la memoria del NXT, es en otras palabras, el cerebro de nuestro robot, así como la fuente de poder del mismo, pues cuenta con una ranura para la inserción de batería.
Brick NXT

Elaborado por: Eduardo Muñíz Trejo. Octubre 2007

4

Tiene 7 conectores RJ-12 con el tope a la derecha de 6 hilos para conectar los sensores y los motores. Elaborado por: Eduardo Muñíz Trejo.El Brick cuenta con un Microprocesador ARM7 de 32 bits que corre a 48 MHz. Para el uso de los sensores cuenta además con un microprocesador dedicado AVR de 8 bits a 8MHz. así como una memoria de 256 Kb y una RAM de 64 Kb. Octubre 2007 5 . éste cuenta con un Display LCD de 100*60 píxeles con un pad de 4 botones. lo que aunado a su bajo consumo eléctrico y a la posibilidad de alimentarse de 6 pilas AA o de una batería general recargable (que es mucho mas recomendable) le provee de una autonomía muy valiosa a la hora de diseñar nuestros modelos. Además de un Speaker interno para emitir sonidos. lo que le permite almacenar y correr sus propios programas sin tener que estar conectado a una computadora.0 de alta velocidad y Bluetooth Clase II con un alcance de hasta 10 metros. El nombre de Bluetooth procede del rey danés del siglo X llamado Harold Bluetooth. Suecia y Dinamarca. Para mostrar información y poder realizar la selección de programas guardados en el Brick. Esta tecnología le permite mantener comunicación con otros NXT e incluso con celulares y PDAs. conocido por unificar las tribus de Noruega. Se puede comunicar con la computadora mediante interfaz USB 2. con 4Kb de memoria y 512 Kb de RAM.

pronto descubrirá lo sencillo que es aprender RobotC. Si el lector cuenta con alguna experiencia previa en la estructura y la lógica de Lenguaje C. controlar el NXT. podemos utilizar la versión de prueba (que es totalmente funcional) durante 30 días. el software de Lego tiene grandes limitaciones en el ámbito académico y practico. RobotC es un programa comercial que se puede adquirir en tiendas especializadas de robótica o a través de Internet. 3. estructural y lógico.RobotC – El lenguaje del NXT Se denomina Shareware a una modalidad de distribución de software para que el mismo pueda ser evaluado de forma gratuita. Así. este programa permite (mediante dibujos) que cualquier usuario pueda. pertenece al grupo de Software denominado Shareware. puedes consultar los cuatro pasos para lograrlo en la sección de Anexos al final del manual. Menú Barra de Funciones Numerador Escritorio Elaborado por: Eduardo Muñíz Trejo. pero generalmente por un tiempo especifico. ya que limita la programación a las funciones que se incluyen en el software. basta con que conozcamos las partes de la Pantalla del Software a las que nombraremos en este manual de la siguiente forma: 1. Sin embargo. Éste lenguaje de programación fue creado por Robotics Academy y le llamo de esta forma debido a que esta basado en el lenguaje de bajo nivel: “C”. conocido como ensamblador Lego. Lego provee de manera comercial un software que permite al usuario programar el NXT. 2. de ahí que no sea necesario abordar a fondo la manera de utilizar la interfaz de RobotC. Octubre 2007 6 . afortunadamente. aunque también las limitaciones pueden estar en algunas de las formas de uso o las capacidades finales. en cambio RobotC nos permite crear nuevas tareas para el NXT. ni tampoco una versión en español. La interfaz de RobotC es muy sencilla y su uso es mayoritariamente intuitivo. 4. Es importante mencionar que hasta el momento en que se escribió este manual no existe una versión de RobotC para sistema alguno distinto de Windows. debido a su gran parecido gramatical. Instalar RobotC es muy simple. incluso sin tener conocimientos previos de programación.

Octubre 2007 7 . Éste se puede descargar de Internet de manera totalmente gratuita. Una vez que terminas de escribir tu código fuente sin errores gramaticales y has conectado y encendido el NXT al ordenador. en la barra de Funciones. desde luego. depende de cada usuario experimentar y aprender sobre las otras. es necesario instalar el Firmware de MindStorms. aparecerá un cuadro de diálogo desde el cual podrás ejecutar el código. en el presente curso solo abordaremos algunas de ellas.La pantalla de RobotC Escritorio Menú Para poder establecer comunicación con el NXT a través de la computadora. Si el código se encuentra correctamente escrito y el NXT esta conectado a la computadora. puedes compilar tu programa presionando la tecla F5 o a través del menú Robot > Download Program. Barra de Funciones Numerador El escritorio es la zona de edición del código. ubicada a la izquierda del escritorio podemos encontrar todas las funciones que acompañan a RobotC. que se puede entender como “los controladores del NXT”. Elaborado por: Eduardo Muñíz Trejo.

En términos muy generales. Elaborado por: Eduardo Muñíz Trejo. además. pues representan alguna función o algún comando dentro del propio lenguaje. Todas las instrucciones. deben de terminar con un punto y coma (. sin embargo. la estructura general de un programa escrito en RobotC es: // 0 Inclusion de archivo externos // 1 Declaracion de variables globales // 2 Firma de Funciones task main(){ // 3 Declaración de sensores // 4 Instrucciones } //Funciones Es muy raro utilizar alguna librería o un archivo externo en el desarrollo de software para el NXT con RobotC. Para empezar es necesario mencionar que RobotC distingue mayúsculas de minúsculas: no es lo mismo escribir motor que Motor. todas estas palabras son en Ingles y solo hay algunas excepciones con las palabras que se escriben como en el español.). con excepción de las sentencias de control. si se llegara a utilizar. esto significa que no se pueden usar dichas palabras de forma libre. éstas resultan ser muy parecidas a las del lenguaje C. RobotC cuenta con una estructura y una sintaxis propias. Existen en RobotC una lista de 162 palabras reservadas. ejemplo: motor. sin duda gracias a que RobotC esta inspirado en éste lenguaje. Afortunadamente para nosotros. Octubre 2007 8 .Estructura y Sintaxis de RobotC Al igual que cualquier otro idioma. es necesario que primero se compile la librería en el NXT para posteriormente poderla llamar desde otro programa compilado en el mismo NXT. siempre que se abra algún paréntesis (()) o un corchete ({}) se debe de cerrar. sin embargo.

mejor que eso es usar una función que te ejecute esa instrucción. es la primer función que se ejecuta al iniciarse el programa. las líneas de tu código se duplicarían y además se complicaría mucho el código. Ejemplo: float suma(float n1. (4 bytes) soporta números decimales y números con exponente. y existen cuatro de ellos: INT FLOAT LONG BOOL Contiene números enteros con signo o sin signo (hasta 32 768) soporta números decimales y números con exponente. Supongamos que tienes un programa que en distintas condiciones debe de sumar dos números. Existe otro tipo que se utiliza para indicar al compilador que ‘X’ función no devuelve ningún valor y es void. sin embargo estos tipos son propios de las variables a utilizar. (8 bytes) Contiene dos valores: true o false Una función es un subalgoritmo. en caso de que no se firmen las funciones. En la sentencia anterior se menciona la palabra “tipo”. el main deberá de ser el ultimo bloque del programa. solo tendrías que llamarla y recibir los resultados devueltos. La declaración de sensores debe de ser la primer instrucción del main (siempre y cuando se utilicen). Octubre 2007 9 . Así. es el término para describir una secuencia de órdenes que hacen una tarea específica de una aplicación más grande. La forma de firmar una función es: «Tipo» «nombre» («parámetros»). si escribieras esta suma en cada ocasión que la necesitas. esta palabra hace referencia al valor que devuelve la función una vez terminada su ejecución. } Elaborado por: Eduardo Muñíz Trejo. sirve para simplificar el trabajo y para estructurar de mejor forma tu código. Por debajo del main y sólo si se han firmado antes. r = n1 + n2. float n2){ float r. expresado de otra forma. Es más recomendable firmar las funciones que usar el main() hasta el final. se escriben las funciones. Funciones Una función es un pequeño algoritmo utilizado dentro de otro algoritmo mayor.El task main() es de carácter obligatorio ya que es el cuerpo principal del programa. return r.

2) y el resultado devuelto seria 3. definitivamente usar una función es mucho más sencillo y cómodo que repetir este procedimiento cada vez que se utilice. luego la tercera y así sucesivamente. si llueve. Además de contar con funciones. Esto es posible mediante la instrucción if («condición») {«instrucciones» } Elaborado por: Eduardo Muñíz Trejo. puede que en un ejemplo tan sencillo como este no se alcance a comprender en toda su magnitud la enorme ventaja de usar funciones. cierras las ventanas. cuando deseemos reutilizar o mejorar un programa que desarrollamos en el pasado. sólo basta con escribir suma(«numero1». así que no escatimes en colocar comentarios a tu código fuente. sino que además realiza la cotización bancaria del dólar basándose en los puntos de la Bolsa de Valores. pero supongamos que tu función no solo suma.«numero2») ó aplicando a un ejemplo cualquiera: suma(1.Así. Se ejecuta la primer línea. 10 . Los comentarios se colocan de la siguiente forma: // Comentario de solo una línea /* Cuando se usa diagonal y asterisco Indica que es un comentario de varias líneas */ Sentencias de Control El flujo de un programa escrito en RobotC es totalmente lineal. Un ejemplo muy cotidiano es: “Hijo. Este texto es ignorado por el compilador pero no por ello representa un gasto inútil de tiempo o de esfuerzo. puedes ayudar a otros programadores e incluso a ti mismo a entender mejor el código fuente del programa usando comentarios. Pero ¿Qué pasa si solo queremos que se ejecuten ciertas líneas bajo ciertas circunstancias? Para lograrlo. generando un programa equivalente que la máquina será capaz de interpretar. Octubre 2007 Un compilador es un programa informático que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación. la segunda. hasta que no quedan líneas que ejecutar. con el paso de los meses. pero sino. riegas las plantas” en esta situación se da una condicional (la lluvia) y dos acciones distintas por si se cumple o no dicha condicional. es necesario utilizar sentencias de Control: las sentencias de control son comprobaciones basadas en valores binarios para determinar si una condición se cumple o no. gracias al código fuente podemos recordarlo fácilmente!. es muy probable que no recordemos con exactitud para que usamos tal o cual instrucción. al contrario. Un comentario es una frase o un breve texto que explica lo que realiza un segmento del código o lo que se supone que debe de realizar.

se devuelve true (AND) Si alguna de las condiciones es true. Devuelve true si los factores son distintos entre si. Devuelve true si el facto a la derecha es menor o igual. }else if ((a+5)<=b){ //segunda comprobación. Devuelve true si el factor a la derecha es mayor. estos son los siguentes: Operador Igual a Mayor que Menor que Menor o Igual que Mayor o Igual que Distinto a Símbolo == > < <= >= != Descripción Devuelve true si ambos factores son iguales Devuelve true si el factor a la izquierda es mayor. }else{ // Instrucción: ejecutada xque no se ejecutó las anteriores } Existe otra estructura de control denominada switch. Las condiciones se logran mediante el uso de operadores de comprobación. una variable puede valer 1 o 2 o 3 o 4 o Elaborado por: Eduardo Muñíz Trejo. Así. la segunda opción se usa por defecto. por ejemplo. esta opera bajo la lógica de que una condición puede tener muchos posibles estados y no solo dos (0 o 1). se obliga al programa a realizar primero la comprobación de if y luego la comprobación de else if. se devuelve true (OR) La sentencia IF acepta una excepción que es else o else if que se usan cuando la primer condición resulto ser false. pero si se utiliza else if.If se puede componer de distintas condiciones que se suman y a través de ellas se determina si es correcto o no ejecutar las instrucciones contenidas entre corchetes. la estructura es: if(a>b){ //primer comprobación. si se utiliza else. Octubre 2007 11 . Si se desea realizar mas de una operación booleana en una sola asignación se deben de utilizar alguno de los siguientes caracteres: && || Solo si ambas condiciones son true. Devuelve true si el factor a la izquierda es menor o igual.

la estructura de Switch es: switch(a){ scase 1: //Instrucciones. también es necesario ejecutar una línea mientras que se cumpla una condición. el comprador brinca de inmediato a la opción (case)correcta. scase 3: //Instrucciones. default: //Instrucciones ejecutadas por que no se ejecutó otra. scase 2: //Instrucciones. break. pero en muchas ocasiones no solo es necesario decidir si ejecuto una línea o no. entonces se 12 Elaborado por: Eduardo Muñíz Trejo. el conjunto de instrucciones encerradas entre los corchetes se ejecutan indefinidamente hasta que se cumpla la condición. pues mientras que en el IF es necesario recorrer cada comprobación para llegar a la correcta. funcionan mediante comprobaciones. break. Las sentencias de recursividad o bucles al igual que las de control. break. Recursividad Hace un momento mencionamos que las líneas del programa se ejecutan de forma línea. la diferencia es que en éstas. break.infinito -1 y el programa puede realizar una función distinta dependiendo del valor de la variable. Es importante subrayar la palabra: INDEFINIDAMENE ya que si se planea mal un programa y resulta que jamás se va a cumplir la comprobación. } Podemos observar que es muy parecido a una cadena de “}else if{“ pero este sistema es mas eficiente en cuanto a rendimiento de memoria. Octubre 2007 . en el switch. A esto se le llama recursividad La recursividad es Propiedad de algunos lenguajes de programación de permitir que un programa solicite su propia ejecución en el curso de su desarrollo.

lo que ocasiona que el sistema (robot y computadora) se saturen de trabajo y colapse. while. excepto por qe el Do asegura que el código por lo menos se va a ejecutar una vez. ambos funcionan de la misma forma. do. En robotC existen tres sentencias de recursividad: for. el propio for cuenta con una estructura de conteo: for («valor inicial» .dice que se entro en un “bucle infinito”. while («Condición») { // instrucciones } do { // instrucciones } while («Condición») Elaborado por: Eduardo Muñíz Trejo. Significa que se va a repetir la acción cierto número de veces y no mas. Otra forma de recursividad son el While y el Do. «incremento») { // instrucciones } En valor inicial se indica con cuanto va a iniciar el ciclo la variable de control. La sentencia for es una sentencia de conteo preestablecido. Octubre 2007 13 . y el incremento es en cuanto va a variar la variable de control cada vez que se ejecute un ciclo. cuando va a terminar el ciclo. en condición. que es lo mismo que “trabarse”. «Condición». la diferencia entre ellas radica en la forma en la que cada una realiza su repetición.

de esta forma si un servo esta conectado en el puerto A. entonces dicho servo se denomina motorA. por ejemplo ordenar que el motor se detenga justo dos grados antes de que de un giro completo. mientras que un servomotor incluye un juego de engranes que nos permiten controlar tanto la velocidad de giro como la cantidad de revoluciones que ejecuta el motor. ‘B’ y ‘C’. La gran ventaja de estos servos radica en que se puede detener el motor en un punto especifico con una precisión de un grado. La diferencia entre un motor y un servomotor radica en que el motor tan solo es una bobina que gira en un sentido u otro dependiendo de la corriente. Elaborado por: Eduardo Muñíz Trejo. Y son nombrados según el puerto al cual estén conectados. La forma de calcular la distancia recorrida por una llanta en base a las revoluciones que a dado es: Estructura Interna de un Servomotor NXT Los servomotores del NXT se conectan en los puertos ‘A’. Todo esto es posible mediante programación. de esta forma es posible. Un encoder es un “clic” del motor y equivale a 1 grado de giro. gracias al conteo de encoders. También nos permite calcular la distancia recorrida por el robot tomando en cuenta el diámetro de su rueda y el número de revoluciones que ha dado el motor.Motores La forma correcta de nombrar los motores del NXT es: Servomotores. Octubre 2007 14 .

se detendrá y emitirá un sonido descendente mediante el comando “PlaySound ( )”. no es necesario declarar los servos antes de utilizarlos.La velocidad de los servos se indica mediante valores que pueden ir del -100 al 100. al llegar a +/. En RobotC.95 para no forzar los motores y producirles algún daño.32 768 se reinicia a 0. Se recomienda no utilizar velocidades mayores a +/. Estas constantes son: • • • • • soundBeepBeep soundBlip soundDownwardTones soundException soundFastUpwardTone s • • • • soundLast soundLowBuzz soundShortBlip soundUpwardTones PROBLEMA #1 Haz que el robot avance en línea recta hasta que la llanta gire 4 vueltas completas. el conteo de los encoders no es infinito. que recibe como comando una constante predefinida que le indica que tipo de sonido emitir. Elaborado por: Eduardo Muñíz Trejo. Octubre 2007 15 . luego deberá de dar vuelta hacia un lado y detenerse. el motor conectado al puerto A. } PlaySound (soundLowBuzz). Mediante el mismo comando. es posible tanto leer la velocidad actual del servo como de asignar velocidades. Código RobotC //Programa 01: Motores task main(){ while(nMotorEncoder[motorA]<50){ motor[motorA]=75. luego. Indicando con el cero que el motor se encuentra inactivo y los extremos (100 y -100) las velocidades mas altas alcanzadas en un sentido u en otro. girara durante 50 encoders a una velocidad de 75%. } En este ejemplo.

3. Los componentes pasivos son todos aquellos componentes que varían su magnitud en función de alguna variable. NTC y LDR. se basa en el mismo funcionamiento que los de tipo fotoeléctrico. son los más simples. como pueden ser fotodiodos.) y una célula receptora de dicha señal. estos sensores son: 1. sensor] luego solo es necesario usar: SensorValue [puerto]. Normalmente estos dispositivos se encuentran realizados mediante la utilización de componentes pasivos. Sonar Infrarrojo o IR Touch Sonido Un ejemplo de resistencia pasiva son: PTC. se encuentra basada en el empleo de una fuente de señal luminosa (lámparas.Sensores Un sensor es un dispositivo diseñado para recibir información de una magnitud del exterior y transformarla en otra magnitud. El Kit del NXT contiene 4 sensores que podemos utilizar para dotar a nuestro robot de la capacidad de interactuar con el ambiente. Fotoeléctricos: La construcción de este tipo de sensores. Octubre 2007 16 . normalmente eléctrica. 4. diodos LED. ya que son interruptores que se activan o desactivan si se encuentran en contacto con un objeto. Algunos tipos de sensores son. esta vez de tipo ultrasónica y esta señal es recibida por un receptor. esto se logra mediante la instrucción: SetSensorType [puerto. fototransistores o LDR etc. por lo que de esta manera se reconoce la presencia de un objeto en un determinado lugar. En robotC es necesario declarar el sensor antes de utilizarlo. que seamos capaces de cuantificar y manipular. diodos láser etc. Elaborado por: Eduardo Muñíz Trejo. ya que se emite una señal. Sensores por ultrasonidos: Este tipo de sensores. 2. Sensores de contacto: Estos dispositivos.

while(true){ nxtDisplayString(1. "%3d". de manera automática.5 metros lineales y hacia al frente del sensor sonar. sensorSONAR).sensorSONAR). Tiene muchas aplicaciones industriales y se emplea en medicina El máximo alcance del sonar es 2. Octubre 2007 . El funcionamiento de éste sensor se basa en la emisión y la recepción de ultrasonido. este parámetro es enviado como la segunda variable requerida por la función SetSensorType (puerto. El sensor emite una frecuencia continua de sonido ultrasónico que al rebotar sobre los objetos del ambiente regresa al sonar. SensorValue[S1]). este calcula el tiempo en que tarda la señal en rebotar y en base a eso determina a que distancia se encuentra el objeto en el cual reboto el sonido. Veamos un uso práctico de este sensor: Código RobotC //Programa 03: sensor SONAR task main(){ SetSensorType(S1.Sensor Sonar El sensor sonar se puede identificar por su forma rectangular que tiene dos círculos que en ocasiones dan la apariencia de ser una cabeza de juguete. } } 17 Elaborado por: Eduardo Muñíz Trejo. Cuando no existe ningún objeto con el cual choque la frecuencia ultrasónica en menos de este rango con el cual pueda rebotar el sonido. El parámetro utilizado para declarar el sensor sonar es: sensorSONAR. el sensor devuelve un valor nulo: cero. Ultrasonido: Sonido cuya frecuencia de vibraciones es superior al límite perceptible por el oído humano. Se conecta a cualquier puerto del NXT y se declara utilizando la función: SetSensorType ( ) antes de empezar a utilizarlo.

éste es: PlayImmediateTone (frecuencia.0145 segundos. lo que significa que la tasa de medición del sensor Sonar es de tan solo 0.10). como es un campo variable. while(true){ nxtDisplayString(1. Elaborado por: Eduardo Muñíz Trejo. en este caso se imprime el valor que regresa el sensor conectado al puerto S1 en la línea 1 de la pantalla. Existe otro comando utilizado para emitir sonidos por el altavoz.En el programa anterior utilizamos una nueva función desconocida hasta el momento: nxtDisplayString (). Para realizarlo solo necesitas una base que pueda girar en su propio eje. } } Combinado con otros sensores y con imaginación y creatividad. que es lo que le toma al sonido ir y venir en una distancia de 2. Código RobotC //Programa 05: sensor SONAR task main(){ SetSensorType(S1. es posible realizar muchas cosas con el sensor Sonar. PlayImmediateTone(SensorValue[S1]. colocar el sensor sonar en ella e ir tomando mediciones cada 4 o 5 encoders e irlas graficando en el Display del NXT. para hacerlo necesitaras algunas funciones que veremos en el capitulo 7. "%3d". (en total recorrer 5 metros). Octubre 2007 18 . duración). ésta función sirve para imprimir en pantalla un mensaje. PROBLEMA #2 Es necesario realizar un programa que haga que el robot avance en línea recta siempre y cuando el sonar devuelva un valor superior a 35. SensorValue[S1]). A continuación realizaremos un programa que nos permita medir la distancia entre el robot y el objeto mas cercano que nos permita ver y oír el valor de esta distancia: El sonido se desplaza a 334 metros por segundo en el aire a 20 ºC. por ejemplo: un radar.5 metros. en cuyo caso: deberá girar hacia un lado y continuar avanzando en línea recta.sensorSONAR). recibe como parámetro un numero entero que es la frecuencia a reproducir por el altavoz y un numero igualmente entero que es la duración del sonido que debe emitir. se utiliza el formato de cadena: %3d que indica a RobotC que es un campo numérico entero (d) formateado en tres dígitos (3).

si la mano se aleja demasiado.PROBLEMA #3 Realice un programa que haga que el robot trate de seguir tu mano cuando esta se encuentre cerca de su sonar. Nota: es probable que no funcione del todo bien con tu mano. Octubre 2007 19 . y que cuando se encuentre muy cerca de ella se detenga y espere. debe de buscarla. te recomiendo usar un cuaderno que simule ser tu mano. Kit del Lego NXT Elaborado por: Eduardo Muñíz Trejo. gracias a las rugosidades de la misma.

La ventaja de utilizar el estado active consiste en que se obtiene una lectura mas “leal” gracias a que se le suma a la luz del ambiente la luz emitida por el propio sensor. Cuenta con dos pequeños diodos. lo que reduce considerablemente el “ruido” existente por otras frecuencias de luz. Para medir colores MindStorms a puesto a la venta un sensor especifico que se vende por separado. sin embargo. Oscila entre aproximadamente 10-6 y 10-3 metros. Que corresponden cada uno a su estado Activo y a su estado Inactivo respectivamente. para hacerlo se utilizan los parámetros: sensorLightActive sensorLightInactive La longitud de onda de los rayos infrarrojos es menor que la de las ondas de radio y mayor que la de la luz visible. así que si la fuente de iluminación varía. como esta no es su función. uno ubicado encima del otro. debido a que mide la cantidad de luz reflejada por un color u otro y no propiamente el color. Se puede conectar en cualquier puerto y devuelve valores de entre 0 y 100. Es muy importante mencionar y tener en cuenta a la hora de programar nuestros robots que por ningún motivo es aceptable utilizar el sensor infrarrojo bajo luz solar directa. es muy difícil calibrarlo y resulta con graves errores de medición.Sensor Infrarrojo (IR) El sensor infrarrojo o Infrared (IR) pude cuantificar la cantidad de luz infrarroja en el ambiente. Cuando el sensor se encuentra en su estado inactive es posible utilizarlo para detectar colores. debido a que el sol emite enormes cantidades de luz infrarroja. el IR se debe declarar antes de empezar a utilizarlo. el de la parte inferior es mejor dicho un Led rojo que emite luz de éste color cuando el sensor se encuentra en su estado Active y se mantiene apagado en el estado Inactive. Al igual que con todos los sensores. Octubre 2007 20 . siendo 0 la nulidad en luz infrarroja y el 100 la máxima cantidad captable por el sensor. tanto por recepción como por reflejo. Elaborado por: Eduardo Muñíz Trejo. el sensor devolvería constantemente un valor de 100 y podría estropearse por tanta energía lumínica. la medición también.

SensorValue[S2]). "IR: %3d". PlayImmediateTone(SensorValue[S2]. así los robot pueden ir hacia ella y tratar de llevarla a la portería. Octubre 2007 . Código RobotC //Programa 08: sensor IR task main(){ SetSensorType(S2. SensorValue[S2]). motor[motorA]=60. motor[motorA]=0. "IR:%3d ENC". Ahora vamos a realizar un programa que sigua una luz infrarroja.sensorLigthActive). while(true){ if(SensorValue[S2]>70){ nxtDisplayString(2. debido esto a que se utiliza en este tipo de competencias una pelota de emisión infrarroja que emite esta luz invisible en todas direcciones. } } } 21 Elaborado por: Eduardo Muñíz Trejo. }else{ nxtDisplayString(2. } } El sensor IR es muy socorrido en el juego de fútbol. así como el IR en el puerto S1 y configurado en su modo Active. SensorValue[S2]). Para ello es necesario tener conectado un motor en el puerto A y otro en el puerto B. motor[motorB]=-60. "IR:%3d BUS".Código RobotC //Programa 07: sensor IR task main(){ SetSensorType(S2. while(true){ nxtDisplayString(2.10). motor[motorB]=0.sensorLigthActive).

Estos instrumentos consisten básicamente en una lámpara que emite un haz de rayos infrarrojos. Elaborado por: Eduardo Muñíz Trejo. Es conocido como IR Seeker y se puede conseguir en Internet. y un telescopio que recibe la radiación reflejada por el objeto y la convierte en una imagen visible. todas sus acciones las imprime en la pantalla. pero es un poco complicado programar el uso de estos tres sensores al mismo tiempo de forma tal que nos devuelvan la posición de la luz infrarroja. actualmente existe en el mercado un sensor que nos devuelve ese valor expresado en grados desde 0 a 150 grados. Octubre 2007 22 . Dispositivos infrarrojos como los empleados durante la II Guerra Mundial permiten ver objetos en la oscuridad. deberá detenerse. PROBLEMA #4 Basad@ en la información pasada escribe un programa que haga que el robot busque una fuente lumínica de luz infrarroja. utilizado durante el Robocup 2007 por equipo mexicano como portero. Pelota Infrarroja Japonesa Citlalli: Una solución practica de tres sensores para la falta del IR seeker. Una solución a esta deficiencia consiste en dotar al robot de tres sensores IR. La gran limitación del sensor Infrarrojo consiste en que solo devuelve un valor que indica la presencia de luz infrarroja y en que cantidad. así se abarca una zona muy parecida a la que abarca el IR Seeker. a veces denominados luz negra. entonces se detiene. nos permita ver y oír cuanta luz esta viendo mientras la sigue. pero en caso de encontrarse con un obstáculo. viendo en tres posiciones distintas. pero no nos dice en que dirección se encuentra o desde donde es emitida esta luz.El programa anterior hacia que el robot girara hacia un lado a una velocidad de 60% hasta que encontrara una luz infrarroja superior a 70.

Cuando no se encuentra presionado se dice que su estado es false.Sensor Touch o de tacto El sensor de Touch o de tacto es el sensor mas simple que puede haber. Se declara utilizando la función SetSensorType() mandando como parámetro: sensorTouch. el botón regresa a su posición mediante un resorte. Octubre 2007 23 .10). while(true){ if(SensorValue[S3]==true){ PlayImmediateTone(650. Código RobotC //Programa 10: sensor Touch task main(){ SetSensorType(S3.sensorTouch). el flujo eléctrico es cortado en uno de sus puntos. se debe declarar antes de utilizarlo y se conecta en cualquier puerto. Consiste en un circuito muy simple. se coloca un puente en la parte que hace el contacto en el Touch y cuando este es presionado cierra el circuito. los valores que devuelve son: 0 y 1. siendo true el estado contrario. true o false dependiendo de su estado. } } } Elaborado por: Eduardo Muñíz Trejo.

solo mide cantidad de ruido en decibeles. motor[motorB]=75. motor[motorB]=0. los datos de los sensores deben ser impresos en pantalla Elaborado por: Eduardo Muñíz Trejo. sin embargo en la vida real es muy complicado y difícil de lograr debido a que en el ambiente urbano existe una gran cantidad de ruido que se confundiría con el sonido de la voz. Código RobotC //Programa 11: sensor Sound task main(){ SetSensorType(S4. while(true){ if(SensorValue[S4]>50){ nxtDisplayString(2. "%3d DB".sensorSoundDB). motor[motorA]=75. motor[motorA]=0. medir la cantidad de sonido que existe en el ambiente. SensorValue[S4]).Sensor de Sonido o Sound El sensor de Sonido o Sound nos permite. "%3d DB". } else{ nxtDisplayString(2. Se puede conectar en cualquier puerto y se debe declarar antes de ser usado. El sensor de sonido no detecta tonalidades o sonidos específicos. como lo dice su nombre. pero si encuentra un obstáculo debe de dar vuelta hacia un lado y continuar haciendo su función. } } } PROBLEMA #5 Escriba un programa que haga que el robot avance a una velocidad variante según la cantidad de ruido en el ambiente: a más ruido más velocidad. pero los valores que devuelve un valor entre 0 y 100% siendo el 0 la ausencia de sonido en el ambiente. aunque teóricamente es posible usar el sensor para dar ordenes orales al robot. SensorValue[S4]). para hacerlo se utiliza el parámetro: sensorSoundDB. Octubre 2007 24 .

Infrared Seeker. Octubre 2007 25 . Entre estos sensores se encuentran: • • • • • El sensor de aceleración. El sensor de brújula. Giroscopio.Otros Sensores para el NXT Existen en el mercado diversos sensores disponibles para el Lego NXT. soporta hasta treinta dispositivos diferentes. con el cual se pueden conectar sensores de otros robots. Se puede conseguir en Internet y tiene un costo aproximado de $39 USD Elaborado por: Eduardo Muñíz Trejo. También existe en el mercado un adaptador de sensores. gracias a que éste a liberado los controladores y la documentación técnica para su construcción compatible con el NXT. . tanto los construidos por MindStorms como por otras compañías independientes de Lego. El sensor de color.

Se requiere de dos variables: X y Y. 99. // der La pelota se pinta mediante la funcion nxtDrawEllipse(). 64). Octubre 2007 26 . Para hacerlo usamos la función: nxtDrawLine(). Si la pelota cae hacia la zona inferior sin que la barra la toque. Se coloca en el margen de la pantalla una barda. y tiene su origen (0. 0. 0. en la parte inferior se deja libre y se coloca una pequeña barra que solo se mueve de un lado a otro (según lo indique el usuario con el teclado).0) en la esquina inferior izquierda de la pantalla. una del punto de origen y otra del punto de destino. el juego se termina. Primero dibujaremos el borde. 0. 55. Lo primero que debemos hacer es pintar nuestro escenario en pantalla tal y como se muestra en la figura: Para logralo necesitamos saber que la pantalla esta dividida en una cuaricula de 70*100 pixels. Pero siendo la pelota un objeto que se estará moviendo durante todo el juego es necesario que sus parametros sean variables. asi necesitamos declarar dos variables al principio del código y las inicializamos como x=30 y y=50. que reyena un circulo previamente pintado. que es algo que se mantiene constante durante todo el juego.Trabajando con la Pantalla – Un caso practico Es momento de plantear un programa que implique todo un reto en comparación con lo visto hasta el momento. 55). Elaborado por: Eduardo Muñíz Trejo. Pintemos pues las tres líneas que conforman nuestro borde: nxtDrawLine(0. Ambas funciones reciben dos parejas de parametros como la anterior. 64). la función pinta una línea recta de un punto a otro. se coloca una pelota mas pequeña o por lo mucho del tamaño de la barra y se programa de tal forma la pelota que rebote en las paredes. se debe de llevar un conteo visible en todo momento de los golpes que le de la barra a la pelota. ya que su movimiento es en estos dos ejes. que dibuja un ciculo y la función nxtFillEllipse(). se trata de realizar un sencillo videojuego que se pueda jugar desde el teclado del Brick. 99. // izq nxtDrawLine(0. // sup nxtDrawLine(99. que recibe dos parejas de argumentos.

y-8). la pelota se moverá hacia el origen. Ahora debemos dotar a nuestra pelota de movimiento. PlaySound(soundShortBlip).rx+15. una en Y y otra en X. nxtDrawRect(rx. } if(x>=90){ // muro der Elaborado por: Eduardo Muñíz Trejo. la pelota se moverá hacia arriba. A continuación necesitamos definir el movimiento de la pelota. por tanto solo se requiere una variable en ese eje. cuyo movimiento se limita solo al eje X. y. si por ejemplo: fx=0 y fy=1. esto es porque todos los numeros deben ser variables. y de esta forma mantengo la constante en el tamaño de la pelotita. para ello debemos tener dos fuerzas. y. la pelota no se moverá de su lugar.x+8.x+8. y=y+(fy). + + . Notaras que en la segunda pareja e utilizado una suma y una resta. Se utilizan los paréntesis para obligar al compilador a hacer una suma algebraica (+ + + = +. Octubre 2007 27 .Ahora si podemos pintar la pelota usando estas dos variables: nxtDrawEllipse(x.6.y-8). nxtFillEllipse(x. Si las fuerzas fx y fy se encuentran en cero. que son a su vez variables que llamaremos fx y fy respectivamente. Por cuestiones prácticas sólo pueden ser estos tres valores: -1.= -). 1.5). escribamos las siguientes condicionales: if(x<=1){ // muro izq fx=1. El movimiento de la pelota se da en cada ciclo con estas sentencias: x=x+(fx). requiero otra variable con la cual pueda controlarlo. iniciemos fx y fy con cualquier valor y antes de ejecutar el código. Si fx=-1 y fy=-1. *Como el movimiento en X de la pelota es independiente al de la barra. Pintaremos ahora la barra inferior. // utilizo DrawRect para mejorar su apariencia visual. 0.

uno para controlar el selector derecho y otro para controlar el selector izquierdo: If (nNxtButtonPressed == kLeftButton ){ } if( nNxtButtonPressed == kRightButton ){ } Ahora hemos utilizado dos constantes que hacen más legible el código que solo usar 1 o 2 según el botón presionado. Dentro de este IF colocaremos dos if más. PlaySound(soundShortBlip). } Nuestra pelota ahora si puede rebotar en las paredes. Sin embargo. Octubre 2007 28 . } } if( nNxtButtonPressed == kRightButton ){ Elaborado por: Eduardo Muñíz Trejo.fx=-1. } if(y>=54){ // techo fy=-1. Necesitamos primero saber si se ha presionado una tecla: If ( nNxtButtonPressed > 0 ) { } La función nNXTButtonPressed regresa un número mayor que cero dependiendo de que botón se presione. por eso. en cada uno de estos if incluimos un if de control: If (nNxtButtonPressed == kLeftButton ){ If ( rx > 3 ){ rx=rx-4. nuestra barra también debe de limitarse al área del juego y no poder salirse de ella por más clics que de el usuario. Sólo falta hacer que nuestra barra se pueda mover con los selectores. PlaySound(soundShortBlip).

if ( rx > (397-15) ){ rx=rx-4. } El contacto con la pelota por parte de la barra es un poco mas complicado de programar. El Contacto se da cuando el punto Y inferior de la pelota (y-8) coincide con la altura del Y superior de la barra y además el punto X de la pelota esta a la altura del punto X de la barra. } } El código completo del programa es éste: Elaborado por: Eduardo Muñíz Trejo. Lo primero se logra tomando la posición de Y de la pelota y comparándola con la de la barra. pero sigue existiendo un contacto en el punto X derecho de la pelota (x+8) y el punto X derecho de la barra(rx+15). If ( y < ry ){ Perdio(). Octubre 2007 29 . obviamente la barra no podrá jamás rebotar la pelota hacia arriba. PlaySound(soundShortBlip). Que en RobotC seria: if ( (y-8) <= ry ){ if( (x>=rx) && (x+8<=rx+20) ){ dy=dy*-1. y el juego se detiene. } } Faltan dos cosas: Cuando pierde el jugador y cuando tiene contacto con la barra la pelota. si la Y de la pelota es menor que la de la barra.

x+8. int golpes=0. } if(y>=54){ // techo fy=-1. nxtDrawRect(rx. 55). 64). } if ( nNxtButtonPressed > 0 ) { if (nNxtButtonPressed == kLeftButton ){ if ( rx > 3 ){ rx=rx-4. // der nxtDisplayString(2. PlaySound(soundShortBlip). 55. // sup nxtDrawLine(99. } } } if ( (y-8) <= ry ){ if( (x>=rx) && (x+8<=rx+20) ){ dy=dy*-1.task main(){ int x=30. y. wait10Msec(300)."PERDIO!"). } } if( nNxtButtonPressed == kRightButton ){ if ( rx > (397-15) ){ rx=rx-4. golpes = golpes + 1. if(x<=1){ // muro izq fx=1.6. } } if ( y < ry ){ eraseDisplay(). } if(x>=90){ // muro der fx=-1.40. nxtDisplayBigStringAt(10. 0. while(true){ nxtDrawLine(0. y. // izq nxtDrawLine(0.y-8).*/ x=x+(fx). 64).5).golpes). 99. nxtFillEllipse(x. int rx=15. PlaySound(soundShortBlip). 0. int y=50. int fy=-1. nxtDrawEllipse(x. /* utilizo DrawRect para darle mas solides visual.y-8). PlaySound(soundShortBlip). int fx=1. 99. y=y+(fy). } } }//while Elaborado por: Eduardo Muñíz Trejo. "%2d". PlaySound(soundDownwardTones). 0. Octubre 2007 30 .rx+15.x+8.

ANEXO PROBLEMAS RESUELTOS PROBLEMAS PARA RESOLVER 2 FUNCIONES LISTAS PARA USAR BREVE HISTORIA DE MINDSTORMS INSTALACIÓN DE ROBOTC .

sensorSONAR).//Detengo el robot motor[motorB]=0. Octubre 2007 32 . } } } Elaborado por: Eduardo Muñíz Trejo.//detengo la ejecucion del por 200 nanosegundos motor[motorA]=0.//Giro a un lado motor[motorB]=75. motor[motorB]=75. motor[motorB]=75. wait10Msec(10).Problemas Resueltos Problema #01 task main(){ while(nMotorEncoder[motorA]<(365*4)){ motor[motorA]=75. } Problema #02 task main(){ SetSensorType(S1. while(true){ if(SensorValue[S1]>35){ motor[motorA]=75. motor[motorB]=75. } motor[motorA]=-75. }else{ motor[motorA]=-75. wait10Msec(20).

}else if( (SensorValue[S1]<39) && (SensorValue[S1]>20) ){ //esta cerca. while(true){ if(SensorValue[S1]>=40){ //Busco la mano girando en mi eje motor[motorA]=65. } } } Elaborado por: Eduardo Muñíz Trejo. motor[motorB]=75.Problema #03 task main(){ SetSensorType(S1. la sigo motor[motorA]=75. motor[motorB]=0. Octubre 2007 33 .sensorSONAR). motor[motorB]=-65. }else{ //esta muy cerca. me detengo motor[motorA]=0.

}else{ motor[motorA]=75. SetSensorType(S2. Octubre 2007 34 . motor[motorB]=-65. } }//while } Elaborado por: Eduardo Muñíz Trejo. motor[motorB]=0. while(true){ //esto siempre se ejecuta nxtDisplayString(2.Problema #04 task main(){ SetSensorType(S1.sensorLigthActive). "IR:%3d". //Sonido del IR if(SensorValue[S2]>=40){ //veo la fuente luminosa if(SensorValue[S1]<30){ //existe un obstaculo motor[motorA]=0.sensorSONAR). SensorValue[S2]). SensorValue[S1]).10). PlayImmediateTone(SensorValue[S2]. "SO:%3d". nxtDisplayString(2. } }else{ //no veo nada motor[motorA]=65. motor[motorB]=75.

wait10Msec(30).sensorSONAR). Octubre 2007 35 . "SO:%3d". motor[motorB]= SensorValue[S4].sensorLigthActive). }else{ //avanzo en línea recta motor[motorA]= SensorValue[S4]. while(true){ //informacion constantemente actualizada nxtDisplayString(2. SensorValue[S4]). motor[motorB]=75.Problema #05 task main(){ //declaro sensores SetSensorType(S1. SensorValue[S2]). "DB:%3d". nxtDisplayString(3. SetSensorType(S2. nxtDisplayString(4. SensorValue[S1]). } } } Elaborado por: Eduardo Muñíz Trejo. "IR:%3d". SetSensorType(S4. if(SensorValue[S1]<30){ //veo un obstáculo motor[motorA]=-75.sensorSoundDB).

para lograrlo. Si escucha dos ruidos fuertes (procura que sean aplausos) debe de apagarse. Problema D Usando tres etiquetas de colores diferentes. *Usa la función: powerOff(). crea una pequeña ciudad. Problema B Construye un pequeño circuito compuesto por una línea negra sobre un fondo blanco y programa tu NXT para que sea capaz de seguirla. Problema C Usando el programa anterior logra que tu robot pinte en pantalla el circuito conforme lo este recorriéndolo. Te recomiendo mucho usar el sensor de color y no el IR. selecciona dos o tres puntos. Octubre 2007 36 . Eficientiza lo más que puedas el código para que llegue lo mas pronto posible. Si detecta el encendido de la luz del cuarto debe de emitir un sonido y desplegar en pantalla un mensaje pidiendo que la apaguen pues es de noche. o del área de pruebas y logra hacer que tu robot sepa donde ésta sólo por el código de colores. combínalas en series de 3 y haz que tu robot pueda reconocer estos colores. pintes un píxel. etiquétalos con las series del problema D y has que mediante la lectura de estos códigos tu robot sea capaz de ir a otro punto que tú le pidas mediante teclado. usa una escala. Si cuentas con brújula has que marque en todo momento el norte. Luego asigna una etiqueta a un lugar especifico de tu casa. si así es: prende un led conectado al puerto C. Elaborado por: Eduardo Muñíz Trejo. luego has que mediante encoder sea capaz de determinar que distancia mide el circuito. Te recomiendo que por cada 5 cm. Problema E Usando la misma técnica que con el circuito del problema B. y que mediante sonar detecte si “algo” (persona o animal) se movió frente a él.Problemas para resolver Problema A Programe un robot ”nocturno” que se pueda colocar en una mesa de noche o en un buró.

// motor Izquierdo }else if(nMotorEncoder[motorA]<nMotorEncoder[motorB]){ motor[motorA]=Velocidad+(nMotorEncoder[motorB]-nMotorEncoder[motorA]). } Adelante: Evita que el robot avance ligeramente inclinado hacia un lado void Adelante(int Velocidad){ //antes de llamar la función por primera vez. según el número de encoders que tenga de retraso. es necesario reiniciar los encoders. motor[motorA]=Velocidad. if ((nImmediateBatteryLevel < 7500) && (nImmediateBatteryLevel > 7100)){ nxtDisplayTextLine(6."** BATERIA BAJA **"). %3. acelero la del menor avance.2f V". // motor derecho motor[motorB]=Velocidad+(nMotorEncoder[motorA]-nMotorEncoder[motorB])."** BATERIA NULA **")."Bat. } } Elaborado por: Eduardo Muñíz Trejo. }else if(nImmediateBatteryLevel < 7000){ // la batería mínima aceptada por el NXT es de 6300 nxtDisplayTextLine(6. }else{ // ambas llantas van igual motor[motorA]=Velocidad. if (nMotorEncoder[motorA]>nMotorEncoder[motorB]){ //si una llanta ha avanzado mas que la otra. motor[motorB]=Velocidad.Funciones Listas para usar Batería: Muestra el control sobre la bateria del NXT nxtDisplayTextLine(5. motor[motorB]=Velocidad.nImmediateBatteryLevel / (float) 1000). //*aumento la velocidad. Octubre 2007 37 .

Seymour Papert. Febrero de 1999: Robotics Discovery Set™. Octubre 2007 38 .Breve historia de MindStorms 1986: Se comercializan los primeros productos controlados por ordenador de LEGO. kit de construcción de robots preprogramados y con control remoto. Vision Command System™ (un kit de expansión para el RIS con una cámara para PC) y el kit de expansión Exploration Mars™ (propuestas temáticas sobre Marte. Dark Side Developer Kit™ (kit de construcción de robots preprogramados y con control remoto). 1 de diciembre de 1998: Robotics Invention System 1. Enero a Febrero 1998: LEGO MINDSTORMS y Robotics Invention System son presentados en público en Ferias del Juguete en Nürnberg. Septiembre 1998: Robotics Invention System es lanzado simultáneamente en Estados Unidos y Reino Unido. Enero 2006: La siguiente generación de robótica LEGO MINDSTORMS es presentada en la Muestra Internacional de Electrónica de Consumo. instrucciones de construcción y juegos para el RIS) son presentados en la Feria Internacional del Juguete de Nueva York. son presentados en la Feria Internacional del Juguete en New York. 1988: El Grupo LEGO y el MIT (Instituto Tecnológico de Massachusetts) empiezan a colaborar en el desarrollo de un “ladrillo inteligente” que de vida a las creaciones LEGO vía programación por ordenador. del Massachusetts Institute of Technology’s Development Laboratory of Computer Learning se convierte en “LEGO Profesor de Investigación Educativa”. y el Droid Developer Kit™. London y New York.0 se agota antes del boom navideño. un producto derivado del Robotics Invention System que permite a los usuarios programar directamente el pequeño ladrillo sin necesitar el ordenador. Elaborado por: Eduardo Muñíz Trejo. 1989: Dr. Febrero de 2000: Robotics Invention System 2.0. También están disponibles dos expansiones: RoboSports y Extreme Creatures. Febrero 2001: SpyBotics. son presentados en la Feria Internacional del Juguete en Nueva York. una serie de robots programables y controlables remotamente que simulan un juego de espionaje.

3. De clic en el icono de RobotC y seleccione la opción “Evaluate RobotC for MindStorms” de la ventana emergente. Ejecute el programa de Instalación desde el icono de RobotC. o inserte la licencia correspondiente. que se instala de la misma forma que RobotC. 2. Una vez concluida la instalación es necesario instalar el Firmware de Lego. 4. 4 1 2 Elaborado por: Eduardo Muñíz Trejo. ahora puede ejecutar RobotC en su computador. que se limitan básicamente a dar clic en “Next” y en “Finish”. Reinicie la computadora para que pueda utilizar RobotC. Siga las instrucciones del Asistente de Instalación. Bien. Octubre 2007 39 .Instalación de RobotC 1. que se puede adquirir desde Internet.

Octubre de 2007. Elaborado por: Eduardo Muñíz Trejo.Taller de introducción al lenguaje de programación RobotC “Del juego al robot el camino es Lego” Creative Commons 2007 Eduardo Muñíz Trejo. compañías. El presente documento esta protegido bajo licencia Creative Commons Atribución-No Comercial-Licenciamiento Recíproco 2. Octubre 2007 40 . México.org/licenses *Las marcas. respetando en todo momento la autoría de los mismos. http://creativecommons. imágenes y nombres mostrados en este documento son propiedad de sus respectivos autores y se muestran sólo con fines ilustrativos.5 México y se distribuye “tal cual esta” por tanto no se garantiza la funcionalidad o veracidad de la información aquí expresada.

Sign up to vote on this title
UsefulNot useful