NXC – Extras: Entendiendo El Simulador

El simulador podemos iniciarlo yendo al menú nxcSimulador y seleccionando «Abrir nxcSimulador → F8«.

Como vimos en los ejemplos anteriores, si ya tenemos un programa realizado, haciendo clic en el botón «play verde»; con esto ya abrimos el simulador y comienza a correr el mismo (opción recomendada):

 

Sin embargo, podemos controlar otras acciones utilizando las opciones de esta ventana.

La interfaz, es bastante intuitiva, pero veremos cómo configurar nuestro robot para que el programa que realizamos se pueda alinear al modelo virtual.

Para ello, iremos al menú RobotEditar Robot y allí se abrirá una primer ventana con estas opciones:

 

 

Aquí configuraremos los motores (sólo 2). Como vemos, la interfaz es bastante clara con respecto a las guías que podemos modificar modificar (si es necesario): distancias, puertos, nombre del programa.nxc.

La única «observación» que debemos tener en cuenta, es que la limitación del simulador es que siempre supone que trabajamos con una especie de «carrito» de este tipo:

 

(Imagen sólamente ilustrativa)

Con respecto a los sensores, su configuración va a estar basada en ejes de coordenadas x,y de dónde están colocados los mismos. Se encuentran en la seguda pestaña de la edición del robot y se ve de la siguiente manera:

 

 

Aquí también podremos modificar todos aquellos puertos que deseemos, así como la posición de los sensores.

Para finalizar y sólo a modo decorativo, la tercer pestaña nos permite modificar el formato del brick, las ruedas y el color de la línea punteada (rastro que va dejando nuestro robot mientras se mueve):

 

 

Una vez configurado nuestro robot, podemos guardarlo en la ventana principal del Simulador, bajo el menú Robot Guardar robot y recuperarlo con la opción Seleccionar robot.

 

NXC: Actividad de Cierre

La actividad consta en realizar un modelo robótico (de cualquier forma y dimensión) que cumpla con un objetivo específico, programado mediante el nxcEditor y enviarlo para su evaluación.

Se podrá enviar un video demostrando el funcionamiento del robot, pero es obligatorio enviar el programa con el que fue programado para su evaluación.

NXC: Ejercicio 8

Pregunta 1

Deseo crear una variable de nombre «distancia» cuyo valor inicial será de «35». ¿Cuál de las siguientes sentencias es correcta?

a  int distancia = 35;
b  distancia = int 35
c  distancia; = 35
d  int 35 = distancia

Pregunta 2

Para la creación de variables, ¿cuáles son algunos de los diferentes tipos que podemos usar?

a  onfwd
b  define
c  onrev
d  bool
e  wait
f  string
g  int

Pregunta 3

¿De qué manera podemos crear constantes?

a  define#
b  #define
c  define
d  constante = 1;

Pregunta 4

De acuerdo al siguiente fragmento de programa, ¿cuánto vale la variable al final de su ejecución?

int miValor = 15;

task main() {

repeat(5) {

miValor += 5;

miValor = 2;

}

}

a  15
b  2
c  40
d  50

NXC: Variables y Constantes

Las variables constituyen un aspecto fundamental de cualquier lenguaje de programación. Las variables son posiciones de memoria en las cuales podemos guardar un valor para luego usarlos y cambiarlos si es necesario.

Por otro lado, definir constantes mejora la legibilidad del programa y permite cambiar rápidamente sus valores, para volver a probar nuestro programa con este nuevo valor.

Para definir una variable, únicamente colocaremos el nombre de la misma y la igualaremos al valor inicial; por ejemplo:

esperar = 1000;

 

También podemos definir el tipo de variable al comienzo de la misma. Las más comunes son:

int → la variable guardará sólo valores numéricos enteros.

string → la variable guardará texto.

bool → la variable será del tipo lógico (verdadero, true; falso, false)

 

Para el ejemplo anterior, podríamos haber creado la variable escribiendo:

int esperar = 1000;

 

Para los casos de las constantes, su definición la realizaremos de la siguiente manera:

#define potenciaMotores = 75;

 

La idea de uso tanto de las variables como de las constantes, es colocarlas en lugar del valor que poseen y de esta manera entender mejor las acciones de nuestro programa.

 

