Circuito millonario, creatividad e innovación en NXC.

























Autor: Michel Muñoz.

Competencia: Creatividad e innovación.

Palabras claves: NXC,lego,mindstorm.


Contextualización y descripción de la actividad


En el pasado ramo introducción a la robotica desarrolla un software que mezclaba diferentes funciones de nxc, la tercera entrega "circuito millonario" combinaba la inovación y el desarrollo de nuevas aplicaciones. 
    Introducción
       El robot Lego Mindstorms nos ha ayudado a crear soluciones a los distintos problemas que se nos plantean, y es por ello que el propósito principal de la aplicación de este proyecto será que empleemos distintas metodologías de programación en la creación del código; y que observemos que ocurre cuando éste interactúe en el mundo real. Con los Legos Mindstorms NXT podremos solucionar problemas de diversa índole, algunos de los cuales se resolverán de forma teórica y práctica, además de tomar datos del entorno, tratarlos y actuar en consecuencia. En este caso nos referiremos al proyecto “Circuito Millonario” en donde tendremos que desarrollar y ejecutar ciertas tareas a desarrollar donde el robot tiene que enfrentarse a diferentes situaciones.


 Cuerpo del Informe
Entrega de la solución:
1-  Estrategia de trabajo:
Nuestro trabajo se rigió nuevamente a través del mismo orden que el proyecto anterior, siendo como tal el líder del grupo, Alejandro Fuentes, el productor multimedia, Michel Muñoz y el secretario, Matías Vargas. 
Luego, cada uno desarrolló una tarea que llevaría a la conclusión de nuestro circuito, sin embargo, cabe destacar que hubo tareas que se tuvieron que realizar fuera de la universidad para llevar a cabo su finalización.
Cada integrante desarrollo una subfase del trabajo; Michel Muñoz desarrollo la primera subfase “Línea” que sería la activación del sensor de luz y su robot en una línea negra; Alejandro Fuentes desarrollo la segunda subfase “Obstáculos” que sería activar el sensor de ultrasonido para esquivar los objetos que se le interpongan adelante; Matías Vargas desarrollo la tercera subfase “zona de puntos” que sería que el robot realizara un recorrido que vaya recogiendo puntos negros a través del sensor de luz y utilizando el sensor de tacto para reconocer los choques para luego terminar; finalmente todo el grupo recompilo datos para terminar con la última subfase “resultados” que mostraría en puntaje que se obtuvo en las subfases anteriores.
Como los trabajos anteriores, el líder del grupo se destacó en dirigir las tareas para que se cumplieran y además ayudó en la formación del código. El Productor se destacó en ayudar a redactar partes del informe y a desarrollar el video sobre la prueba del funcionamiento de nuestro robot. Finalmente el secretario redactó el informe y también participo en la creación del código. Hay que tener en cuenta que todos aportaron con su grano de arena haciendo su propio subfase para el funcionamiento completo del robot.

2-  Modelo de la solución:
Para comenzar, el desafío consistía en programar un robot lego NXT para que éste ejecutara un recorrido en base a unas reglas que consistían en realizar tres subfases diferentes para sus correspondientes situaciones, seguir una línea negra, no chocar con obstáculos, recoger puntos negros, y hacer un contador con el puntaje obtenido por realizar con éxito la situaciones, cada uno de nosotros, valga la redundancia, terminamos concentrado en cada subfase para terminar como mayor velocidad el trabajo.
 Viendo las condiciones que debían cumplirse para lograr los objetivos, se procedió a realizar con el robot distintas mediciones sobre la plataforma y llevar esos datos obtenidos a través de ensayo/error al lenguaje nXC, el cual “leerá” y ejecutará el robot. Luego de un arduo trabajo, especialmente en la primera y segunda subfase, se logró generar la respuesta al problema planteado.

       Otra cuestión a tomar en cuenta es que el video de robot no se realizó en la misma universidad por cuestión de tiempo, sin embargo, se realizó un pista similar en una casa de los integrantes y se filmó el seguimiento del robot pero desgraciadamente no era el mismo modelo original a que se estaba reguardado en la universidad.

#Imagen de un robot de respuesta Lego NXT usado en el film del proyecto 03 de laboratorio de robots.
Pseudo-código del programa:

#define NEGROS 35

#define BLANCOS 50

#define CERCA 14//cm

#define UMBRAL 40

definición de variables tales como:

int cont=0;//contador de puntos negros

int choque=0;//contador de choque pre-sub fase 2

int chocado=0;//contador de choques sub fase 3

int t=0;//contadores de tiempo t,t1 y t2

int t1=0;

int t2=0;

int puntaje=0; //puntaje final

int puntaje01=50;//puntaje sub fase01

int puntaje02=100;//puntaje sub fase02

