viernes, 7 de octubre de 2016

ROBOT SUMO

Autor:

Rafael Fuentealba


Competencia:

Gestión en Tecnologías de Información (Nivel 1)


Asignatura:

Programación de Robot



Descripción de la Actividad:

Elaborar un programa en NXC, que en conjunto a la construcción de un robot lego, permitan al los estudiantes incluirse dentro del denominado Combate Sumo donde cada equipo pondrá a prueba su propia creación y sus conocimientos de programación.

Dentro del marco de la actividad es posible decir que cada grupo competirá en un ronda eliminatoria, y en donde sus creaciones acumularán puntaje para avanzar hacia el combate final. El objetivo es sacar al robot rival fuera de una zona de combate que está marcada sobre la pista, siendo una de las misiones más importante el mantener el sensor de luz dentro de esta. 
Hay dos formas de perder la batalla: La primera es si el sensor de luz sale de la zona de combate, y la segunda si el robot es enviado fuera de la pista.
Para lograr ganar y acumular puntaje se deberá completar un total de tres round de dos minutos cada uno, cumpliendo con el objetivo de sacar al robot enemigo fuera de la zona de combate.


Posterior al desarrollo de la actividad se debe hacer una análisis de todos los enfrentamientos que se realizaron, explicando el porqué del triunfo o la derrota.

Solución:


DISEÑO DE ROBOT:
  1. Estructura de robot:
  • En la parte frontal de nuestro robot decidimos colocar una muralla la cual tiene la función de defender la base del robot y sus componentes internos. También tenemos una mini estructura en la parte superior de la muralla para tener un mayor peso para la dificultad del adversario


  • En la base decidimos utilizar los 3 motores con doble ruedas para que así  tuviera mucha más potencia para poder atacar al enemigo. En los laterales traseros decidimos hacer un ensamblaje con un conjunto de piezas para que así nuestro robot tuviera una mayor firmeza y a la misma vez un mayor peso para que así él contrincante no tuviera la oportunidad de poder voltearnos y descalificarnos.



  1. Sensor y funcionamiento:


  • Él sensor de luz se encuentra en la parte inferior frontal del robot él cual está oculto y protegido por la muralla para que de esta forma  pueda detectar el límite de la pista y no salirse de ella para así no quedar fuera del juego.



  • El sensor de proximidad se encuentra en la parte frontal del robot para  que de esta forma se pueda poder detectar de una forma más eficiente al enemigo presente



  • El primer sensor de tacto se encuentra en la parte trasera del robot él cual su propósito es que sea activado por un contrincante de tamaño mayor
  • El segundo sensor de tacto se encuentra en la parte inferior trasera él cual su propósito es que sea activado por un robot más pequeño que la altura del primer sensor de tacto



CÓDIGO:


#define CERCA 30        //Se define distancia, 30 centímetros
#define UMBRAL 40       //Se define umbral 40, utilizado en sensor de luz para detectar color negro
mutex moversumo;        //(exclusión mutua) permite regular ejecución de tareas paralelas


task ataque(){          //Inicia tarea ataque
     while(true){       //Se pregunta en todo momento
                 while(SensorUS(IN_1)<=CERCA){          //Mientras sensor de proximidad detecte algo menor o igual a 30 centímetros
                               Acquire(moversumo);  //Se pide permiso para realizar acciones
                               OnFwd(OUT_AB,100);   //Avanzan motores A Y B con potencia 100%
                               OnRev(OUT_C,100);    //Avanza motor C al 100% (motor C está al revés)
                               Release(moversumo);  //Cede permiso para ejecutar otras acciones
                               }                    //Cierre del while que contiene acciones
                 }             //Cierre del while true
              }                //Cierre de tarea ataque


task defensa(){                //Inicia tarea defensa
     while(true){              //Se pregunta en todo momento
                 while(SENSOR_4==1){         //Mientras sensor de tacto esté presionado
                         Acquire(moversumo); //Se pide permiso para realizar acciones
                         OnRev(OUT_AB,100);  //Retroceden motores A y B con potencia 100%
                         OnFwd(OUT_C,100);   //Retrocede motor C al 100% (motor C está al revés)
                         Wait(500);          //Durante 0.5 segundos
                         OnFwd(OUT_A,100);   //Avanza motor A con potencia 100%
                         OnFwd(OUT_C,100);   //Retrocede motor C con potencia 100%
                         OnRev(OUT_B,100);   //Retrocede motor B con potencia 100%
                         Wait(500);          //Durante 0.5 segundos
                         Release(moversumo); //Cede permiso para ejecutar otras acciones
                        }                    //Cierre del while que contiene acciones
                 while(SENSOR_3==1){         //Mientras sensor de tacto esté presionado
                                    Acquire(moversumo); //Se pide permiso para realizar acciones
                                    OnFwd(OUT_AB,100);  //Avanzan motores A y B con potencia 100%
                                    OnRev(OUT_C,100);   //Avanza motor C con potencia 100& (motor C está al revés)
                                    Wait(500);          //Durante 0.5 segundos
                                    OnFwd(OUT_A,100);   //Avanza motor A con potencia 100%
                                    OnFwd(OUT_C,100);   //Retrocede motor C con potencia 100% (motor C está al revés)
                                    OnRev(OUT_B,100);   //Retrocede motor B con potencia 100%
                                    Wait(500);          //Durante 0.5 segundos
                                    Release(moversumo); //Cede permiso para ejecutar otras acciones
                        }           //Cierre del while que contiene acciones
                 }      //Cierre del while true
               } //Cierre de tarea defensa
