Universidad Catolica de Temuco - Ingeniería Civil en Informática

viernes, 16 de diciembre de 2011


Actividad Nº 1 Proyecto Robot



Autor: Camilo Ariel Friz Gómez.
Competencias:  Aprendizaje Autónomo.(Nivel 1).
Palabras claves: NXC, NXT, Robot, Proyecto, programación.




La actividad de esta semana, se nos pidió programar y diseñar nuestro robot, que realice las siguientes funciones: Desplazarse por una superficie blanca en la cual se encuentra una serie de puntos negros y paredes. Al pasar por un punto negro, debe girar aleatoriamente (menos de 180º) a una dirección y tiempo indicado por entrega de parámetros, y a la vez, contar la cantidad de veces que el robot detectó dicho punto. Al chocar en la pared, debe retroceder un poco, y girar a una dirección y tiempo indicado por entrega de parámetros, y a la vez, contar la cantidad de veces que el robot choca.




Estrategia de Solución

Estrategia de trabajo:
Uno de los primeros pasos que se realizó, fue el de designar un cargo de los integrante, este con el fin de realizar un trabajo organizado y fluido. El jefe de grupo en un principio da las indicaciones pertinentes a los demás integrantes del equipo, enseguida el staff de apoyo se dirige a retirar los kits y a crear un inventario mientras el secretario con el productor multimedia comienza a crear el programa que dará solución al problema planteado.  El jefe de grupo y el productor multimedia comienza a buscar la forma de armado más adecuada para la actividad, se llega a la conclusión de hacer un diseño de robot simple.  Una vez hecho esto, entre todos los integrantes damos un vistazo final al programa creado por el secretario en busca de errores, Para dar una solución definitiva al problema, decidimos instalar tres sensores: luz, tacto y sonido, con rangos definidos para que cada uno de ellos cumpliera su función a cabalidad (detectar paredes, puntos negros, o detener su recorrido).  El programa creado lograba que cada vez que el robot chocara Retrocediera, girara en modo aleatorio y siguiera su recorrido. Cada vez que el robot pasaba por un punto negro éste giraba y cambiaba su velocidad, finalmente se detenía al oír un sonido. El programa también tiene un contador que nos informaba el número de choques y puntos negros detectados por nuestro robot. Finalmente el encargado multimedia es quien graba el desempeño final de nuestro robot en la plataforma, para confirmar lo creado en el código y nuestra estrategia como grupo.



Diagrama de Flujo :






Pseudocodigo:

contador de choque;
contador de puntos;
potencia = 50;
Giro;


//subrutina que permitira al robot,la realizacion de dos acciones.
//estas acciones dependen del senesor  activado.

subrutina GiroPotencia(tiempo, direccion, evento)
 {
 
  si (evento == "Circulo")
  {
    contador de puntos negros +1;
    si(direccion=="D")
    {
    Girar hacia la derecha por un tiempo ingresado(t);
    }
    si(direccion == "I")
    {
     Girar hacia la izquierda por un tiempo ingresado(t);
    }
    aumentar potencia 10%;
  }
  si (evento == "Choque")
  {
    retroceder por un tiempo de 1 segundo;             
   si(direccion == "D")
    {
    Girar hacia la derecha por un tiempo ingresado(t);
    }
   si(direccion == "I")
    {
     Girar hacia la izquierda por un tiempo ingresado(t);
    }
    desminuir potencia 10%;
  }
}
subrutina imprimir(y1, y2, x, im, contador)
 {
  imprimir en pantalla tanto número como texto.
 }


INICIO DE PROGRAMA//inicio de programa
{
  SETEAR SENSOR TOUCH.
  SETEAR SENSOR LIGHT.
  SETEAR SENSOR SOUND.
  Giro = Random entre 300 y 700; //tiempo de giron.
  hacer (siempre)
  {
   avanzar ;
   //
   si (Sensor Light < UMBRAL)
   {
     llamar GiroPotencia(Giro, "D", "Circulo");
   }
   si (SENSOR_1 == 1)
   {
     llamar GiroPotencia(1250, "D", "Choque");
   }
   //si el sensor de sonido detecta  un sonido mayor a 80 db, se romperá el ciclo while establecido.

   si(MIC > 80){romper ciclo while;}
 }

   imrimir contadores;
}// fin del programa.






Código del Programa:


//Hello Bot
//Definición de variables
#define UMBRAL 40
#define MIC SENSOR_2

int contador_choque=0;
int contador_pp=0;
int potencia=50;
int Giro;

