Manejo básico del LCD y los botones en RobotC

This entry is part 1 of 14 in the series RobotC

ROBOTCskewlogoRobotC es un lenguaje para robótica educacional basado en C, con un entorno de desarrollo bastante sencillo. RobotC da soporte a diversas plataformas de robótica, entre ellas a LEGO Mindstorms NXT. El objetivo de esta nueva serie de artículos sobre RobotC es acercar a la gente a este entorno, que nos permite crear programas más complejos que NXT-G con bastante facilidad.

Manejo básico de los botones:

En RobotC no hay muchas maneras de controlar dos botones, de hecho la forma de controlarlos es más bien mediante variables en vez de funciones. En cualquier caso estas variables son suficiente para controlar los botones y darles casi cualquier uso que necesitemos. Las dos variables que usaremos serán:

nNxtButtonPressed: Contiene un identificador del botón que está siendo apretado (puede ser ninguno). Mediante esta variable podemos saber que botón acabamos de apretar.

nNxtExitClicks: Puesto que al apretar el botón Exit los programas se abortan, no podremos usar un programa que usa el botón Exit a no ser que cambiemos el valor de esta variable. Esta variable nos indica el número de veces que hay que apretar el botón Exit para abortar un programa (que por defecto será 1).

Con estás dos variables podremos hacer programas que realicen acciones según que botón haya sido apretado.

nxt-brick-labeled

Manejo básico del LCD:

El LCD tiene una gran cantidad de funciones en RobotC, que sirven para mostrar texto, números, o incluso figuras geométricas. En este artículo os pondré las dos más útiles para un manejo básico:

eraseDisplay(): Limpia el LCD, borrando todo lo que hubiera anteriormente escrito.

nxtDisplayTextLine(num_linea, “Texto y tipos de variables extra”, var_extra1, var_extra2, …) : Muestra una frase (o cadena de texto) en la pantalla en la línea indicada, y el valor de las variables extra en el lugar indicado. Los tipos de variables son de la siguiente manera:

- Entero decimal: “%d”
- Notación científica (mantisa/exponente) usando el caracter e “%e”
- Notación científica (mantisa/exponente) usando el caracter E “%E”
- Decimal de coma flotante “%f”
- Octal “%o”
- Cadena de caracteres “%s”
- Entero hexadecimal sin signo “%x”
- Entero hexadecimal sin signo (letras mayúsculas)”%X”
- Caracter “%c”

Todo esto se ve más claro en el programa de prueba que viene a continuación, donde hay un ejemplo de cadena de texto con una variable tipo integer en medio.

nxtDisplayCenteredTextLine(num_linea, “Texto y tipos de variables extra”, var_extra1, var_extra2, …) : Lo mismo que la función anterior, pero centrado en la línea.

Con estas funciones podemos escribir cualquier tipo por pantalla, no solo texto, por lo que tenemos la mayoría de funcionalidad que necesitamos. Es importante usar el eraseDisplay() para limpiar la pantalla cada vez que queramos escribir una cosa nueva, si no queremos que se nos mezcle con lo que hubiera escrito anteriormente.

Programa de prueba:

El objetivo del siguiente programa es mostrar qué botón está siendo apretado en cada momento. Además, para que el programa no se aborte cuando aprietes el botón Exit se ha modificado el valor de nNxtExitClicks a 3, y se ha creado un contador que va indicando al usuario cuantas veces tiene que apretar el botón Exit para que se acabe el programa. El programa quedaría así:

{
nNxtExitClicks = 3;
int contador = 3;
while(contador > 0){
nxtDisplayTextLine(1, " Pulse cualquier ");
nxtDisplayCenteredTextLine(3, "boton");
nxtDisplayTextLine(5, "%d Clicks en EXIT", contador);
nxtDisplayTextLine(7, " para salir ");
switch (nNxtButtonPressed)
{
case kLeftButton: eraseDisplay();
nxtDisplayTextLine(3, "Boton izquierdo");
nxtDisplayTextLine(5, " pulsado");
wait1Msec(2000);
eraseDisplay();
break;
case kRightButton: eraseDisplay();
nxtDisplayTextLine(3, " Boton derecho");
nxtDisplayTextLine(5, " pulsado");
wait1Msec(2000);
eraseDisplay();
break;
case kEnterButton: eraseDisplay();
nxtDisplayTextLine(3, " Boton Enter");
nxtDisplayTextLine(5, " pulsado");
wait1Msec(2000);
eraseDisplay();
break;
case kExitButton: eraseDisplay();
nxtDisplayTextLine(3, " Boton Exit");
nxtDisplayTextLine(5, " pulsado");
contador--;
wait1Msec(2000);
eraseDisplay();
break;
}
}
return;
}

Puesto que es el primer programa que voy a explicar en RobotC, lo haré linea por linea para que lo podáis entender todo (número de linea – explicación):

02 - Modificamos el valor de nNxtExitClicks para que valga 3, por lo que será necesario apretar 3 veces el botónExit para salir del programa.

03 - Creamos un contador cuyo valor sea 3, el cual iremos reduciendo cada vez que apretemos el botón Exit, para saber cuantos clicks nos quedan.

04 - Creamos un bucle que se repetirá hasta que contador valga 0.

05 a 08 - Escribimos Pulse cualquier boton %d Clicks en Exit para salir en el LCD. Cuando muestre por pantalla esto, no mostrará “%d”, sino el valor de la variable contador incluida esa misma función. Por ejemplo la primera vez que se muestre mostrará algo como:

Pulse cualquier
boton
3 Clicks en Exit
para salir

09 - Switch es una estructura de programación que lo que hace es mirar que valor hay en la variable (nNxtButtonPressed en este caso), y ejecutar la parte de programa que corresponda con el valor de esa variable. En este caso es:

11 - Si el botón izquierdo ha sido pulsado ejecutará estás líneas hasta el break:
11 - Limpiamos la pantalla para poder escribir.
12 y 13 - Mostramos por el LCD que el botón izquierdo a sido pulsado.
14 - Dejamos el programa parado durante 2000 milisegundos (2 segundos), por lo que se mostrará por pantalla lo escrito anteriormente.
15 y 16 - Volvemos a limpiar la pantalla y salimos del switch con un break();

17 a 22 - Lo mismo con el botón derecho.

23 a 28 - Lo mismo con el botón Enter.

29 a 35 - Lo mismo con el Exit. Notar que en la línea 34 reducimos el valor de contador en 1 (contador– es lo mismo que decir contador = contador -1).

Los corchetes “{” y “}” significan que todo lo que haya en medio pertenece a quién los ha abierto. Por ejemplo el switch (nNxtButtonPressed) { abre corchetes, y los cierra después de todos los case, ya que pertenecen a él. Igualmente pasa con el bucle while(true) o con el mismo programa entero, que esta contenido todo dentro de unos corchetes significando que pertenecen al cuerpo principal del programa.

Por último decir que si os surgen dudas no tengáis reparo en escribir en el foro.

Series NavigationSigue Líneas en RobotC >>
facebooktwittergoogle_plusredditpinterestlinkedinmailfacebooktwittergoogle_plusredditpinterestlinkedinmail

facebooktwittergoogle_pluslinkedinrssyoutubefacebooktwittergoogle_pluslinkedinrssyoutube

Comments are closed.