Alumno: Juan Francisco Mendoza Martínez
Compatencia: Gestion en TI
Palabras claves: Robot, Sub,Cosecha
- Descripción de la actividad:
Es una simulación de recolección de frutas, basado en la actividad realizada por temporeros en el período de cosecha. El objetivo es coger la fruta madura (representada por cubos negros), dejando intacto a la fruta que está inmadura (representadas por cubos blancos). Para cumplir con el objetivo, el robot recorrerá una ruta determinada. En ambos lados del trayecto, estarán los árboles (representadas con cubos grandes, de color blanco) que están conectados por caminos (líneas de color negro). El recolector deberá inspeccionar cada árbol para coger la fruta madura.
- Subrutinas:
1.- sub brazo(): El brazo se mueve para coger la fruta
2.- busqueda: está segmentada en 3 partes, denominadas busqueda1(),
busqueda2() y busqueda3()
a) sub busqueda1(): Su función es detectar las líneas negras y al momento
de ocurrir esto, gira 90º hacia su derecha y se dirige hacia al árbol, para
luego pasar a la subrutina busqueda2().
b) sub busqueda2(): Su función es detectar frente a que fruta nos encontramos,
si detecta el Durazno deberá pasar inmediatamente a la subrutina brazo(),
de lo contrario el robot retrocede, gira y continua su búsqueda hacia los
demás árboles.
c) sub busqueda3():
3.- cuentaT(): Define el comportamiento del robot durante la inspección del área.
Al detectar las líneas negras, cuenta el tiempo entre cada línea, facilitando
así la estimación de la distancia entre una franja y otra.
- Código Fuente
long tiempo, tiempo_ini, tiempo1;
int luz, i, j;
sub brazo() //subrutina para el movimiento del brazo
{
OnFwd(OUT_A,75);
Wait(2000); //giro 360° bota la fruta
Off(OUT_A);
}
sub busqueda3() //subrutina para buscar los cubos marcados donde se deba realizar la "cosecha" 3ra parte
{
OnFwd(OUT_B,50);
OnFwd(OUT_C,55);
Wait(1000);
OnFwd(OUT_C,50);
OnRev(OUT_B,50); //giro 90° derecha
Wait(500); // tiempo para 90°
OnFwd(OUT_BC,50);
until (Sensor(IN_3) < 43); //avance hasta siguiente linea negra
}
sub busqueda2() //subrutina para buscar los cubos marcados donde se deba realizar la "cosecha" 2da parte
{
OnFwd(OUT_B,50);
OnFwd(OUT_C,53);
until (SENSOR_1==1);
Off(OUT_BC);
if(Sensor(IN_3) <= 43)
{
brazo();
OnFwd(OUT_B,50);
OnRev(OUT_C,50); //giro 180°
Wait(1000); // tiempo para 180°
OnFwd(OUT_BC,50);
}
else
{
OnFwd(OUT_B,50);
OnRev(OUT_C,50); //giro 180°
Wait(1000); // tiempo para 180°
OnFwd(OUT_BC,50);
}
}
sub busqueda1() //subrutina para buscar los cubos marcados donde se deba realizar la "cosecha" 1era parte
{
OnFwd(OUT_B,50);
OnRev(OUT_C,50); //giro 90° derecha
Wait(500); // tiempo para 90°
OnFwd(OUT_B,50);
OnFwd(OUT_C,53);
until (SENSOR_1==1);
Off(OUT_BC);
if(Sensor(IN_3) <= 43)
{
brazo();
OnFwd(OUT_B,50);
OnRev(OUT_C,50); //giro 180°
Wait(1000); // tiempo para 180°
OnFwd(OUT_B,50);
OnFwd(OUT_C,53);
busqueda2();
}
else
{
OnFwd(OUT_B,50);
OnRev(OUT_C,50); //giro 180°
Wait(1000); // tiempo para 180°
OnFwd(OUT_B,50);
OnFwd(OUT_C,53);
busqueda2();
}
}
sub cuentaT() //subrutina para marcar el tiempo empleado para pasar por las cuatro lineas negras
{
i=0;
j=0;
while(i<=4)
{
luz = Sensor(IN_3);
if(luz <= 43)
{
NumOut(20,i*10,tiempo);
i++;
if(j==1)
{
tiempo_ini = CurrentTick();
tiempo = 0;
NumOut(20,i*10,tiempo); //muestra en pantalla el tiempo empleado hasta llegar a la primera linea negra
}
else
{
tiempo1 = CurrentTick();
tiempo = tiempo1 - tiempo_ini;
NumOut(20,i*10,tiempo); //muestra en pantalla el tiempo empleado hasta llegar a la 2da, 3ra y 4ta linea negra respectivamente
}
i = i++;
j = j++;
Wait(200);
}
}
until (SENSOR_1==1)
//choque contra la pared al fondo de la mesa
OnFwd(OUT_B,50);
OnFwd(OUT_C,53);
Wait(500); //retroceso de medio segundo para alejarse de la pared
OnFwd(OUT_B,50);
OnRev(OUT_C,50);
Wait(1000); //tiempo de espera para realizar un giro de 180 grados
OnFwd(OUT_B,50);
OnFwd(OUT_C,53);
until (Sensor(IN_3) <= 43); //avance hasta llegar a la linea negra mas cercana
}
task main()
{
SetSensorTouch(IN_1); //encendido sensor de tacto en puerto 1
SetSensorLight(IN_3); //encendido sensor de luz en puerto 3
i=1;
j=1;
OnFwd(OUT_B,50);
OnFwd(OUT_C,53);
cuentaT();
repeat(4)
{
busqueda1();
busqueda2();
busqueda3();
}
Off(OUT_BC);
}
- Explicación grafica de sub-rutinas CuentaLineas()

