Competencia: Gestión en TI. (Nivel 1)
Palabras claves: NXT, programacion, Robot, Lego.
Descripción de la actividad
Esta actividad fue propuesta por los profesores de programación de robot, y les daré a conocer los detalles de tal actividad.
La actividad consistia en utilizar un robot lego NXT que debía simular a un robot
cosechador el cual debia partir sobre un punto especifico y recorrer todo el
campo hasta su extremo, mientras recorre la superficie este tiene que registrar
los tiempos que recorre en cada linea, luego debe reconocer la linea negra y
guiarse hasta cada caja y reconocer si en el borde es negro si es asi botara
una manzana(cubo negro) y de no ser asi osea blanco seguira su camino hasta
recorrer toda la superficie.
La actividad consistia en utilizar un robot lego NXT que debía simular a un robot
cosechador el cual debia partir sobre un punto especifico y recorrer todo el
campo hasta su extremo, mientras recorre la superficie este tiene que registrar
los tiempos que recorre en cada linea, luego debe reconocer la linea negra y
guiarse hasta cada caja y reconocer si en el borde es negro si es asi botara
una manzana(cubo negro) y de no ser asi osea blanco seguira su camino hasta
recorrer toda la superficie.
Solución
Fue muy difícil llegar a la solución del problema, ya que había que calibrar muy bien al robot para que lograra el objetivo esperado. El codigo y pseudocodigo que les mostrare nos da la solucion.
pseudocodigo:
Definición variables y el umbral para el sensor de luz;
creamos subrutinas;
sub avanzar()
{
avanzar el linea recta con velocidad 40;
en un tiempo de 2 segundo;
}
sub regresar();
{
realiza un giro de 180°;
while(true){
avanza en linea recta con velocidad 40;
si(sensor de luz supera el umbral de negro)
{
realiza un giro de 90°;
y se quiebra el while;
sub escanear()
{
entramos en un while donde el contador es menor a 4(){
avanza en linea recta con velocidad 40;
si(sensor de luz supera umbral)
{
guarda el tiempo;
contador++;
}
}
sub guiarse()
{
Si(sensor de luz supera umbral)
{
gira 90°
entra a un while(true){
si(sensor supera el umbral)
{
avanza lento desviandose hacia la derecha;
}
else
se desvia hacia la izquierda;
si(sensor de tacto es tocado)
{
se rompe el while;
}
sub botar()
{
si(sensor de luz supera el umbral)
{
el motor A(herramienta cosecha) gira 180°;
motor A regresa a su posición;
robot retrocede por medio segundo;
gira 180°;
}
sino
{
retrocede por medio segundo;
gira 180°;
}
}
sub volver()
{
{
avanza desviandose hacia la derecha;
}
sino
se desvia hacia la izquierda;
si(sensor de tacto es presionado)
{
se quiebra el while;
}
}
}
sub alinear()
{
while(true)
{
girar 90°;
regresar();
entra en un while donde contador va a ser menor a 8{
guiarse();
Codigo:
Definición variables y el umbral para el sensor de luz;
creamos subrutinas;
sub avanzar()
{
avanzar el linea recta con velocidad 40;
en un tiempo de 2 segundo;
}
sub regresar();
{
realiza un giro de 180°;
while(true){
avanza en linea recta con velocidad 40;
si(sensor de luz supera el umbral de negro)
{
realiza un giro de 90°;
y se quiebra el while;
} }
}sub escanear()
{
entramos en un while donde el contador es menor a 4(){
avanza en linea recta con velocidad 40;
si(sensor de luz supera umbral)
{
guarda el tiempo;
contador++;
}
}
sub guiarse()
{
Si(sensor de luz supera umbral)
{
gira 90°
entra a un while(true){
si(sensor supera el umbral)
{
avanza lento desviandose hacia la derecha;
}
else
se desvia hacia la izquierda;
si(sensor de tacto es tocado)
{
se rompe el while;
}
sub botar()
{
si(sensor de luz supera el umbral)
{
el motor A(herramienta cosecha) gira 180°;
motor A regresa a su posición;
robot retrocede por medio segundo;
gira 180°;
}
sino
{
retrocede por medio segundo;
gira 180°;
}
}
sub volver()
{
while(true)
{
si(sensor supera umbral){
avanza desviandose hacia la derecha;
}
sino
se desvia hacia la izquierda;
si(sensor de tacto es presionado)
{
se quiebra el while;
}
}
}
sub alinear()
{
while(true)
{
girar 90°;
avanzar en linea recta;
si(sensor luz supera el umbral)
{
se quiebra el while;
}
}
task main()
{
Se enciende robot;
se declaran sensores;
se realiza la subrutina escanear();regresar();
entra en un while donde contador va a ser menor a 8{
guiarse();
botar();
contador++;
volver();
botar();
contador++;
avanzar();
alinear();
}
}
//subrutinas
sub avanzar()
{
OnFwdReg(OUT_BC,40,OUT_REGMODE_SPEED);
Wait(800);
OnRev(OUT_B,40);
OnFwd(OUT_C,40);
Wait(990);
while(true){
OnFwdReg(OUT_BC,40,OUT_REGMODE_SPEED);
if(Sensor(IN_3)<negro)
{
OnFwd(OUT_B,40);
OnRev(OUT_C,40);
Wait(800);
break;
}
}
}
sub regresar()
{
OnFwd(OUT_B,40);
OnRev(OUT_C,40);
Wait(1980);
// OnRevReg(OUT_BC,40,OUT_REGMODE_SPEED);
// Wait(800);
while(true){
OnFwdReg(OUT_BC,40,OUT_REGMODE_SPEED);
if(Sensor(IN_3)<negro)
{
OnFwd(OUT_B,40);
OnRev(OUT_C,40);
Wait(800);
break;
}
}
}
sub escanear()
{
while(cont<4)
{
OnFwdReg(OUT_BC,40,OUT_REGMODE_SPEED);
t0 = CurrentTick();
NumOut(60,cont*10,40);
while((t1-t0)<1500)
{
OnFwdReg(OUT_BC,40,OUT_REGMODE_SPEED);
luz = Sensor(IN_3);
t1 = CurrentTick();
if(luz <50)
{
tiempo = CurrentTick();
NumOut(10,cont*10,tiempo); //pantalla
cont = cont+1; //cuenta 1 mas
if(cont==7)
{
break;
}
if(pm < 40)
{
Wait(400);
}
else
{
Wait(50);
}
}
t1 = CurrentTick();
if((t1-t0)>1499)
{
conta = conta+1;
pm = 10*(conta);
}
}
}
}
sub guiarse()
{
while(true)
{
if(Sensor(IN_3)<negro)
{
OnFwd(OUT_B,25);
OnFwd(OUT_C,10);
}
if(Sensor(IN_3)>negro)
{
OnFwd(OUT_B,10);
OnFwd(OUT_C,25);
}
if(Sensor(IN_1)==1)
{
break;
}
}
}
sub botar() //bien
{
if(Sensor(IN_3)<negro)
{
Off(OUT_BC);
OnRev(OUT_A,20);
Wait(1500);
OnFwd(OUT_A,20);
Wait(1600);
Off(OUT_A);
OnRev(OUT_BC,50);
Wait(500);
OnFwd(OUT_B,40);
OnRev(OUT_C,40);
Wait(1980);
Off(OUT_BC);
}
else
{
OnRev(OUT_BC,50);
Wait(500);
OnFwd(OUT_B,40);
OnRev(OUT_C,40);
Wait(1980);
Off(OUT_BC);
}
}
sub volver()
{
while(true)
{
if(Sensor(IN_3)<negro)
{
OnFwd(OUT_B,12);
OnFwd(OUT_C,30);
}
else
{
OnFwd(OUT_B,30);
OnFwd(OUT_C,12);
}
if(Sensor(IN_1)==1)
{
break;
}
}
}
task main()
{
SetSensorTouch(IN_1);
SetSensorLight(IN_3);
escanear();
regresar();
while (conta<16)
{
guiarse();
botar();
conta++;
volver();
botar();
conta++;
avanzar();
}}Video de la actividad:
Refexiones
Este trabajo final fue muy provechoso para cada uno de los integrantes del grupo, ya que puso a prueba nuestras habilidades en física y de programación de robots lego NXT, demostrándonos que no es sencillo programar robots, incluso los lego, nunca se termina de aprender algo nuevo que se le pueda integrar a un código cualquiera y además que siempre se puede hacer algo mejor de lo que ya está hecho.
Espero les ayude la materia de este blog, a mí me presto una gran ayuda.
No hay comentarios:
Publicar un comentario