task lineanegra(){        //Inicia tarea líneanegra
     while(true){         //Se pregunta en todo momento
           while(SENSOR_2<UMBRAL){      //Mientras sensor de luz detecte negro
                 Acquire(moversumo);    //Se pide permiso para realizar acciones
                 OnRev(OUT_AB,100);     //Retroceden motores A y B con potencia 100%
                 OnFwd(OUT_C,100);      //Retrocede motor C con potencia 100% (motor C está al revés)
                 Wait(500);             //Durante 0.5 segundos
                 OnRev(OUT_A,100);      //Retrocede motor A con potencia 100%
                 OnFwd(OUT_C,50);       //Retrocede motor C con potencia 50%
                 OnFwd(OUT_B,50);       //Avanza motor B con potencia 50%
                 Wait(500);             //Durante 0.5 segundos
                 Release(moversumo);    //Cede permiso para ejecutar otras acciones
                 }                      //Cierre del while que contiene acciones
           }     //Cierre del while true
}          //Cierre de tarea líneanegra


task tiempo(){      //Inicia tarea tiempo
              long time= CurrentTick();                   //Se inicia función CurrentTick para tomar transcurso de tiempo
              while (true){                               //Se pregunta en todo momento
                    if(CurrentTick()- time >= 120000){    //Si el tiempo transcurrido es mayor a 2 minutos
                                    StopAllTasks();       //Se detienen todas las tareas
                               }    //Cierre de condición if
                    }          //Cierre del while true
              }     //Cierre de tarea tiempo


task main(){  //inicia tarea main
OnFwd(OUT_AB,30);                        //Avanzan motores A y B con potencia 30%
OnRev(OUT_C,30);                         //Avanza motor C con potencia 30% (motor c está al revés)
Precedes(tiempo,ataque,defensa,lineanegra); //Se declaran las tareas tiempo, ataque, defensa y lineanegra
SetSensorLowspeed(IN_1);                         //Seteo de sensor de proximidad
SetSensorLight(IN_2);                            //Seteo de sensor de luz
SetSensorTouch(IN_3);                            //Seteo de sensor de tacto #1
SetSensorTouch(IN_4);                            //Seteo de sensor de tacto #2

}       //Cierre de tarea main



ANÁLISIS DE ENFRENTAMIENTOS:

Pelea Sumo N° 1:
 Round 1: La estrategia de ataque cumplió su objetivo en un 50% porque al realizar el impacto con el robot contrincante lo ataco hasta cumplir los 2 minutos de tiempo límite, sin correr ningún riesgo de ataque de parte del contrincante.

Round 2 y 3: Tanto en el segundo como tercer round nuestro robot demostró mayor habilidad y características de ataque, gracias a su peso y superioridad de tamaño se logró arrastrar el robot contrincante hasta afuera del círculo, con un choque frontal a toda la potencia.

Robot contrincante: En términos prácticos, el contrincante no poseía la suficiente fuerza de motores para poder empujar o derribarnos de la zona del círculo, además el contrincante poseía una muralla, la cual no fue de gran utilidad, puesto a la gran fuerza de motores de nuestro robot. El empate se produjo por mal posicionamiento de nuestro robot para lo cual el contrincante tomó ventaja de ello.


Pelea Sumo N° 2:
Round 1 y 2: El intento de ataque de nuestro robot no fue efectivo, puesto que las técnicas de defensa de nuestro rival fueron más estratégicas tras levantarnos, ya que nuestro robot detecto el color negro de su estructura, realizando un giro que impulsó aún más el volcamiento de este.

 Round 3: La pelea terminó en un empate ya que nuestro robot luchó todo el tiempo por salir de las medidas de ataque de nuestro rival, terminando el tiempo respectivo de combate sin ningún victorioso.

Robot contrincante: El contrincante poseía dos garras la cual le daban la ventaja de poder levantar nuestro robot, haciendo que se voltee y pierda el equilibrio, como ocurrió en uno de los round. Además de que el contrincante tenía un peso adecuado, siendo así, no nos dio la oportunidad de poder empujarlo por fuera del círculo.


Pelea Sumo N° 3:
Round 1-2 y 3: Nuestro rival demostró tener muchas menos cualidades de combate. Nuestro ataque “agresivo” no le dio tiempo para ocupar su estrategia de ataque, sacándolo del círculo en un tiempo muy reducido; esto fue repetitivo dentro de los 3 round.


Robot contrincante: En términos básicos, el contrincante poseía una garra la cual no le fue de utilidad ya que su estructura era demasiado liviana para poder levantar a nuestro robot, por lo cual fue derribado fácilmente por fuera del círculo.



VÍDEO DE LA ACTIVIDAD:

Revisa el vídeo en el siguiente link:




Reflexión:

Esta actividad me ha permitido desarrollar distintas habilidades entre las incluyen: el programar, la unidad y trabajo en equipo, conocer que es posible dar soluciones a problemas de forma rápida; lo que incluye el uso de robot y además el interactuar con estas máquinas. 

Más allá de lo anterior, esto me ayudó a fortalecer las habilidades ya mencionadas puesto que hubo de por medio una enorme responsabilidad y compromiso frente a mi y frente a mis compañeros de equipo. De esta forma es posible decir que la actividad configura una fuerte personalidad en el estudiante, rasgos que producen gran confianza al usuario a la hora de solicitar solución a sus problemas o algún otro servicio.


No hay comentarios:

Publicar un comentario