La subrutina CuentaLíneas() define el comportamiento del robot durante la inspección del área. Al detectar las líneas negras, cuenta el tiempo entre cada línea, facilitando así la estimación de la distancia entre una franja y otra.
Subrutina DetectaLinea():
Una vez que el robot termine de inspeccionar la ruta, al regresar, el sensor de luz deberá detectar la primera línea, con la finalidad de ir hacia el árbol.

Explicación gráfica de Subrutina DetectaLinea(), DetectaArbol(), y el camino que realizara el robot.
Subrutina DetectaArbol():
Una vez que el sensor de tacto detecte al árbol, el sensor de luz deberá identificar la presencia de la marca “T”
Subrutina DetectaFruta():
Una vez que el robot ha detectado la línea negra y se ha dirigido hacia el árbol a través de ésta subrutina deberá detectar que fruta se encuentra en éste. En el caso de ser Durazno, a través de la garra deberá tomar la fruta y depositarla en el lugar determinado. Luego retrocederá y continuará su camino, en el caso que la fruta sea manzana el robot no realizará actividad alguna y continuara su camino hacia los demás arboles.
* Varios elementos de la idea original se mantuvieron, como por ejemplo la subrutina CuentaLineas(), pero agregamos más tareas que son útiles al momento de detectar la marca “T” *
a.- Subrutina CuentaT() : Define el comportamiento del robot durante la inspección del área. Al detectar las líneas negras, cuenta el tiempo entre cada línea, facilitando así la estimación de la distancia entre una franja y otra.
sub cuentaT() //subrutina para marcar el tiempo empleado para pasar por las cuatro lineas negras
{
i=0;
j=0;
while(i<=4)
{
luz = Sensor(IN_3);
if(luz <= 43)
{
NumOut(20,i*10,tiempo);
i++;
if(j==1)
{
tiempo_ini = CurrentTick();
tiempo = 0;
NumOut(20,i*10,tiempo); //muestra en pantalla el tiempo empleado hasta llegar a la primera linea negra
}
else
{
tiempo1 = CurrentTick();
tiempo = tiempo1 - tiempo_ini;
NumOut(20,i*10,tiempo); //muestra en pantalla el tiempo empleado hasta llegar a la 2da, 3ra y 4ta linea negra respectivamente
}
i = i++;
j = j++;
Wait(200);
}
}
until (SENSOR_1==1)
//choque contra la pared al fondo de la mesa
OnFwd(OUT_B,50);
OnFwd(OUT_C,53);
Wait(500); //retroceso de medio segundo para alejarse de la pared
OnFwd(OUT_B,50);
OnRev(OUT_C,50);
Wait(1000); //tiempo de espera para realizar un giro de 180 grados
OnFwd(OUT_B,50);
OnFwd(OUT_C,53);
until (Sensor(IN_3) <= 43); //avance hasta llegar a la linea negra mas cercana
b.-Subrutina Busqueda1(): Su función es detectar las líneas negras y al momento de ocurrir esto, gira 90º hacia su derecha y se dirige hacia al árbol, para luego pasar a la subrutina Busqueda2().
sub busqueda1() //subrutina para buscar los cubos marcados donde se deba realizar la "cosecha" 1era parte
{
OnFwd(OUT_B,50);
OnRev(OUT_C,50); //giro 90° derecha
Wait(500); // tiempo para 90°
OnFwd(OUT_B,50);
OnFwd(OUT_C,53);
until (SENSOR_1==1);
Off(OUT_BC);
if(Sensor(IN_3) <= 43)
{
brazo();
OnFwd(OUT_B,50);
OnRev(OUT_C,50); //giro 180°
Wait(1000); // tiempo para 180°
OnFwd(OUT_B,50);
OnFwd(OUT_C,53);
busqueda2();
}
else
{
OnFwd(OUT_B,50);
OnRev(OUT_C,50); //giro 180° ?
Wait(1000); // tiempo para 180°
OnFwd(OUT_B,50);
OnFwd(OUT_C,53);
busqueda2();
}
}
c.- Subrutina Busqueda2(): Su función es detectar frente a que fruta nos encontramos, si detecta el Durazno deberá pasar inmediatamente a la subrutina brazo(), de lo contrario el robot retrocede, gira y continua su búsqueda hacia los demás árboles.
sub busqueda2() //subrutina para buscar los cubos marcados donde se deba realizar la "cosecha" 2da parte
{
OnFwd(OUT_B,50);
OnFwd(OUT_C,53);
until (SENSOR_1==1);
Off(OUT_BC);
if(Sensor(IN_3) <= 43)
{
brazo();
OnFwd(OUT_B,50);
OnRev(OUT_C,50); //giro 180° ?
Wait(1000); // tiempo para 180° ?
OnFwd(OUT_BC,50);
}
else
{
OnFwd(OUT_B,50);
OnRev(OUT_C,50); //giro 180° ?
Wait(1000); // tiempo para 180° ?
OnFwd(OUT_BC,50);
}
}
d.- Subrutina Busqueda3(): En esta sección, el robot inicia su marca, buscando el primer árbol.
sub busqueda3() //subrutina para buscar los cubos marcados donde se deba realizar la "cosecha" 3ra parte
{
OnFwd(OUT_B,50);
OnFwd(OUT_C,55);
Wait(1000);
OnFwd(OUT_C,50);
OnRev(OUT_B,50); //giro 90° derecha
Wait(500); // tiempo para 90° ?
OnFwd(OUT_B,50);
OnFwd(OUT_C,55);
until (Sensor(IN_3) < 43); //avance hasta siguiente linea negra
}
e.- Subrutina Brazo(): Tiene como fin obtener la fruta Durazno para luego depositarla en el lugar que se estimará conveniente.
sub brazo() //subrutina para el movimiento del brazo
{
OnFwd(OUT_A,75);
Wait(2000); //giro 360° bota la fruta
Off(OUT_A);
}
- Pseudocódigo
Sub brazo() //MueveBrazo
{
{
-Gira en 360º
-Deposita la fruta
-Deposita la fruta
}
Sub busqueda3() //BuscaCubos
{
-Gira 90º a su derecha
- avanza hacia el árbol
- hasta que lo detecte
- avanza hacia el árbol
- hasta que lo detecte
}
Sub búsqueda 2() // Encuentra el Durazno
{
Avanza hasta que detecta el Árbol
si (detecta Durazno)
{ brazo() } //utiliza la subrutina brazo
si (detecta Durazno)
{ brazo() } //utiliza la subrutina brazo
Sino {
retrocede
Gira y avanza para
dirigirse hacia otro árbol
Gira y avanza para
dirigirse hacia otro árbol
}
}
Sub busqueda1() //inicio de inspección del área
{
Avanza hasta detectar el primer árbol
}
Sub cuentaT() //cuenta el tiempo entre las líneas
Sub cuentaT() //cuenta el tiempo entre las líneas
{
Avanza por la pista
Cuenta tiempo entre c/ línea Hasta chocar con la pared
Cuenta tiempo entre c/ línea Hasta chocar con la pared
Retrocede y gira
}
task main()
{
{
-Encendemos sensor de Tacto
-Encendemos sensor de Luz
-Encendemos sensor de Luz
i= 1;
j=1;
j=1;
sub marcaT();
repite procesos * (4)
{ búsqueda1();
busqueda2();
busqueda3(); ??
{ búsqueda1();
busqueda2();
busqueda3(); ??
}
detiene los motores B y C
}
- Solución:
En ese momento se pudo obtener un buen trabajo en equipo, para poder así ir desarrollando esa parte tan clave en la informática. El grupo se empezo a fortalecer para poder así desarrollar sin mayores dificultades siguientes trabajos con los robots. Además aprender la forma en que se deben utilizar las Subrutinas para que el robot cumpla con lo señalado
- Imagenes del Robot Cosecha:

Se peude apreciar el sensor de tacto, el motor que sostenia la hoz para cortar el arbol solicitado.

Se aprecia con mas claridad el sensor de luz para que este reconociera negro si el robot debia o no cosechar el arbol.
Reflexión
Se pudo constatar un aprendizaje efectivo, donde el trabajo en equipo y la division de tareas entre nosotros, se puso lograr que la actividad terminara con exito. Logré una forma practica de utilizar las Subrutinas.
Estimado me gustaria conocer un poco mas sobre este proyecto, le indico mi correo electronico para poder contactarme con usted. Saludos
ResponderEliminaratte.
Iker Romeo Wyss
ikerromeo@gmail.com