Introducción a la Programación • Espacio en blanco Actividad5 Reglas RobotC (parte 1) Accede a la Comunidad Virtual y reproduce el video de esta lección. Espacio en Blanco Espacio en Blanco es el uso de espacios, tabulaciones y líneas en blanco para organizar el código visualmente. Los Programadores usan Espacios en Blanco al agrupar fragmentos legibles sin afectar en la lectura que la máquina hace del código. Por ejemplo, un programa que hace avanzar al robot 2 segundos y retroceder 4, su código se lee así: Programa sin espacio en blanco Programa con espacio en blanco task main() { bMotorReflected[port2]=1; motor[port3]=127; motor[port2]=127; wait1Msec(2000); task main() { bMotorReflected[port2]=1; motor[port3]=127; motor[port2]=127; wait1Msec(2000); motor[port3]=-127; motor[port2]=-127; wait1Msec(4000); } motor[port3]=-127; motor[port2]=-127; wait1Msec(4000); } 46 Introducción a la Programación • Espacio en blanco Actividad5 Ambos programas funcionan igual, sin embargo, el segundo usa espacio en blanco para organizar el código al separar dos comportamientos principales: avanzar y retroceder. En este caso, los saltos de renglón se usan verticalemente para separar las tareas. Los espacios en blanco horizontales y tabulaciones también son importantes. Debajo, el espacio en blanco se usa en forma de sangría para indicar las líneas que hay en cada estructura de control (tarea principal, repetición, sentencia si-entonces). Programa sin espacio en blanco task main() { bMotorReflected[port2]=1; while(true) { if(SensorValue(touch)==0) { motor[port3]=127; motor[port2]=127; } else { motor[port3]=-127; motor[port2]=-127; } } } Programa con espacio en blanco task main() { bMotorReflected[port2]=1; while(true) { if(SensorValue(touch)==0) { motor[port3]=127; motor[port2]=127; } else { motor[port3]=-127; motor[port2]=-127; } } } 47 Introducción a la Programación • Palabras Reservadas Actividad5 Palabras resevadas Motores motor[output] = power; Este comando indica al correspondiente motor que se encienda o apague y simultáneamente fije su nivel de potencia. El motor VEX tiene 8 salidas: port1, port2... hasta port8. VEX soporta niveles de potencia desde -127 (reversa) hasta 127 (avance al frente). Un nivel 0 detendrá al motor. motor[port3]= 127; motor[port2]= -127; //port3 - Velocidad al frente //port2 - Velocidad en reversa bMotorReflected[output] = 1; (or 0;) Cuando el valor del comando sea 1, este código invierte la rotación del motor. Una vez fijado, el motor funcionará en reversa el programa entero (o hasta que bMotorReflected[] valga cero). Esto es muy funcional cuando se trabaja con motores montados en direcciones opuestas, permitiéndole al programador usar el mismo nivel de potencia en cada motor. Hay dos configuraciones: 0 es normal, y 1 es reversa. Puedes usar “true” para 1 y “false” para 0. Antes motor[port3]= 127; motor[port2]= 127; //port3 - Velocidad al frente //port2 - Velocidad en reversa Después bMotorReflected[port2]= 1; motor[port3]= 127; motor[port2]= 127; //Invierte la dirección port2 //port3 - Velocidad al frente //motorA - Velocidad al frente 48 Introducción a la Programación • Palabras Reservadas Actividad5 Palabras resevadas Cronometrando VEX permite usar comandos de Espera (Wait) para insertar retrasos en el programa. También soporta “Timers” los cuales funcionan como cronómetros y se pueden reiniciar en cuanto se requiera reanudar la cuenta del tiempo. wait1Msec(wait_time); Esté código hará que el robot espere por ciertos milisegundos antes de ejecutar la siguiente instrucción en un programa. “wait_time” es un valor tipo entero (de 1 = 1/1000 de segundo). El máximo valor de wait_time es 32768 o 32.768 segundos. motor[port3]= 127; wait1Msec(2000); motor[port3]= 0; //port3 - Velocidad al frente //Espera 2 segundos //port3 - apagado wait1Msec(wait_time); wait10Msec(wait_time); Este código hace que el robot espere centésimas de segundo antes de ejecutar la siguiente instrucción del programa. “wait_time” es un valor tipo entero (de 1 = 1/100 de segundo). El máximo valor wait_time es 32768 o 327.68 segundos. motor[port3]= 127; wait10Msec(200); motor[port3]= 0; //port3 - Velocidad al frente //Espera 2 segundos //port3 - apagar time1[timer] Este código convierte el valor de tiempo en un número integral. La resolución de “time1” está en milisegundos (1 = 1/1000th de segundo). El máximo de tiempo que se puede referenciar es 32.768 segundos (~1/2 minuto) VEX tiene 4 cronómetros internos: T1, T2, T3 y T4 int x; x=time1[T1]; //Variable de números enteros x //Asigna x=valor para Timer 1 (1/1000 seg.) 49 Introducción a la Programación • Palabras Reservadas Actividad 5 time10[timer] Este código retorna el valor actual del cronómetro referenciado como un valor entero. La resolución de “time10” está en centésimas de segundo (1 = 1/100 de segundo). El máximo de tiempo que se puede referenciar es 327.68 segundos (~5.5 minutos) VEX tiene 4 cronómetros internos: T1, T2, T3 y T4 int x; x=time10[T1]; //Variable de números enteros x //Asigna x=valor para Timer 1 (1/100 seg.) time100[timer] Este código retorna el valor actual del cronómetro referenciado como un valor entero. La resolución de “time100” está en décimas de segundo (1 = 1/10 de segundo). El máximo de tiempo que se puede referenciar es 3276.8 segundos (~54 minutos) VEX tiene 4 cronómetros internos:T1, T2, T3 y T4. int x;//Variable integral x x=time100[T1]; //Asigna x=valor para Timer 1 (1/10 seg.) Cleartimer[timer] Este código reinicia el cronómetro a cero segundos. VEX tiene 4 cronómetros internos:T1, T2, T3 y T4 ClearTimer(T1); //Reinicia Timer #1 50 Introducción a la Programación • Palabras Reservadas Actividad5 SensorValue(sensor_input) SensorValue se usa para obtener un valor de tipo entero del puerto de sensor especificado. Los valores corresponderán al tipo de sensor del puerto. VEX tiene 16 entradas análogas/digitales: in1, in2... hasta in16 if(SensorValue(in1) == 1) //Si in1 (sensor de contacto) está presionado { motor[port3] = 127; //Velocidad al frente Motor Puerto 3 } Tipo de Sensor Contacto Reflexión (Ambiental) Rotación (Codificador Antiguo) Potenciómetro Seguidor de Línea (Infrarrojo) Sonar Codificador de cuadratura Entradas digitales Salidas digitales Digital Análogo Rango de Valores 0o1 0 a 1023 0 a 32676 0 a 1023 0 a 1023 -2, -1, y 1 a 253 -32678 a 32768 0o1 0o1 Palabras Resevadas Sonidos VEX puede reproducir sonidos y tonos usando una bocina piezoeléctrica conectada a un puerto de motor. PlayTone(frequency, duration); Este comando reproduce un sonido desde la bocina interna VEX a una frecuencia específica (1 = 1 hertz) por una longitud específica (1 = 1/100 de segundo). PlayTone(220, 500); //Reproduce un tono de 220hz por 1/2 segundo 51 Introducción a la Programación • Palabras Reservadas Actividad5 Palabras resevadas Radio Control ROBOTC te permite controlar a tu robot usando entradas desde un Transmisor de Radio Control. bVexAutonomousMode Establece el valor en 0 para radio habilitado ó 1 para radio deshabilitado (modo autónomo). También puedes usar “true” para 1 y “false” para 0. PlayTone(220, 500); //Reproduce un tono de 220hz por 1/2 segundo bVexAutonomousMode = 0; bVexAutonomousMode = 1; //habilita radio control //deshabilita radio control vexRT[joystick_channel] Este comando recupera el valor del canal específico del cual se ha transmitido. Si el receptor RF está conectado al Rx1, los valores siguientes aplican: Puerto de Control Joystick derecho, eje X Joystick derecho, eje Y Joystick izquierdo, eje Y Joystick izquierdo, eje X Botones Traseros Izquierdos Botones Traseros Derechos Canal Joystick Ch1 Ch2 Ch3 Ch4 Ch5 Ch6 Posibles Valores -127 a 127 -127 a 127 -127 a 127 -127 a 127 -127, 0, o 127 -127, 0, o 127 Si el receptor RF está conectado al Rx2, los valores siguientes aplican: Puerto de Control Joystick derecho, eje X Joystick derecho, eje Y Joystick izquierdo, eje Y Joystick izquierdo, eje X Botones Traseros Izquierdos Botones Traseros Derechos Canal Joystick Ch1Xmtr2 Ch2Xmtr2 Ch3Xmtr2 Ch4Xmtr2 Ch5Xmtr2 Ch6Xmtr2 Posibles Valores -127 a 127 -127 a 127 -127 a 127 -127 a 127 -127, 0, o 127 -127, 0, o 127 bVexAutonomousMode = false; //habilita radio control while(true) { motor[port3] = vexRT[Ch3]; //joystick derecho, eje y //controla al motor en puerto 3 motor[port2] = vexRT[Ch2]; //joystick izquierdo, eje y //controla al motor en puerto 2 } 52 Introducción a la Programación • Palabras Reservadas Actividad5 Palabras resevadas Misceláneo Los comandos misceláneos útiles no son parte del lenguaje C estándar. srand(seed); Define el valor integral de “seed” usado en el comando random() para generar un número aleatorio. Este comando es opcional al usar el comando random(), y arrojará la misma secuencia de números generados cada vez que se ejecuta el programa. srand(16); //Asigna 16 como el valor de seed random(value); Genera números aleatorios entre 0 y el número en el paréntesis. random(100); //Genera un números entre 0 y 100 Palabras Resevadas Estructuras de Control La estructura de control en ROBOTC habilita un programa para controlar el flujo fuera del típico estilo de arriba a abajo. task main(){} Crea una tarea llamada “main” necesaria en cada programa. La tarea principal es responsable de asegurar que el código se ejecute en el programa. while(condition){} Usado para repetir una {sección del código} mientras cierta (condición) se mantenga verdadera. Un período de repetición infinito se puede crear asegurando que la condición siempre sea verdadera, p.ejem. “1==1” o “true”. while(time1[T1]<5000) //Mientras el valor del cronómetro sea {menor a 5 seg... motor[port3]= 127; //...el puerto3 del motor se activa al 100% } 53 Introducción a la Programación • Palabras Reservadas Actividad5 if(condition){}/else{} Con este comando, el programa revisa la (condición) dentro del paréntesis de la sentencia y ejecuta uno o dos paquetes de código. Si la (condición) es verdadera, el código dentro de las llaves se ejecutará. Si la (condición) es falsa, el código dentro de las llaves se ejecutará en lugar de aquél. La sentencia “else” no se requiere cuando se utiliza una sentencia “if”. while(time1[T1]<5000)//Mientras el valor delcronómetro sea {menor a 5 seg... motor[port3]= 127; //...el puerto3 del motor corre al 100% } if(sensorValue(bumper) ==1) //el sensor de choque es usado como... {//...la condición motor[port3]= 0; //si está presionado se detiene el motor en el puerto 3 } else { motor[port3]= 127; //si no está presionado se activa el motor del puerto 3. } 54 Introducción a la Programación • Palabras Reservadas Actividad5 Palabras resevadas Tipos de datos Diferente tipo de información requiere distintos tipos de variables para contenerla. int Este tipo de dato se usa para almacenar valores enteros en un rango desde -32768 a 32768. int x; x = 765; //Declara la variable entera x //Almacena 765 dentro de x Este código también se puede escribir así: int x = 765; //Declara la variable entera x y... //...la inicia en un valor de 765 bool Este tipo de dato se usa para almacenar valores booleanos tanto 1 (verdadero) o 0 (falso). bool x; x = 0; //Declara la variable booleana x //establece x a 0 char Este tipo de dato se usa para almacenar un sólo caracter ASCII, especificado entre comillas sencillas. char x; //Declara la variable caracter x x = ‘J‘; //Almacena el caracter J dentro de x Reglas ROBOTC Parte 2 Accede a la Comunidad Virtual y reproduce el video de esta lección. 55