Programación en NXC
Robot "Dribbler"
Autor: Felipe Álvarez
Competencia : Desarrollo de Software
Asignatura : Programación de Robots
El problema consiste en programar un robot que fuera capaz de encontrar la máxima cantidad de Puntos en una pista de forma rectangular, sin chocar en los obstáculos que se encuentran en la pista ya que si llegase a suceder esto seria fin del juego.
Cuando el robot estuviera cerca un obstáculo debería ser capaz de evitar esto a través de una señal audible (Aplauso) el cual activara un mecanismo de evasión el cual el robot pueda desviarse hacia la izquierda o derecha con el fin de evitar este obstáculo.
Cada vez que el robot encuentre un Punto aumentara su puntaje y aumentara su velocidad secuencialmente, los puntajes en la pista se definen a través de diferentes puntos negros que se encuentran en la misma pista, como ya mencionado anteriormente toda esta actividad si el robot llegara a chocar contra algún obstáculo que este se encuentre por lo tanto una vez esto terminado el robot debe de mostrar la cantidad de puntaje acumulado tras haber chocado.
Todo esto se logra a través de la programación en NXC la cual es bastante parecida a los que es la Programación en C#, lo cual es una buena actividad para poder iniciar el proceso de programación en nuestra carrera como Alumnos de Ingenieria Civil en Informatica.
Modelo de Solución:
Como modelo de solución a este problema aplique un pseudocódigo el cual me ayudo bastante a entender el problema y llegar mejor a la solución al problema propuesto el cual se puede apreciar en estas siguientes lineas:
Variables
punto=0;
puntos=0;
aplauso=0;
aplausos=0;
puntaje=0;
puntajetotal=0;
velocidad=50;
subtarea MarcaPunto()
{
Melodia
}
subtarea ApagarMotores()
{
Apagar(Motor_AB):
}
subtarea PuntajePantalla()
{
Si punto<aplauso/4
{
Puntajetotal=0
}
Imprimir(puntajetotal)
Tiempo(10 segundos);
}
Subtarea ApagarTodo()
{
ParaTodasLasTares();
}
Subtarea CambioVelocidad();
{
Si velocidad menor 100;
{
velocidad + 5
}
}
Subtarea Puntaje();
{
puntos=(100*punto);
aplausos=(25*aplauso);
puntajetotal=(puntos-aplausos);
}
Subtarea Actividad()
{
Mientras (sensortacto=0)
{
Avanzar(ambos motores);
Si (sensor sonido)>80
{
Avanzar (motor A);
Retroceder (motor B);
Tiempo(100)
Sumar 1 a aplauso;
}Si (sensor luz)<=20
{
Avanzar (motor A);
Retroceder (motor B);
Tiempo al azar;
Sumar 1 a puntos;
Melodia();
Cambio de velocidad;
}
}
}
Tarea principal()
{
Setear sensor luz;
Setear sensor sonido;
Setear sensor tacto;
Subtarea
Subtarea
Subtarea
Subtarea
Subtarea
}
Actividad();
Puntaje();
ApagarMotores();
PuntajePantalla();
ApagarTodo();
punto=0;
puntos=0;
aplauso=0;
aplausos=0;
puntaje=0;
puntajetotal=0;
velocidad=50;
subtarea MarcaPunto()
{
Melodia
}
subtarea ApagarMotores()
{
Apagar(Motor_AB):
}
subtarea PuntajePantalla()
{
Si punto<aplauso/4
{
Puntajetotal=0
}
Imprimir(puntajetotal)
Tiempo(10 segundos);
}
Subtarea ApagarTodo()
{
ParaTodasLasTares();
}
Subtarea CambioVelocidad();
{
Si velocidad menor 100;
{
velocidad + 5
}
}
Subtarea Puntaje();
{
puntos=(100*punto);
aplausos=(25*aplauso);
puntajetotal=(puntos-aplausos);
}
Subtarea Actividad()
{
Mientras (sensortacto=0)
{
Avanzar(ambos motores);
Si (sensor sonido)>80
{
Avanzar (motor A);
Retroceder (motor B);
Tiempo(100)
Sumar 1 a aplauso;
}Si (sensor luz)<=20
{
Avanzar (motor A);
Retroceder (motor B);
Tiempo al azar;
Sumar 1 a puntos;
Melodia();
Cambio de velocidad;
}
}
}
Tarea principal()
{
Setear sensor luz;
Setear sensor sonido;
Setear sensor tacto;
Subtarea
Subtarea
Subtarea
Subtarea
Subtarea
}
Actividad();
Puntaje();
ApagarMotores();
PuntajePantalla();
ApagarTodo();
Código del Programa:
int punto=0;
int puntos=0;
int puntaje=0;
int puntajetotal=0;
int velocidad=50;
int aplauso=0;
int aplausos=0;
sub Marcapunto()
{
PlayTone(1318,80);
Wait(200);
PlayTone(1568,80);
Wait(200);
PlayTone(2637,80);
Wait(200);
PlayTone(2093,80);
Wait(200);
PlayTone(2349,80);
Wait(200);
PlayTone(3136,980);
Wait(1000);
}
sub ApagarMotores()
{
Off(OUT_AB);
}
sub PuntajePantalla()
{
TextOut(10,30,"Puntaje Total: ");
NumOut(10,20,puntajetotal);
Wait(15000);
}
sub ApagarTodo()
{
StopAllTasks();
}
sub CambioVelocidad()
{
if (velocidad<100){
velocidad=velocidad+5;
}
}
sub Puntaje()
{
puntos=(100*punto);
aplausos=(25*aplauso);
puntajetotal=(puntos-aplausos);
}
sub Actividad() {
while (Sensor(IN_1)==0)
{
OnFwd(OUT_AB, velocidad);
if (SENSOR_2>80)
{
OnFwd(OUT_A, 60);
OnRev(OUT_B, 60);
Wait(100);
aplauso=aplauso+1;
//NumOut(10,10,aplauso);
//Wait(1000);
}
if (Sensor(IN_3)<=20)
{
OnFwd(OUT_A,60);
OnRev(OUT_B,60);
Wait(Random(100)+100);
punto=punto+1;
Marcapunto();
CambioVelocidad();
}
}
}
task main ()
{
SetSensorLight(IN_3);
SetSensorSound(IN_2);
SetSensorTouch(IN_1);
Actividad();
Puntaje();
ApagarMotores();
PuntajePantalla();
ApagarTodo();
}
Como se puede apreciar en el código de arriba el código esta dividido en SubTareas las cuales facilitan mucho este Ejercicio a desarrollar dado a que son muchas acciones en paralelo que están sucediendo en este trabajo.
Lo que caracterizan a la subtareas es la habilidad de poder realizar tareas en paralelo sin que estas puedan chocar entre si, de lo cual uno simplemente define diferentes subtareas con sus respectivas funciones que estas tienen y después simplemente se puede llamar en el Task Main de manera simple como ingresando el nombre de la SubTarea y así todo eso se ejecutara de manera secuencial.
int puntos=0;
int puntaje=0;
int puntajetotal=0;
int velocidad=50;
int aplauso=0;
int aplausos=0;
sub Marcapunto()
{
PlayTone(1318,80);
Wait(200);
PlayTone(1568,80);
Wait(200);
PlayTone(2637,80);
Wait(200);
PlayTone(2093,80);
Wait(200);
PlayTone(2349,80);
Wait(200);
PlayTone(3136,980);
Wait(1000);
}
sub ApagarMotores()
{
Off(OUT_AB);
}
sub PuntajePantalla()
{
TextOut(10,30,"Puntaje Total: ");
NumOut(10,20,puntajetotal);
Wait(15000);
}
sub ApagarTodo()
{
StopAllTasks();
}
sub CambioVelocidad()
{
if (velocidad<100){
velocidad=velocidad+5;
}
}
sub Puntaje()
{
puntos=(100*punto);
aplausos=(25*aplauso);
puntajetotal=(puntos-aplausos);
}
sub Actividad() {
while (Sensor(IN_1)==0)
{
OnFwd(OUT_AB, velocidad);
if (SENSOR_2>80)
{
OnFwd(OUT_A, 60);
OnRev(OUT_B, 60);
Wait(100);
aplauso=aplauso+1;
//NumOut(10,10,aplauso);
//Wait(1000);
}
if (Sensor(IN_3)<=20)
{
OnFwd(OUT_A,60);
OnRev(OUT_B,60);
Wait(Random(100)+100);
punto=punto+1;
Marcapunto();
CambioVelocidad();
}
}
}
task main ()
{
SetSensorLight(IN_3);
SetSensorSound(IN_2);
SetSensorTouch(IN_1);
Actividad();
Puntaje();
ApagarMotores();
PuntajePantalla();
ApagarTodo();
}
Como se puede apreciar en el código de arriba el código esta dividido en SubTareas las cuales facilitan mucho este Ejercicio a desarrollar dado a que son muchas acciones en paralelo que están sucediendo en este trabajo.
Lo que caracterizan a la subtareas es la habilidad de poder realizar tareas en paralelo sin que estas puedan chocar entre si, de lo cual uno simplemente define diferentes subtareas con sus respectivas funciones que estas tienen y después simplemente se puede llamar en el Task Main de manera simple como ingresando el nombre de la SubTarea y así todo eso se ejecutara de manera secuencial.
https://www.youtube.com/watch?v=FAbthMUHI2E
¿En que me ayudo esta actividad?
Este ejercicio en si me ayudo a bastante a entender lo que es trabajar de forma ordenada y clara con el objetivo que me estas proponiendo, como siempre uno como Ingeniero tiene que buscar la mejor solución para cualquier problema que nos propongan, de manera clara y sencilla con tal de que nuestro clientes puedan entender nuestras soluciones a estos problemas.
Esta actividad ayuda bastante a entender la programación básica en NXC y hacer uso de sus propias funciones que contiene este lenguaje como es el uso de sus diferentes sensores, funciones de sonido y música lo cual yo pude trabajar y poder realizar este trabajo con éxito.
¿En que me ayudo esta actividad?
Este ejercicio en si me ayudo a bastante a entender lo que es trabajar de forma ordenada y clara con el objetivo que me estas proponiendo, como siempre uno como Ingeniero tiene que buscar la mejor solución para cualquier problema que nos propongan, de manera clara y sencilla con tal de que nuestro clientes puedan entender nuestras soluciones a estos problemas.
Esta actividad ayuda bastante a entender la programación básica en NXC y hacer uso de sus propias funciones que contiene este lenguaje como es el uso de sus diferentes sensores, funciones de sonido y música lo cual yo pude trabajar y poder realizar este trabajo con éxito.