Programar el Lego NXT desde cero con RobotC
Este es en general el IDE de RobotC, cuando creemos un nuevo proyecto, podremos editar el código fuente, compilarlo y descargarlo al NXT. Todo desde esta interfaz.
Descargando el firmware
Recuerdan que descargamos e instalamos un driver para que la computadora reconociera el NXT pero además necesitamos que RobotC se pueda comunicar con el NXT y para esto, vamos a instalarle un firmware al NXT. Éste ya no es necesario descargarlo de internet pues viene junto con RobotC.
Lo primero que debemos hacer es conectar el Lego NXT a nuestra computadora con el cable USB:
Después, para bajarle el firmware al NXT damos clic en Robot > Download Firmware > Standard File:
Nos aparecerá una pantalla con el nombre del Robot y la dirección donde está. Desde esta pantalla podemos cambiarle el nombre al robot, que por default trae “NXT”. Pero lo más importante que hay que hacer en esta pantalla es descargar el firmware así que le damos clic en F/W Download.
.
Conectamos todo en su lugar
Antes de empezar a programar, debemos armar el NXT de tal manera que sepamos en dónde están conectados cada uno de los motores o sensores. Para este ejemplo, simplemente voy a colocar un motor y los sensores de esta forma.
Así que el motor está conectado al puerto A, el Touch al 1 y el Sonar al 2 (En la foto no se muestra el sonar). Algo muy importante es que los motores sólo pueden ir conectados a los puertos A, B y C; mientras que los sensores sólo pueden ir conectados al 1, 2, 3, 4.
A programar.
Ya tenemos todo listo para empezar a programar, así que vamos a ir al menú de inicio y crearemos un nuevo archivo. (File -> New File). Ahí nos saldrá una nueva pantalla en blanco donde nosotros podremos escribir nuestro código:
Cuando tengamos listo el código, tenemos que compilarlo y descargarlo al robot, para esto, nos vamos aRobot > Compile and Download Program pero en este caso solo lo compilaremos:
Como podemos obserbar no tenemos ningun error :)
Bueno ahora comencemos a crear nuestro primer programa:
Vamos a hacer que el motor se mueva indefinidamente y para esto colocaremos el siguiente código:
Notarán que, obviamente, la sintaxis de RobotC es muy parecida a C. Analicemos cada parte de este sencillo código:
task main() Es idéntico a lo que sería colocar void main() en C puro, lo que ocurre aquí es que los programas los ve como tareas (tasks en inglés) así que lo que le estamos diciendo es que cree una tarea y que será la principal. |
while( true ) Esto significa, para los que saben C, que jamás vamos a salir de este ciclo (a menos que usemos una instrucción break). La razón de usar este tipo de ciclo es porque no queremos que el robot deje de girar el motor nunca, o más bien, hasta que le digamos que se detenga aprentando el botón gris del NXT. |
motor[motorA] = 60; Con esta instrucción le indicamos al robot que mueva el motor A a una potencia del 60% de la batería. Si quisiéramos mover el motor B, simplemente cambiaríamos la palabra motorA por motorB, también si queremos que vaya un motor en reversa, el número al que se iguala lo ponemos negativo. |
Programando motores y sensores
Ya vimos la sintaxis básica para programar con los motores, ahora pasemos a algo un poco más complicado y es leer valores desde los sensores y tomar decisiones con ellos. Coloquemos entonces este código y ejecutémoslo:
Vemos que tomamos el código anterior pero le hicimos algunos cambios. Este código lo que hace es girar el motor en un sentido y cuando nosotros oprimamos el sensor touch, el motor va a cambiar la dirección en qué gira. Veamos entonces paso a paso cómo funciona el código:
int Velocidad = 50 – Igual que en C puro, nosotros podemos crear variables y asignarles valores. En este caso, usamos la variable velocidad para indicar la potencia y la dirección del movimiento del motor. |
SetSensorType(S1, sensorTouch) – Cuando nosotros conectamos un sensor, nuestro robot no tiene ni la más remota idea de qué tipo de sensor se trate y cómo comunicarse con él, así que con esta instrucción le decimos que el sensor conectado en S1 (Puerto 1) es de tipo Touch. (Podemos colocar desde S1 hasta S4) |
if( SensorValue(S1) == 1 ) – Esta condición lo que checa es el valor del sensor en el puerto S1. Para el caso del sensor Touch, los valores que nos devuelve es 0 si no está apretado y 1 si lo está así que esta condición nos dice que se ejecutará lo de adentro cuando el sensor touch esté apretado. |
Velocidad = Velocidad * -1; – Esta instrucción cambia el signo de la velocidad, por lo que el sentido del movimiento cambiará cuando se cumpla la condición. |
while( SensorValue(S1) == 1 ){ } – Debido a que el programa se ejecuta muy rápido y los sensores cambian con una velocidad más lenta, usamos este while para esperar hasta que el sensor no esté apretado para entonces cambiar el sentido. |
Programando otros sensores.
Ya vemos cómo programar el sensor de tacto para cambiar la dirección del movimiento de los motores, veamos ahora cómo usar otro sensor más: el Sonar.
El sensor Sonar ve qué tan lejos se encuentra un objeto mandando una señal ultrasónica. Nosotros podemos leer el valor regresado por el sensor al igual que hicimos con el touch, sin embargo, ahora en lugar de recibir sólo un 1 o un 0, recibiremos un valor numérico representando qué tan lejos está el objeto.
Vamos a escribir un programa muy simple que disminuya su velocidad cuando se vaya acercando a un obstáculo, hasta detenerse por completo cuando estemos a pocos centímetros. Así que escribamos el siguiente código:
Vemos que en este caso, cambiamos la función SetSensorType y colocamos que el sensor sonar está colocado en el puerto 2. Además, podemos observar también que ahora usamos SensorValue(S2) para devolvernos no sólo un valor sino un rango de valores que va de 0 a 255 dependiendo qué tan lejos esté el objeto. Entre más cerca esté el objeto, el valor del sensor será más pequeño y por lo tanto la velocidad del robot velocidad también.
Bueno eso todo por hoy espero escribir pronto.