Autor: Rodrigo Soto Parra
Competencia Creatividad e inovacion.
Descripcion de la actividad.
Su
equipo ha sido contratado para diseñar y construir uno de los robots de
la granja. Este robot ha de sacar los duraznos de los durazneros, para
que otro los pueda recolectar. Sin embargo, debe dejar los manzanos
intactos, pues su fruta - aún inmadura - debe ser recolectada luego del
otoño.
Estrategia de Solución
En el presente trabajo cada integrante tuvo un rol especifico, para poder llegar a un resultado satisfactorio.
Juan Reyes: Se enfoco en el área de la producción multimedia, al igual que ayudo en la creación del pseudocódigo.
Patricio
Riquelme: fue el encargado de desarrollar satisfactoriamente el código
del robot con el fin de que este pudiera cumplir el objetivo de cosechar
los duraznos.
Rodrigo
Soto: Encargado de que el trabajo se desarrollara de forma correcta y
ordenada por su rol de jefe de grupo y además ayudo en la creación de el
diseño del robot.
Juan
Arroyo: Encargado de recopilar todos los datos más importantes para
luego desarrollar y redactar el informe que se presentara para ser
evaluado.
Gracias al buen realizado
en equipo, se logró realizar que el robot cumpliera su misión en forma
correcta, pero ocupando diferentes estrategias de solución.
Para que nuestro robot pudiera realizar correctamente lo solicitado, se trabajo de la siguiente manera:
- Si
al llegar al árbol el robot detectaba el color blanco (con el sensor de
luz), entonces este se giraba y se dirigía hacia el árbol del otro
extremo ya que aun no era temporada de cosecha.
- Si
al llegar al árbol el robot detectaba el color negro (con el sensor de
luz), entonces este activaba la garra para recolectar la fruta madura y
así en las otras tres cosechas restantes (ya que el número de cosechas
estaba delimitado en 4).
- Al ser el numero de arboles igual a 8, el robot terminara sus funciones.
Pseudocódigo:
se establece el umbral para sensor de luz igual a 40
se establese distancia de 10cm para sensor de ultrasonido
se establese distancia de 10cm para sensor de ultrasonido
se inicia un contador de lineas en 0;
se inicia el contador de cosecha en 0;
se inicia el contador de árboles en 0;
se define a la variable tiempo, tiempo_ini y tiempo1 para poder guardar tiempo recorrido por el robot (linea a linea);
luz, i, j se definen como variables de tipo entero para poder utilizarlos en la subrutina de buscar_linea.;
se inicia el contador salida = 0 para introducir al robot en la primera cosecha;
se inicia el contador salida2 = 0 para sacar al robot de la primera cosecha;
se inicia el contador salida3 = 0 para sacar al robot de la segunda cosecha;
se inicia el contador salida4 = 0 para sacar al robot de la tercera cosecha;
se inicia el contador salidafinal = 0 para sacar al robot de la cuarta cosecha;
se inicia el contador de cosecha en 0;
se inicia el contador de árboles en 0;
se define a la variable tiempo, tiempo_ini y tiempo1 para poder guardar tiempo recorrido por el robot (linea a linea);
luz, i, j se definen como variables de tipo entero para poder utilizarlos en la subrutina de buscar_linea.;
se inicia el contador salida = 0 para introducir al robot en la primera cosecha;
se inicia el contador salida2 = 0 para sacar al robot de la primera cosecha;
se inicia el contador salida3 = 0 para sacar al robot de la segunda cosecha;
se inicia el contador salida4 = 0 para sacar al robot de la tercera cosecha;
se inicia el contador salidafinal = 0 para sacar al robot de la cuarta cosecha;
se indica el uso de la subrutina buscar_linea()
{
se indica que i es igual a 1;
se indica que j es igual a 1;
mientras se cumpla (que i sea menor que 5)
{
luz será igual al umbral detectado por el sensor de luz;
se ordena a los motores A y B avanzar en linea recta a una potencia de 30;
se realiza la orden anterior durante 10 milesimas de segundo;
si se cumple(luz menor al umbral)
{ el contador Lineas aumentará en 1;
si se cumple (j sea = a 1)
{ tiempo_ini será = al tiempo en el cual el robot detecta la linea;
la variable tiempo será = a 0;
el tiempo aparecerá en el monitor del brick
}
si no ocurre lo anterior (else)
{ tiempo1 será = al tiempo actual;
tiempo será = al tiempo1 menos el tiempo_ini;
y en pantalla aparecerá el contenido de lavariable tiempo;
}
i será = a su valor anterior más 1;
j será = a su valor anterior más 1;
}
ejecutar orden anterior durante 10 milesimas de segundo;
}
girar 180º;
retroceder durante 600 milesimas de segundo;
se indica que i es igual a 1;
se indica que j es igual a 1;
mientras se cumpla (que i sea menor que 5)
{
luz será igual al umbral detectado por el sensor de luz;
se ordena a los motores A y B avanzar en linea recta a una potencia de 30;
se realiza la orden anterior durante 10 milesimas de segundo;
si se cumple(luz menor al umbral)
{ el contador Lineas aumentará en 1;
si se cumple (j sea = a 1)
{ tiempo_ini será = al tiempo en el cual el robot detecta la linea;
la variable tiempo será = a 0;
el tiempo aparecerá en el monitor del brick
}
si no ocurre lo anterior (else)
{ tiempo1 será = al tiempo actual;
tiempo será = al tiempo1 menos el tiempo_ini;
y en pantalla aparecerá el contenido de lavariable tiempo;
}
i será = a su valor anterior más 1;
j será = a su valor anterior más 1;
}
ejecutar orden anterior durante 10 milesimas de segundo;
}
girar 180º;
retroceder durante 600 milesimas de segundo;
}
inicia sub cosecha()
{mientras el sensor de luz detecte la linea negra
{
avanzar derecho;
mientras el sensor de ultrasonido no detecte el "árbol" a 10cm
{avanzar derecho;
si ocurre que ( sensor de toque se activa una vez)
{apagar los motores A y B;
sumar 1 a la variable arboles;
si ocurre que (el sensor de luz es menor que el umbral)
{La garra gira durante 1 segundo;
la garra se apaga;
}
se realiza un giro de 100º;
}
}
}
si ocurre que ( detcta el blanco, en otras palabras no detecta linea negra) //al momento de salir del while y si detecta el blanco dcebe avanzar a la siguiente linea.
{el robot gira en torno a su eje; //esto hace que siga la linea negra.
}
}
{mientras el sensor de luz detecte la linea negra
{
avanzar derecho;
mientras el sensor de ultrasonido no detecte el "árbol" a 10cm
{avanzar derecho;
si ocurre que ( sensor de toque se activa una vez)
{apagar los motores A y B;
sumar 1 a la variable arboles;
si ocurre que (el sensor de luz es menor que el umbral)
{La garra gira durante 1 segundo;
la garra se apaga;
}
se realiza un giro de 100º;
}
}
}
si ocurre que ( detcta el blanco, en otras palabras no detecta linea negra) //al momento de salir del while y si detecta el blanco dcebe avanzar a la siguiente linea.
{el robot gira en torno a su eje; //esto hace que siga la linea negra.
}
}
ordenes (task main())
{SetSensorLight(IN_2); //se inicia sensor de luz
SetSensorLowspeed(IN_3); //se inicia sensor de ultrasonido
SetSensorTouch(IN_1); //se inicia sensor de toque
//motor izquierda en A
//motor derecho en B
//motor de garra en C
{SetSensorLight(IN_2); //se inicia sensor de luz
SetSensorLowspeed(IN_3); //se inicia sensor de ultrasonido
SetSensorTouch(IN_1); //se inicia sensor de toque
//motor izquierda en A
//motor derecho en B
//motor de garra en C
Buscar_linea(); //subrutina
mientras (arboles sea menor a 2)
{se realiza Cosecha1();
}
suma 1 a salida;
{se realiza Cosecha1();
}
suma 1 a salida;
mientras (salida sea igual a 1)
{avanza derecho;
si ocurre que (el sensor de luz detecta linea negra)
{suma 1 a salida; //al detectar el color negro suma salida para seguir a la siguiente subrutina
}
}
{avanza derecho;
si ocurre que (el sensor de luz detecta linea negra)
{suma 1 a salida; //al detectar el color negro suma salida para seguir a la siguiente subrutina
}
}
mientras (salida sea igual a 2, y arbles sean menores a 4) //realiza la subrutina mientras hasta que se detecten los 3-4 arboles
{Cosecha1();
}
{Cosecha1();
}
suma 1 a salida;
suma 1 a salida2; //la salida2 es para poner en parcha el paso a la tercera linea
suma 1 a salida2; //la salida2 es para poner en parcha el paso a la tercera linea
mientras (salida2 sea igual a 1)
{avanzar derecho;
si ocurre que (el sensor de luz detecta linea negra)
{suma 1 a salida2;
suma 1 a salida3;
}
}
{avanzar derecho;
si ocurre que (el sensor de luz detecta linea negra)
{suma 1 a salida2;
suma 1 a salida3;
}
}
mientras (salida3 sea igual a 1, y arboles sea menor que 6) //se realizara hasta que se "cosechen" los 5-6 arboles.
{Cosecha1();
}
suma 1 a salida3;
{Cosecha1();
}
suma 1 a salida3;
mientras (salida3 sea igual a 2)
{avanzar derecho;
si ocurre que (el sensor de luz detecta linea negra)
{suma 1 a salida3;
suma 1 a salida4;
}
}
{avanzar derecho;
si ocurre que (el sensor de luz detecta linea negra)
{suma 1 a salida3;
suma 1 a salida4;
}
}
mientras (salida4 sea igual a 1, y arboles sea menor que 8) //se realizara hasta que se "cosechen" los 7-8 arboles.
{Cosecha1();
}
suma 1 a salida4;
{Cosecha1();
}
suma 1 a salida4;
gira en torno a su eje 100º;
avanza derecho durante 1 segundo a una potencia de 100;
girar en su propio eje 180º;
se apagan los motores A y B;
} // llave del main
avanza derecho durante 1 segundo a una potencia de 100;
girar en su propio eje 180º;
se apagan los motores A y B;
} // llave del main
Datos de fisica.
En esta grafica esta la interpretacion de nuestro robot, ya que se
uso una potencia de 30 en gran parte de la actividad, es asi como queda
la relacion tiempo distancia.
El tiempo que nos dara el robot en la pantalla lo usaremos en la
formula que nos dio el grafico es asi como podremos saber cuanto mide la
distancia entre una calle (cinta negra) a otra.
Codigo
/*Autor:Grupo Terabytes.
Fecha: Miercoles 22, Jueves 23 y Viernes24 de Junio de 2011.
Objetivos.Desarrollar un codigo en lenguaje NXC para la actividad "PROYECTO FINAL".
*/
#define UMBRAL 40 //definicion del color blanco
#define CERCA 10
int Lineas = 0;
int cosecha=0;
int arboles =0;
long tiempo, tiempo_ini,tiempo1; //Entero largo para guardar la info del timer.
int luz,i,j;
int salida=0;
int salida2=0; //Definimos contadores para contralar la salida de una linea a otra
int salida3=0;
int salida4=0;
int salidafinal=0;
sub Buscar_linea()
{
i = 1;
j = 1;
while (i<5)
{
luz = Sensor(IN_2); //Luz recibe info del sensor de luz.
OnFwdReg(OUT_AB,30,OUT_REGMODE_SPEED); //Iniciar los motores con control de velocidad.
Wait(10);
if(luz < UMBRAL)
{ Lineas++;
if(j==1)
{
tiempo_ini = CurrentTick();
tiempo = 0;
NumOut(20,i*10,tiempo);
}
else
{
tiempo1 = CurrentTick();
tiempo = tiempo1 - tiempo_ini;
NumOut(20,i*10,tiempo);
}
i = i+1;
j = j+1;
Wait(200); //Tiempo de espera para que tome 1 dato por marca.
}
Wait(10);
}
OnFwd(OUT_B,30);
OnRev(OUT_A,30);
Wait(2500);
OnRev(OUT_AB,60);
Wait(600);
}
sub Cosecha1(){
while(Sensor(IN_2)<UMBRAL) //cuando este en la linea legra debe avanzar.
{
OnFwd(OUT_A,60); //las diferencia de potencia es para que se mantenga lo mas dercho posible.
OnFwd(OUT_B,56);
while(SensorUS(IN_3)<=CERCA) //se utiliza el while para que logre detectar y a la vez contar todos los ""arbles""
{
OnFwd(OUT_AB,65);
if(Sensor(IN_1)==1) //al chocar con un Arbol debe sumar una arbol mas y apagar los motores.
{
Off(OUT_AB);
arboles++;
if(Sensor(IN_2)<UMBRAL) //si choca con un arbol y esta posado en la linea debe "cosechra la fruta"
{
OnFwd(OUT_C,30); //ocupar la garra en el motor c.
Wait(1000);
Off(OUT_C);
} //lalve if
OnFwd(OUT_A,30); // girar si detecta o no la linea deve grira para seguir con el siguiente arbol.
OnRev(OUT_B,30);
Wait(2500);
} //llave if
} // llave while
}//llave while
if(Sensor(IN_2)>UMBRAL) //al momento de salir del while y si detecta el blanco dcebe avanzar a la siguiente linea.
{ //esto hace que siga la linea negra.
OnFwd(OUT_A,20);
OnRev(OUT_B,20);
} //llave if.
} //llave subrutina.
task main(){
SetSensorLight(IN_2); //sensor de luz
SetSensorLowspeed(IN_3); //sensor de ultrasonido
SetSensorTouch(IN_1); //sensor DELANTERO
//motor izquierda en A
//motor derecho en B
//motor de garra en C
Buscar_linea(); //subrutina
while(arboles<2) //realiza la subrutina mhasta que alla detectado 2 arboles
{
Cosecha1();
} //llave while
salida++; //luego de salir del while suma 1 a salida
while(salida==1) //luego de haber detectado 2 arboles pasa a la siguiente linea
{
OnFwd(OUT_A,60);
OnFwd(OUT_B,56);
if(Sensor(IN_2)<UMBRAL) //al detectar el color negro suma salida para seguir a la siguiente subrutina
{
salida++;
} //llave if
} //llave while
while(salida==2&&arboles<4) //realiza la subrutina mientras hasta que se detecten los 3-4 arboles
{
Cosecha1();
} //llave while
salida++;
salida2++; //la salida2 es para poner en parcha el paso a la tercera linea
while(salida2==1)
{
OnFwd(OUT_A,60);
OnFwd(OUT_B,56);
if(Sensor(IN_2)<UMBRAL) //al detectar el color negro.
{
salida2++; //se suma para salir del while.
salida3++; //suma salida 3 para dar paso a la subrutina y cosecha de arboles.
} //llave if
} //lave while
while(salida3==1&&arboles<6) //se realizara hasta que se "cosechen" los 5-6 arboles.
{
Cosecha1();
} //llave while
salida3++; //suma para dar ejecutar el paso de la tercera linea hacia la cuarta.
while(salida3==2)
{
OnFwd(OUT_A,60);
OnFwd(OUT_B,56);
if(Sensor(IN_2)<UMBRAL)
{
salida3++ ;
salida4++; //suma salida4 para ejecutar la ultima cosecha de los "arboles"
} //llave if
} //llave while
while(salida4==1&&arboles<8)
{
Cosecha1();
} //llave while
salida4++;
OnFwd(OUT_A,30); //giro en 180°.
OnRev(OUT_B,30);
Wait(2000);
OnFwd(OUT_AB,100); //avanza hasta la mitad de lalinea
Wait(1000);
OnFwd(OUT_A,80); //un giro
OnRev(OUT_B,70);
Wait(1000);
Off(OUT_AB); //fin de las acciones.
Fecha: Miercoles 22, Jueves 23 y Viernes24 de Junio de 2011.
Objetivos.Desarrollar un codigo en lenguaje NXC para la actividad "PROYECTO FINAL".
*/
#define UMBRAL 40 //definicion del color blanco
#define CERCA 10
int Lineas = 0;
int cosecha=0;
int arboles =0;
long tiempo, tiempo_ini,tiempo1; //Entero largo para guardar la info del timer.
int luz,i,j;
int salida=0;
int salida2=0; //Definimos contadores para contralar la salida de una linea a otra
int salida3=0;
int salida4=0;
int salidafinal=0;
sub Buscar_linea()
{
i = 1;
j = 1;
while (i<5)
{
luz = Sensor(IN_2); //Luz recibe info del sensor de luz.
OnFwdReg(OUT_AB,30,OUT_REGMODE_SPEED); //Iniciar los motores con control de velocidad.
Wait(10);
if(luz < UMBRAL)
{ Lineas++;
if(j==1)
{
tiempo_ini = CurrentTick();
tiempo = 0;
NumOut(20,i*10,tiempo);
}
else
{
tiempo1 = CurrentTick();
tiempo = tiempo1 - tiempo_ini;
NumOut(20,i*10,tiempo);
}
i = i+1;
j = j+1;
Wait(200); //Tiempo de espera para que tome 1 dato por marca.
}
Wait(10);
}
OnFwd(OUT_B,30);
OnRev(OUT_A,30);
Wait(2500);
OnRev(OUT_AB,60);
Wait(600);
}
sub Cosecha1(){
while(Sensor(IN_2)<UMBRAL) //cuando este en la linea legra debe avanzar.
{
OnFwd(OUT_A,60); //las diferencia de potencia es para que se mantenga lo mas dercho posible.
OnFwd(OUT_B,56);
while(SensorUS(IN_3)<=CERCA) //se utiliza el while para que logre detectar y a la vez contar todos los ""arbles""
{
OnFwd(OUT_AB,65);
if(Sensor(IN_1)==1) //al chocar con un Arbol debe sumar una arbol mas y apagar los motores.
{
Off(OUT_AB);
arboles++;
if(Sensor(IN_2)<UMBRAL) //si choca con un arbol y esta posado en la linea debe "cosechra la fruta"
{
OnFwd(OUT_C,30); //ocupar la garra en el motor c.
Wait(1000);
Off(OUT_C);
} //lalve if
OnFwd(OUT_A,30); // girar si detecta o no la linea deve grira para seguir con el siguiente arbol.
OnRev(OUT_B,30);
Wait(2500);
} //llave if
} // llave while
}//llave while
if(Sensor(IN_2)>UMBRAL) //al momento de salir del while y si detecta el blanco dcebe avanzar a la siguiente linea.
{ //esto hace que siga la linea negra.
OnFwd(OUT_A,20);
OnRev(OUT_B,20);
} //llave if.
} //llave subrutina.
task main(){
SetSensorLight(IN_2); //sensor de luz
SetSensorLowspeed(IN_3); //sensor de ultrasonido
SetSensorTouch(IN_1); //sensor DELANTERO
//motor izquierda en A
//motor derecho en B
//motor de garra en C
Buscar_linea(); //subrutina
while(arboles<2) //realiza la subrutina mhasta que alla detectado 2 arboles
{
Cosecha1();
} //llave while
salida++; //luego de salir del while suma 1 a salida
while(salida==1) //luego de haber detectado 2 arboles pasa a la siguiente linea
{
OnFwd(OUT_A,60);
OnFwd(OUT_B,56);
if(Sensor(IN_2)<UMBRAL) //al detectar el color negro suma salida para seguir a la siguiente subrutina
{
salida++;
} //llave if
} //llave while
while(salida==2&&arboles<4) //realiza la subrutina mientras hasta que se detecten los 3-4 arboles
{
Cosecha1();
} //llave while
salida++;
salida2++; //la salida2 es para poner en parcha el paso a la tercera linea
while(salida2==1)
{
OnFwd(OUT_A,60);
OnFwd(OUT_B,56);
if(Sensor(IN_2)<UMBRAL) //al detectar el color negro.
{
salida2++; //se suma para salir del while.
salida3++; //suma salida 3 para dar paso a la subrutina y cosecha de arboles.
} //llave if
} //lave while
while(salida3==1&&arboles<6) //se realizara hasta que se "cosechen" los 5-6 arboles.
{
Cosecha1();
} //llave while
salida3++; //suma para dar ejecutar el paso de la tercera linea hacia la cuarta.
while(salida3==2)
{
OnFwd(OUT_A,60);
OnFwd(OUT_B,56);
if(Sensor(IN_2)<UMBRAL)
{
salida3++ ;
salida4++; //suma salida4 para ejecutar la ultima cosecha de los "arboles"
} //llave if
} //llave while
while(salida4==1&&arboles<8)
{
Cosecha1();
} //llave while
salida4++;
OnFwd(OUT_A,30); //giro en 180°.
OnRev(OUT_B,30);
Wait(2000);
OnFwd(OUT_AB,100); //avanza hasta la mitad de lalinea
Wait(1000);
OnFwd(OUT_A,80); //un giro
OnRev(OUT_B,70);
Wait(1000);
Off(OUT_AB); //fin de las acciones.
Video de la actividad.
Conclusion
Con este trabajo logramos de forma satisfactoria llevar a la práctica el problema planteado, gracias a los conocimientos adquiridos durante el semestre; ya que este problema
era de alta complejidad, y para llevarlo a cabo necesitábamos de todos
los conocimientos aplicados en trabajos anteriores.
Para
el grupo en general ha sido una experiencia muy positiva, haber tenido
la posibilidad de haber experimentado las distintas funciones que puede
desarrollar un robot para el beneficio nuestro.
Logramos
ocupar de manera correcta los comandos necesarios para que el robot
funcionara sin problemas y pudiera cumplir el objetivo, el cual nos
servirá para estar preparados para poder enfrentar sin mayor dificultad
la propuesta que se nos viene en el próximo semestre.
No hay comentarios:
Publicar un comentario