sub fase1()   {//línea negra

 Se prenden los sensores de choque (IN_1) y de Luz(IN_3);

Mientras (SENSOR_1(choque) no toque nada)

 {

  Mientras (SENSOR_3(Luz<NEGROS )

   {

     Avanza (OUT_B);

     Retrocede (OUT_C);

     }



    Mientras (sensor de luz>NEGROS y a su vez el  sensor de luz<BLANCOS)

    {

     Avanza;

     }

    Mientras (sensor de luz>BLANCOS) 

    {

     Avanza (OUT_C,20);

     Retrocede (OUT_B,20);

     }

  }

 Mientras (sensor de choque toque algo)

 {

  Retrocede(OUT_C,50) por medio segundo;

  Se apagan los motores;

  puntaje=puntaje+50;//y suma 50 al puntaje..

 }

}  //final sub fase1





sub fase2()//fase 2 obstáculos

{

 Se activan los sensores de ultrasonido (IN_4) y de luz(IN_3);

 Mientras  no esté frente a ningún obstáculo…

  {

  Avanza;

  Mientras (SensorUS(IN_4)< CERCA){

  Se apagan los motores por ½ seg;

Gira por 700 milesimas;

  }

 }

Se apagan los motores;

puntaje=puntaje+100;//suma 100 puntos al contador

 }





sub fase3()//parte de zona de puntos

{

Se activan los sensores de choque (IN_1) y de luz (IN_3);

Avanza por 1400 milésimas;

Se apagan motores;

 Gira a la derecha para posicionarse durante 600 milésimas;

 Se apagan motores por 1 seg;

  t1=CurrentTick();//y comienza el cronometro

  Mientras((chocado<3) y (t<26 segundos)){

   Avanza;

Si (Sensor de choque se activa externamente);//(choca con algo)

   cuenta el choque;

    Apaga los motores por ½ seg;

    Retrocede por ½ seg;

    Gira a la derecha por 800 milésimas;

    }



   Si (Sensor(IN_3)<=UMBRAL){

    Suma al contador de puntos negros;

   Apaga los motores por 1 seg;

  Retrocede por 700 milésimas;

  Gira a la derecha  en  tiempo Random dando entre 90° y 270° al azar (700+Random(1000);

    }

t2=CurrentTick();//término del temporizador

   Calcula que el tiempo sea menor a 26 seg (25 seg)(t=t2-t1);

  }

}



sub puntajefinal()

{

   apaga los motores;

   Si (puntaje >= 0)//si el puntaje es mayor o igual a cero...

    puntaje =(puntaje01)+(puntaje02)+(30 * cont)-(50 * chocado); //se calcula...

  Sino

    puntaje = 0;

   

  Texto(1,LCD_LINE3,"acumulado ",true);//se muestran los resultados en la pantalla por 10 seg...

  Numero(75,LCD_LINE3,puntaje01+ puntaje02 + cont);

  Texto(1,LCD_LINE4,"Descuentos");

  Numero(87,LCD_LINE4,chocado);

  Texto(1,LCD_LINE6,"Ptje Final");

  Numero(75,LCD_LINE6,puntaje);

  Los muestra durante 10 seg;

  Toca un sonido (555,10000);

 }

 Lee y ejecuta el código{

 fase1();

 fase2();

 fase3();

 puntajefinal();

}//fin
Código del programa:
  • #define NEGROS 35 //definicion de constantes...
    #define BLANCOS 50
    #define CERCA 14//cm
    #define UMBRAL 40
    int cont=0;//definicion de variables...(contador de puntos negros)
    int choque=0;//contador de choque pre-subfase2
    int chocado=0;//contador de choques de la fase3
    int t=0;//contadores de tiempo
    int t1=0;
    int t2=0;
    int puntaje=0; //contador puntaje final
    int puntaje01=50;//contador puntaje subfase1
    int puntaje02=100;//contador puntaje subfase2

    sub fase1()     //fase 1: seguir una linea negra
    {
     SetSensorTouch(IN_1);//inicia los sensores de tacto y de luz..
     SetSensorLight(IN_3);

     while(SENSOR_1==0)//mientras el sensor de tacto no toque nada...
     {
       while(SENSOR_3<NEGROS)//mientras detecte un cierto umbral menor a 30 girará hacía la derecha en forma de zig-zag
        {
         OnFwd(OUT_B,20);
         OnRev(OUT_C,20);
         }

        while(SENSOR_3>NEGROS & SENSOR_3<BLANCOS)//mientras el valor este en equilibrio...
        {
         OnFwd(OUT_BC,50);
         }
        while(SENSOR_3>BLANCOS)  //mientras detecte un umbral mayor a 50 girara hacía la izquierda
        {
         OnFwd(OUT_C,20);
         OnRev(OUT_B,20);
         }
      }
     while(SENSOR_1==1)//cuando el sensor de tacto choque...
     {
      OnRev(OUT_C,50);//gira..(en este momento queda colocado de una manera exacta para que mas adelante se ejecute la sub rutina siguiente)
      Wait(600);
      Off(OUT_BC);//se apagan los motores..
      puntaje=puntaje+50;//y suma 50 al puntaje..
     }
    }  //final sub fase1


    sub fase2()//fase 2 obstaculos
    {
     SetSensorLowspeed(IN_4);//se activa sensor de ultrasonido y de luz
     SetSensorLight(IN_3);
     while((true)&&(Sensor(IN_3)>UMBRAL))//mientras este frente a ningun obstaculo..
      {
      OnFwd(OUT_BC,50);//andara hacia adelante
      while(SensorUS(IN_4)< CERCA){//si el sensor de ultrasonido  detecta algun obstaculo a menos de 10 cm...
      Off(OUT_BC);
      Wait(500);
      OnFwd(OUT_C,40);//girará...
      Wait(700);
      }
     }
     Off(OUT_BC);//se apagan los motores...
     puntaje=puntaje+100;//suma 100 puntos al contador
     }


    sub fase3()//parte de zona de puntos
    {
    SetSensorTouch(IN_1);//se activan el sensor de choque y de luz...
    SetSensorLight(IN_3);

      OnFwd(OUT_BC,60);//el robot avanza
      Wait(1400);
      Off(OUT_BC);
      OnFwd(OUT_B,70);//gira a la derecha para posicionarse...
      Wait(600);
      Off(OUT_BC);//se apagan motores por 1 seg....
      Wait(1000);
      t1=CurrentTick();//y comienza el cronometro
      while((chocado<3) && (t<26000)){ //mientras no choque 3 veces y sea menor a 26seg
       OnFwd(OUT_BC,60);//avanza al frente

       if(Sensor(IN_1)==1){//si choca
        chocado++;//cuenta el choque
        Off(OUT_BC);
        Wait(500);
        OnRev(OUT_BC,60);//retrocede..
        Wait(500);
        OnFwd(OUT_C,60);//gira a la derecha
        Wait(800);
        }//fin if de choque

       if (Sensor(IN_3)<=UMBRAL){//si el sensor de luz capta un punto negro...
        cont++;//suma al contador
        Off(OUT_BC);//apaga los motores por 1 seg
        Wait(1000);
        OnRev(OUT_BC,60);
        Wait(700);
        OnFwd(OUT_C,60);//gira a la der. un tiempo random (dando entre 90° y 270° al azar)
        Wait(700+Random(1000));
        }//fin if de puntos negros

       t2=CurrentTick();//termino de contar el tiempo
       t=t2-t1;//tiempo total (25 seg)

      } //fin while tiempo
    }  //fin  while principal

    sub puntajefinal()
    {
       Off(OUT_BC);//apagan los motores...
       if(puntaje >= 0)//si el puntaje es mayor o igual a cero...
        puntaje =(puntaje01)+(puntaje02)+(30 * cont)-(50 * chocado); //se calcula...

      else //sino el puntaje vale cero
        puntaje = 0;
        
      TextOut(1,LCD_LINE3,"acumulado ",true);//se muestran los resultados en la pantalla por 10 seg...
      NumOut(75,LCD_LINE3,puntaje01+ puntaje02 + cont);
      TextOut(1,LCD_LINE4,"Descuentos");
      NumOut(87,LCD_LINE4,chocado);
      TextOut(1,LCD_LINE6,"Ptje Final");
      NumOut(75,LCD_LINE6,puntaje);
      Wait(10000);
      PlayTone(555,10000);//...y toca un sonido por 10 seg
     }

    task main()//comienza a leer y ejecutar el codigo...
    {
     fase1();//comienzo fase de seguir la linea
     fase2();//comienza a esquivar los muros
     fase3();//suma puntaje segun cantidad de puntos que llegue a tocar
     puntajefinal();//muestra los puntajes..
    }//fin


Conclusión



    A partir del trabajo desarrollado logramos programar un robot de forma conjunta, es decir, juntar la información que cada integrante tenia para hacer forma el código completo. Hubo algunas dificultades al comenzar a programarlo pero gracias a la experiencia valiosa de los proyectos anteriores, se logró avanzar sin problemas, aún así, hubieron momentos que tuvimos tener en cuenta como ,por ejemplo, que los if y los while se apliquen en orden y correctamente dependiendo de su sentencia condicional, variar su velocidad a través del comando “Random” en el tercer subfase ,al compilar y guardar el archivo en el robot, el robot comienza a generar problemas en sus movimientos por datos erróneos en la primera subfase, generar la respuesta del sensor de ultrasonido; y así muchas cosas más cosas que tuvimos que tener en cuenta a la hora de programar nuestro robot. También utilizamos lo aprendido en el archivo “Word” que nos entregó el profesor y ciertos datos que sacamos de internet con información acerca de la activación de cierto sensor, la sintaxis, los nuevos comandos, etc. También, con el trabajo en equipo se hizo más llevadero el trabajo, ya que cada uno sabía lo que tenía que hacer y cómo desarrollarlo.    

Finalmente gracias al atrabajo en equipo y a al desarrollo creamos una solución innovadora y funcional que nos sirvio para la entrega del trabajo "circuito millonario".

Comments

Popular posts from this blog

Hacer login sencillo con PHP, MYSQL y HTML