Autor: Daniela Muñoz Muñoz
Competencia: Aplica las Ciencias de la ingeniería. (Nivel 1)
Palabras Clave: Programación, NXC, Rotobica, Lego.
Descripción de la Actividad: A continuación les daré a conocer mi grata experiencia como estudiante de primer año de ingeniería civil en informática, en el laboratorio llamado "Robot Cosechador", para el kit de robots de Lego NXT.
El proposito del laboratorio consistía en ayudar en las preparaciones de la cosecha anual para el fundo "La Aurora". El Robot esta diseñado para sacar los duraznos de los durazneros, pero, en el caso que el robot reconozca manzanas debe dejarlos en el lugar en que estas se encuentran , ya que, la época para cosechar las manzanas es en el otoño.
Solución
Para este proyecto tuvimos 2 soluciones:
-Usar la física para medir distancia y tiempo.
-Crear el pseudocódigo que nos facilitara el desarrollo del código.
Aplicacion de fisica:
El robot se programo con potencia 30.
Los siguientes datos son los entregados por el robot, en tiempo y distancia según lo medido en la pista.
Según la tabla anterior, el gráfico obtenido es el siguiente:
En la siguiente tabla, se mostraran los datos dados por la ecuación y datos tomados de la pista
Según la tabla anterior, el gráfico obtenido es el siguiente:
Pseudocodigo:
CERCA = 8 cm
Contador long tiempo, tiempo_ini,tiempo1;
contadorluz,i,j;
contadorarbol=0;
contadorarboles_cosechados=0;
contadordz = 0;
subrutina cosechando:
{
Mover mano.
Contador dz se le sumara 1.
retroceder.
Girar 180º.
avanzar.
Mostrar en pantalla duraznos = dz.
}
Subrutina avanzar:
{
Si el sensor ultrasonido detecta algo a menos de 8 cm:
{
Avanzar por dos segundos.
}
}
Subrutina buscar_camino:
{
Avanzar.
}
Subrutina volver_camino:
{
Girar hacia la izquierda hasta encontrar nuevamente la línea negra.
}
Subrutina cambiar_lineas:
{
Si los arboles cosechados es igual a 8:
{
apagar motores B y C por 10 seg.
}
sino
{
Avanzar por 2 segundos.
Girar 90ºa la derecha.
Avanzar hasta que el sensor de luz detecte negro.
} }
Taskmain() {
-Setear el Sensor tactil.
-Setear el sensor de luz.
-setear el sensor Ultrasonido.
medir_dist(); //Se ejecutara la subrutina medir_distancia.
Mientras(arboles_cosechados<8) //Mientras los arboles cosechados sean
//menores que ocho, realizara lo siguiente:
{
avanzar(); //Se activa la subrutina avanzar.
Si(sensor de luz < 40) //Si el sensor de luz detecta negro:
{
buscar_camino(); //Buscara el camino.
si (sensor tacto se activa) //Si el sensor de tacto se activa mientras esta
//en la línea negra:
{ Árbol++ //al contadroarbol, le sumara uno.
arboles_cosechados++ //al contador arboles_cosechados, le sumara uno.
cosechando(); //se ejecutara la subrunica cosechar
si( contador árbol = 2) //cuando lleve cosechado dos arboles:
{
cambiar_linea(); //realizara el cambio de línea.
Árbol =0; //volverá el contador arbol a 0.
}
}
}
Sino
si(sensor tacto se activa) //Si el sensor de tacto se activa mientras no esta
//en la línea negra:
{
arbol++; //al contador arbol, se le sumara uno.
arboles_cosechados++; //al contador arboles_cosechados se le sumara uno.
retroceder. //retrocedera por 1 segundo.
avanzar. //realizara un giro de 180 grados, quedando
//en dirección al otro árbol.
Si(árbol ==2){ //cuando lleve cosechado dos arboles:
cambiar_linea(); //realizara el cambio de línea.
arbol=0; //volverá el contador arbol a 0.
}}
sino
si (sensor luz detecta blanco) //si el sensor de luz detecta blanco.
{
volver_camino(); //Ejecutara la subrutina volver_camino.
}}}
El pseudocódigo anteriormente mencionado, corresponde al siguiente código:
//
//Grupo:The BootsFather´s.
//
#define CERCA 8 long tiempo, tiempo_ini,tiempo1;
int luz,i,j;
int arbol=0;
int arboles_cosechados=0;
int dz = 0;
sub medir_dist(){ //En esta subrutina, el robot nos entrega el tiempo que
//demora el robot en cruzar cada linea demarcada,
//para luego calcular la aceleración del robot.
i = 1;
j = 1;
while (i<5)
{
luz = Sensor(IN_3);
OnFwdReg(OUT_BC,40,OUT_REGMODE_SPEED);
Wait(10); if(luz < 40)
{
if(j==1)
{
tiempo_ini = CurrentTick();
tiempo = 0;
TextOut(10, i*10, "Tiempo In:");
NumOut(70,i*10,tiempo);
}
else
{
tiempo1 = CurrentTick();
tiempo = tiempo1 - tiempo_ini;
TextOut(10, i*10, "Tiempos:");
NumOut(70,i*10,tiempo);
}
i = i+1;
j = j+1;
Wait(200);
}
Wait(10);
}
Float(OUT_BC);
OnFwd(OUT_B,30);
Wait(830);
OnRev(OUT_C,30);
Wait(830);
}
//En la subrutina cosechando, el robot realiza la maniobra para cosechar,
//en la cual la mano que tiene el robot, se mueve cuando el sensor de
//tacto se activa y el sensor de luz esta en negro, botando el cubo, que
//esta vez lo ocuparemos como fruta.
sub cosechando(){
OnRev(OUT_A,20);
Wait(1500);
OnFwd(OUT_A,20);
Wait(1500);
dz++;
OnRev(OUT_C,40);
OnRev(OUT_B,40);
Wait(1000);
OnFwd(OUT_B,30);
Wait(500);
OnRev(OUT_C,30);
Wait(500);
TextOut(10, 50, "Duraznos:");
NumOut(70, 50, dz);
}
//En esta subrutina avanzar, el robot al encontrarse con un árbol (caja),
//el robot avanzara sin importar la línea, hasta que se active el sensor
//de tacto, para ahí realizar la subrutina cosechando.
sub avanzar() {
if(SensorUS(IN_2)< CERCA)
{
OnFwd(OUT_BC, 30);
Wait(1000);
}
}
//En la subrutina buscar_camino, el robot avanzara por la línea negra, para
//poder encontrar los arboles.
sub buscar_camino() {
OnFwd(OUT_B,30);
OnFwd(OUT_C,35);
}
//En la subrutina volver_camino, el robot, al salirse de la linea negra,
//este volverá a la línea negra, girando al lado contrario del lado que salió.
sub volver_camino() {
OnRev(OUT_C, 30 );
OnFwd(OUT_B, 20);
}
//En esta subrutina, cambiar_linea, el robot al ver que ha cosechado los
//dos arboles de la primera línea, este girara 90º a la derecha, y avanzara
//infinitamente hasta encontrarse con la siguiente línea. y cuando han
//pasado los 8 árboles, este girara los 90º pero avanzara por 1 segundo y
//se detendrá.
sub cambiar_linea() {
if(arboles_cosechados==8)
{
Off(OUT_BC);
while(10000);
}
else
{
OnFwdReg(OUT_BC,20,OUT_REGMODE_SPEED);
Wait(1000);
OnFwd(OUT_C, 40);
Wait(100);
OnRev(OUT_B, 40);
Wait(100);
OnFwdReg(OUT_BC,20,OUT_REGMODE_SPEED);
Wait(100);
until(SENSOR_3<40);
}
}
task main() {
SetSensorTouch(IN_4); //Se setea el sensor Touch.
SetSensorLight(IN_3); //Se setea el sensor de luz.
SetSensorLowspeed(IN_2); //Se setea el sensor de UltraSonido.
medir_dist(); //Se ejecutara la subrutina medir_distancia.
while(arboles_cosechados<8) //Mientras los arboles cosechados sean
// menores que ocho, realizara lo siguiente:
{
avanzar(); //Se activa la subrutina avanzar.
if(SENSOR_3<40) //Si el sensor de luz detecta negro:
{
buscar_camino(); //Buscara el camino.
if(SENSOR_4==1) //Si el sensor de luz se activa mientras esta
//en la linea negra:
{
arbol++; //al contador arbol, le sumara uno.
arboles_cosechados++; //al contador arboles_cosechados, le sumara uno.
cosechando(); //se ejecutara la subrutina cosechar
if(arbol==2) //cuando lleve cosechado dos árboles:
{
cambiar_linea(); //realizara el cambio de línea.
arbol=0; //volverá el contador arbol a 0.
} } }
else
if(SENSOR_4==1) //Si el sensor de luz se activa mientras no esta
//en la línea negra:
{
arbol++; //al contador arbol, se le sumara uno.
arboles_cosechados++; //al contador arboles_cosechados se le sumara uno.
OnRev(OUT_BC,50); //retrocederá por 1 segundo.
Wait(1000);
OnFwd(OUT_C,50);
OnRev(OUT_B,50); //realizara un giro de 180 grados, quedando
//en dirección al otro arbol.
Wait(1500);
if(arbol==2){ //cuando lleve cosechado dos árboles:
cambiar_linea(); //realizara el cambio de línea.
arbol=0; //volverá el contador arbol a 0.
} }
else
if(SENSOR_3>40) //si el sensor de luz detecta blanco.
{
volver_camino(); //Ejecutara la subrutina volver_camino.
}}}
El vídeo que muestra la actividad es el siguiente:
Reflexión:
Al realizar este proyecto, logre complementar lo adquirido en el primer semestre, usando y logrando completar una etapa fundamental del desarrollo de los conocimientos.
En el caso de la cosecha de nuestro robot, es satisfactorio saber que se pudo lograr el objetivo, un proyecto llamativo pero a la vez largo, ocupando variados conocimientos y también tiempo.
También pude desarrollar habilidades básicas de la física, para complementar la exactitud de nuestro robot, respecto de la distancia y el tiempo según la potencia estipulada.