Tomemos un ejemplo que ya vimos:

#define botonPresionado = 1;
int potenciaMotor = 50;
int gradosMotor = 15;

task main(){
     SetSensorTouch(IN_1);
     while(true){
          if (SENSOR_1 == botonPresionado) {
               RotateMotor(OUT_B, potenciaMotor, gradosMotor);
               potenciaMotor += 10;
          }
     }
}

 

 

Explicación:

Cada vez que presionemos el botón, el motor que está en el puerto B girará 15 grados con una potencia incial de 50, pero la misma se incrementará de a 10 por cada vez.

Lo interesante de colocar la constante, es que si debo usar este dato a lo largo del programa, y si por algún motivo necesitamos modificarlo, únicamente lo haré al principio (cuando defino la misma).

Podemos apreciar la colocación de operadores que modificarán el valor (numérico) de nuestra variable y las posibilidades son:

+= → suma a la variable el valor que esté a continuación (ver ejemplo arriba)

 -= → resta a la variable el valor que esté a continuación.

*= → multiplica a la variable por el valor que esté a continuación.

/= → divide a la variable entre el valor que esté a continuación.

NXC: Ejercicio 7

Pregunta 1

¿Con qué comando realizo un bucle en el programa?

a  false
b  wait
c  while
d  true

Pregunta 2

Deseo chequear si el botón en el «puerto» se está presionando para realizar una acción, pero sino, que realice otra.

¿Cómo completarías la siguiente estructura para que se realice?

______ (puerto _____ 1) {

acción;

}

_________ {

otra acción;

}

 

Pregunta 3

Relaciona las preguntas, con sus respectivas respuestas.

Columna A                 Columna B
1. ____ &&                    a. diferente que
2. ____ ||                      b. y
3. ____ >                      c. menor que
4. ____ <                      d. o
5. ____ !=                     e. mayor que

Pregunta 4

¿Con qué comando detengo el programa?

a  break
b  freeze
c  stop
d  wait

NXC: Bucles y condiciones

Cada vez que estamos programando nuestro robot, debemos tener en cuenta los valores que nuestros sensores nos devuelven, para poder compararlos y tomar desiciones de acuerdo a éstos. También, puede realizarse en un determinado tiempo o hasta un determinado momento.

Es por este motivo, que debemos tener en cuenta los comandos que a continuación se presentan, ya que son los necesarios para la toma de éstas desiciones.

Para que esta parte nos resulte más fácil, la compararemos nuevamente con bloques que conocemos de la opción «Flujo» del Tortubots.

 

Wait(1000)

La medida está en milisegundos. 


Repeat(4){

}




while(true){

}

Aquí debemos entender, que para este lenguaje de programación, ambas instrucciones se realizan con el mismo comando, pero modificando la «condición». Si escribimos while(true) equivale al «por siempre», pero si queremos que un determinado conjunto de acciones se realizan «mientras» la condición sea verdad (true) escribiremos, por ejemplo:

while(SENSOR_1 = 0){

}

En este ejemplo concreto, se fijará si el botón NO está presionado para realizar la acción que está entre las llaves; en el momento que presionemos el botón, continuará el programa que esté por fuera de las mismas.

 

do{

}
while ( );

A diferencia del «mientras», este boque realizará al menos una vez la acción que está dentro de las llaves, para luego comenzar a comparar lo que se plantee en la condición del while.

 

Al igual que en los bloques «por siempre» o «mientras» aquí utilizaremos el mismo comando pero con alguna variante para cada caso. En el para sólamente SI:

if ( ) {

}

 

Para colocar el «sino» le agregamos:

if ( ){

}
else {

}

Muchas veces necesitaremos comparar valores y para ello utilizaremos:

== igual que
< menor que
<= menor o igual que
> mayor que
>= mayor o igual que
!= distinto de

Puedes combinar condiciones usando && , que significa “y”, o || , que significa “o”. Aquí hay algunos ejemplos de condiciones:

true siempre cierto
false nunca cierto
ttt != 3 verdadero cuando ttt es distinto de 3
(ttt >= 5) && (ttt <= 10) cierto cuando ttt vale entre 5 y 10
(aaa == 10) || (bbb == 10) cierto si aaa o bbb (o ambos) son iguales a 10

 

