jueves, 18 de octubre de 2012

Primera actividad.-Proyecto Robótica(2° semestre)


Autor: Fermín Pradena.
Competencia: Desarrollo de Software, 2° Semestre.
Palabras clave: Robótica, programación, NXT, NXC, lego.

Descripción de la actividad
En esta primera actividad realizada en el ramo de Proyecto Robótica, tuvimos que armar y programar un robot que se desplazaba por una superficie rectangular blanca con algunos puntos negros y paredes en sus bordes. Cada vez que el robot chocaba con una pared(detectando con el sensor de tacto), éste debia retroceder un poco, girar y disminuir su potencia, contando cada vez que cochaba. Así como cuando también cada vez que detectaba un punto negro (con su sensor de luz) también debia contarlo, girar y aumentar su potencia. El robot avanzaba y contaba cada choque con pared y punto negro hasta que escuchaba un sonido de determinado volumen., informando en su pantalla la cantidad de choques y puntos negros detectados.

Código de la solución, con sus respectivos comentarios

/*Grupo Umbrella*/

/*El programa consta de una subrutina con paso de parámetros y el task main*/


/*Los parámetros de la subrutina son un t entero que representa el tiempo, un string direccion que nos indica hacia donde va a girar el robot

y un string evento que nos ayuda a diferenciar si es un choque contra la pared o si el robot detectó un círculo.
La lógica es una secuencia de if, que dependiendo los parámetros que le pasemos, va a realizar una acción*/

sub GiroPotencia(int t, string direccion, string evento){
if(direccion=="D"&&evento=="choque"){
OnFwd(OUT_A,40);
OnRev(OUT_C,40);
Wait(t);
Off(OUT_AC);
Wait(100);
}
else if(direccion=="I"&&evento=="choque"){
OnFwd(OUT_C,40);
OnRev(OUT_A,40);
Wait(t);
Off(OUT_AC);
Wait(100);
}
else if(direccion=="D"&&evento=="circulo"){
int PotRandom=Random(100);
OnFwd(OUT_A,PotRandom);//potencia aleatoria entre 0 y 100
OnRev(OUT_C,PotRandom);
Wait(t);
Off(OUT_AC);
Wait(100);
}
else if(direccion=="I"&&evento=="circulo"){
int PotRandom=Random(100);//potencia aleatoria entre 0 y 100
OnFwd(OUT_A,PotRandom);
OnRev(OUT_C,PotRandom);
Wait(t);
Off(OUT_AC);
Wait(100);
}
}

task main(){
SetSensorLight(IN_3);
SetSensorSound(IN_2);
SetSensorTouch(IN_1);
int verificador, ModPot, contchoque, contpuntos, aleatorio;
verificador=1;// bandera para entrar y salir del ciclo while
ModPot=0;// modificador de potencia de motores
while(verificador){
NumOut(60,LCD_LINE3,ModPot);
if(ModPot<=-30||ModPot>=40)// si la potencia de los motores llega a 0 o a 100, el modificador se reinicia y vuelve la potencia a 60
ModPot=0;
OnFwd(OUT_AC,60+ModPot);//la potencia se modifica dependiendo si choca con pared o detecta círculo
if(SENSOR_2>=100)
verificador=0;// con un ruido fuerte sale del ciclo
if(SENSOR_1==1){//choque con pared
OnRev(OUT_AC,50);
Wait(500);
aleatorio=Random(100);//para hacer girar al robot a la derecha y a la izquierda
if((aleatorio%2)==0)
GiroPotencia(1400,"D","choque");
else
GiroPotencia(1400,"I","choque");
ModPot=ModPot-10;//disminuye potencia
contchoque++;//cuenta cuantas veces choca con la pared
}
if(Sensor(IN_3)<40){//detecta negro
contpuntos++;//cuenta cuantas veces detecta círculo
aleatorio=Random(100);//para hacer girar el robot a la derecha y a la izquierda
if((aleatorio%2)==0)
GiroPotencia(700,"D","circulo");
else
GiroPotencia(700,"I","circulo");
ModPot=ModPot+10;//aumenta potencia
}
}
NumOut(60,LCD_LINE1,contchoque);//muestra contador de choques
NumOut(60,LCD_LINE2,contpuntos);//muestra contador de circulos
Off(OUT_AC);
Wait(10000);
}


Como conlusión de este código, se puede apreciar que ya se ocupan contenidos de programación NXC en comparación con el semestre pasado de este ramo(programación de robots), como lo son
subrutinas y paso de parámetros, además de el uso de Play tone(sonidos). 

Video de la actividad 

 

Reflexión
Esta primera actividad en comparación con actividades del ramo pasado(programación de robots) fue muy complicada, ya que ahora trabajamos con contenidos recién aprendidos y en tan solo una semana de trabajo, pero nos sirvió para acostumbrarnos y tener experiencia para las siguientes actividades, y la primera nunca es la más dificil, pero teniamos las herramientas para manejarlo.


Te invito a que compartas comentarios y dudas acerca de esta actividad, gracias...

No hay comentarios:

Publicar un comentario