//subrutina que permitira al robot,la realizacion de dos acciones.
//estas acciones dependen del senesor  activado.
 sub GiroPotencia(int t, string direccion, string evento)
 {
  /*int t : parámetro Encargado de recibir tiempo.
    string dirección: Encargado de recibir parámetro necesario para
                      dirección de giro Ya se ha izquierda (I) o derecha (D).
    String  evento: encargado de recibir el parámetro del tipo de eventO que
                      se ingrese (circulo negro o choque).
   */
 if (evento == "Circulo")
  {
    contador_pp++;//contador de puntos negros +1.
 //Sentencia  la cual permitirá realizar una vuelta  hacia la derecha.
    if(direccion == "D")
    {
     OnFwd(OUT_C, 50);
     OnRev(OUT_A, 50);
     Wait(t);
    }
 //Sentencia  la cual permitirá realizar una vuelta  hacia la izquierda.
    if(direccion == "I")
    {
     OnFwd(OUT_A, 50);
     OnRev(OUT_C, 50);
     Wait(t);
    }
    potencia=potencia+10;//potencia aumenta un 10%.
    if (potencia >= 100) {potencia=100;}// Se establece una potencia máxima  de la cual no aumenta.
    OnFwdReg(OUT_AC,potencia,OUT_REGMODE_SPEED);// avanzar con control de potencia.
  }
  if (evento == "Choque")
  {
    OnRevreg(OUT_AC, 75);//retrocede con control de potencia por un tiempo de un segundo
    Wait(1000);


 //Sentencia  la cual permitirá realizar una vuelta  hacia la derecha.
 //con un tiempo entregado por parametro.               
    if(direccion == "D")
    {
     OnFwd(OUT_A, 50);
     OnRev(OUT_C, 50);
     Wait(t);
     }

 //Sentencia  la cual permitirá realizar una vuelta  hacia la izquierda.
 //con un tiempo entregado por parametro.
     if(direccion == "I")
     {
      OnFwd(OUT_C, 50);
      OnRev(OUT_A, 50);
      Wait(t);
     }
     potencia=potencia-10;// Disminuye un  10% de la potencia  total.
     if (potencia <= 30){potencia=30;}
     contador_choque++;
     OnFwdReg(OUT_AC,potencia,OUT_REGMODE_SPEED);
  }
}
//subrutina que permite  imprimir en pantalla tanto número como texto.
sub imprimir(int y1, int y2, int x, string im, int contador)
 {
  TextOut(y1, x, im);
  NumOut(y2, x,contador);
 }


task main()//inicio de programa
{
  SetSensorTouch(IN_1);        //ENCIENDE EL SENSOR TOUCH.
  SetSensorLight (IN_4);       //ENCIENDE EL SENSOR LIGHT.
  SetSensorSound(IN_2);        //ENCIENDE EL SENSOR SOUND.
  Giro = Random(700)+300;      //Asignación de una variable ramdomica , la cual permite el control de tiempo de giron.
  while (true)
  {//inicio ciclo while.
   OnFwdReg(OUT_AC,potencia,OUT_REGMODE_SPEED);// avanzar con control de potencia.
   //
   if (Sensor(IN_4) < UMBRAL)
   {
    GiroPotencia(Giro, "D", "Circulo");
   }
   if (SENSOR_1 == 1)
   {
    GiroPotencia(1250, "D", "Choque");
   }
   //si el sensor de sonido detecta  un sonido mayor a 80, se romperá el siclo while establecido.
   if(MIC > 80){break;}
 }//fin ciclo while
 Off(OUT_AC);
 imprimir(10,70,30,"Puntos:",contador_pp);//imprime contador de puntos negros contados.
 imprimir(10,70,40,"Choques:",contador_choque);//imprimir contador de choques.
 Wait(20000);
}// fin del programa
  


Video  de la actividad:



                                                



  Conclusión

Después de realizar la actividad podemos concluir que fue una buena manera de aprender a resolver problemas llegando a un resultado óptimo en la actividad realizada. Siendo capaces de dividir el problema planteado en subtareas con parámetros. Otro Punto a mencionar fue la decisión de instalar tres sensores: tacto, luz y sonido, dentro del código que creamos, para que cumplieran su objetivos que fueron: "detectar paredes, puntos negros, y detener su recorrido” respectivamente, objetivos que se designaron en cada función, así como también trabajamos utilizando variables y subrutinas. Para Finalizar con la grabación del desempeño del robot verificando así el resultado de nuestra actividad a través del
Comportamiento del robot. Por ende podemos decir que el robot ejecuto de manera óptima lo que esperábamos, quedando como grupo Conforme con lo aprendido y lo realizado esta semana.

1 comentario:

  1. Jtm Gaming | casino | jtmhub.com
    Jtm Gaming is a global content 고양 출장안마 aggregator and content 평택 출장마사지 provider. It 밀양 출장샵 offers a variety 하남 출장샵 of gambling experiences 영주 출장마사지 and products to the online gaming industry.

    ResponderEliminar