break

NXC: Ejercicio 6

Pregunta 1

Los puertos de los sensores, son de «entrada» de información… ¿a qué palabra le corresponde esta acción de las siguientes?

a  IN
b  ninguna
c  OUT
d  ambas

Pregunta 2

¿De qué manera configuro qué sensor tengo conectado a un puerto?

a  OnRev
b  Wait
c  SetSensor
d  Sensor_1

Pregunta 3

¿Cuáles son los diferentes sensores que puedo configurar?

a  Contact
b  Strong
c  Touch
d  Light
e  Heat
f  Wind
g  Ultrasonic
h  Sound

Pregunta 4

Para obtener el valor del sensor que está en el puerto 2, escribiré _______ y así poder compararlo y realizar alguna acción.

Sin embargo, si estoy utilizando un sensor de distancia, esto no funcionará adecuadamente y deberé escribir _______(puerto) para que funcione.

NXC: Manejo de sensores

A diferencia de los motores, los sensores podemos conectarlos en cualquiera de los 4 puertos de entrada (IN) que tenemos en nuestro brick. Es por esto que lo primero que debemos hacer es configurar qué sensor tiene cada puerto, para luego utilizar sólo una orden para conocer los valores que el mismo va obteniendo.

La sintaxis sería: FijarSensor_____(EN QUE PUERTO)

Por ejemplo, configuramos (Set) un sensor de tacto (SensorTouch) en el puerto de entrada 1 (IN_1)

En el lenguaje del programa quedaría:

SetSensorTouch(IN_1);

Con sólo esta línea, podremos realizar acciones utilizando el sensor de tacto (pulsador) que está conectado en el puerto 1, simplemente utilizando la orden SENSOR_1 en cualquier parte del programa.

Ejemplo práctico: Cada vez que presionemos el pulsador que está en el puerto 1, el motor conectado en el puerto B girará 15º.

task main(){
     SetSensorTouch(IN_1);
     while(true){
          if (SENSOR_1 == 1) {
               RotateMotor(OUT_B, 100, 15);
          }
     }
}

 

En la próxima sección veremos el uso de comandos para bucles, lógicos y de repetición finita o condicional.

 

Cómo fijar el resto de los sensores:

SetSensorLight → Luz/Grises

SetSensorSound → Sonido

SetSensorUtrasonic → Distancia/Ultrasonido

 

Para leer la intensidad de la luz ambiente con su led apagado, configura el sensor de la siguiente manera:

SetSensorType(IN_3, IN_TYPE_LIGHT_INACTIVE);
SetSensorMode(IN_3, IN_MODE_PCTFULLSCALE);
ResetSensor(IN_3);

Con respecto al sensor de distancia, a la hora de trabajar con él dentro de una comparación, deberemos especificar SensorUS(IN_4) en vez de SENSOR_4 para que nos transforme el valor obtenido en datos fáciles de manejar para el programador.

Pongamos otro ejemplo: deseamos que nuestro robot se detenga cuando tenga un obstáculo a menos de 40 cms. El mismo está configurado de la siguiente manera: Motores en B y C, Sensor de Distancia en puerto 4.

El programa podría quedar de la siguiente manera:

task main(){
     OnFwd(OUT_BC, 60);
     SetSensorUltrasonic(IN_4);
     while(true){
          if (SensorUS(IN_4) < 40) {
               Off(OUT_BC);
          }
     }
}

NXC: Ejercicio 5

Pregunta 1

¿Cuál de las siguientes órdenes indica que trabajaré con motores?

a  OUT
b  indistinto
c  ninguno
d  IN

Pregunta 2

Escribiremos a continuación una orden para que los motores conectados en B y C se muevan hacia adelante con una potencia de 65.

¿Cómo completas esta orden?

On ______ ( ______, _____);

Pregunta 3

Con el comando Off, los motores se detienen bruscamente.

Verdadero

Falso

Pregunta 4

Si deseo que mi motor «gire» una cantidad exacta de grados, utilizaré el comando ________ en lugar de On.

Por su parte, si necesito que los mismos se detengan, pero «con deslizamiento» escribiré ________ seguido de los puerto de los motores.