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
Post a Comment