jueves, 22 de octubre de 2015

Programacion Lego

Autor: Jose Medina.
Competencia: Trabajo en equipo.
Asignatura: Programación de Robot.

Descripción de la Actividad

La actividad tiene como objetivo el repasar conceptos e incorporar el uso de sub tareas con paso de parámetros junto con el uso de nuevas instrucciones del lenguaje NXC para mejorar la calidad del código fuente y del recorrido del robot. 

El robot deberá desplazarse por una pista de obstáculos rectangular con una superficie blanca con puntos negros, donde al chocar con una pared debe de retroceder, realizar un giro de 180° a la izquierda o derecha, disminuir su potencia en 10, contar el choque y seguir su recorrido. Al detectar un punto negro este será contado, se realizara un  giro en un ángulo aleatorio menor a 180° a la izquierda o derecha, aumentar su potencia en 10 y  seguirá su recorrido, en caso de detectar un ruido sobre 80 DB el robot se detendrá y mostrara por un pantalla el detalle del numero de choques y puntos negros.   


Cargos: 

*Jefe de grupo (Jorge Arias): Esta persona fue el encargado de dirigir, solucionar problemas y dar las indicaciones pertinentes a los todos los integrantes del equipo, esto con el fin de guiar al equipo hacia un trabajo óptimo y más ordenado junto con ser participe en cada una de las actividades desarrolladas por cada integrante. 

*Secretario (José Medina): Encargado de tomar los apuntes correspondientes de la activad con el fin de desarrollar un informe detallado de todo lo realizado en los “laboratorios de robótica”. 

*Productor Multimedia (Ignacio León): Responsable de grabar y editar el material audio visual. Gracias a lo que fue esta recolección de material audio visual, se pudo encontrar diversos errores que se cometían con el robot los cuales posteriormente fueron reparados, además de cumplir con la función de testificar lo realizado en clases y la aplicación del código NXC.


Solución: 


En el presente trabajo, la  estrategia adoptada por el grupo fue la de implementar los contenidos aprendidos durante las clases de cátedra de proyecto robótica para poder lograr que nuestro robot y código funcionasen correctamente implementando el uso de multi-tareas donde las tareas creadas para la aplicación corren en paralelo para poder ejecutarse simultáneamente las cuales funcionaran de esta manera al ser implementadas en la tarea principal. Pese a que se utilizan varias tareas que permiten que el robot por ejemplo detecte choques y puntos negros mientras avanza se necesita del mutex para poder lograr que el robot realiza los movimientos de motores pertinentes mientras este en funcionamiento y no se ejecuten dos órdenes de movimiento de motores a la vez.


Pese a que el robot realiza su recorrido con multi tareas era necesario que el robot recolectara datos durante su trayectoria y los almacenar y los mostrara en pantalla sin mencionar que con estos datos se calculaba el puntaje por lo tanto se utilizo un arreglo   para poder almacenar cada dato obtenido durante el recorrido, es decir, el Array maneja la cantidad de puntos negros encontrados.
 Pseudocódigo 
Declarar variables;
Task Sound(){
Crear Musica;
}
Task Anotacion(){
Crear musica;
}
Task Circulo(){
Si(sensor detecta negro){
Iniciar tarea anotación;
Incrementar potencia en 10;
Calcular diferencia de tiempo entre cada punto negro;
Si (diferencia de tiempo >10 segundos){
Puntaje =0;
}else{
Mostrar puntaje de la ecuación;
Guardar puntaje en array;
}
Retroceder;
Girar por tiempo aleatorio;
Volver timer a 0;
For(i<8){
Limpiar pantalla;
Mostrar puntaje;
If(i==8){
Limpiar pantalla;
I==0;
}
}
Subir un peldaño en la pantalla;
}
Task aplauso(){
If(detecta sonido){
Retroceder;
Girar;
}
}
Task parada(){
If(choca){
Apaga todo;
}
}
Task main(){
Dar prioridad tareas;
Setear sensores;
Avanzar;
}

Codigo NXC

#define UMBRAL 40
#define MIC 80
int ArrayPunt[];
int Puntaje=0, potencia=20, i=0,p=0, giro, Puntos=0;
int TiempoAnt, TiempoAct, DiferenciaTiemp;
mutex paso;    

//tarea sonido durante el recorrido
task Sound(){
while(true){
Acquire(paso);//adquiere el mutex
PlayTone(587,3000); Wait(50);
PlayTone(392,3000); Wait(50);
PlayTone(440,3000); Wait(50);
PlayTone(392,3000); Wait(50);
PlayTone(415,3000); Wait(50);
PlayTone(392,3000); Wait(50);
PlayTone(440,3000); Wait(50);
Release(paso);//deja el mutex
}
}
//tarea anotacion musica de deteccion de puntaje
task anotacion(){
while(true){
Acquire(paso);//adquiere el mutex
PlayTone(500,160);
Wait(100) ;
PlayTone(299,50);
Wait(100);
PlayTone(10000,500);
Wait(100);
Release(paso);//deja el mutex
}
}
//tarea deteccion de puntos negros
task circulo(){
while(i<10){
if(SENSOR_1<UMBRAL){//en caso de detectar un punto negro
potencia = potencia+10; //aumenta la potencia
StartTask( anotacion);
//calcular puntaje
TiempoAct = CurrentTick();
DiferenciaTiemp = (TiempoAct – TiempoAnt) / 1000;
TiempoAnt= TiempoAct;
if(DiferenciaTiemp < 10){
Puntaje = -5* DiferenciaTiemp+50;
ArrayPunt[p]= Puntaje;
p++ ;
Puntos= Puntos+Puntaje;
}
if(DiferenciaTiemp>10){
Puntaje =0;
}
giro = Random(500)+1500;
Acquire(paso);//adquiere el mutex
//retroceder y crear giro random
OnRev(OUT_AC,potencia);
Wait(500);
OnRev(OUT_C,potencia);
OnFwd(OUT_A,potencia);
Wait(giro);
OnFwd(OUT_AC,potencia);
Release(paso);//deja el mutex
StartTask(Sound);//inicia nuevamente la tarea sound
DiferenciaTiemp=0; //se cambia el valor a 0
NumOut(10,i,Puntaje);
if(i==8){
ClearScreen(); // se limpia la pantalla y se inicia nuevamente la cuenta
i=0;
}
i++ ;
}
}
}
//tarea aplauso donde se evaden obstaculos mediantew una seña auditiva
task Aplauso(){
while(true){
if(SENSOR_2>MIC){
Acquire(paso);//adquiere mutex
//se retrocede y realiza un giro
OnRev(OUT_AC,potencia);
Wait(1000);
OnRev(OUT_A,potencia);
OnFwd(OUT_C,potencia);
giro= Random(500)+1500;
Wait(giro) ;
OnFwd(OUT_AC,potencia);
Release(paso);//deja el mutex
}
}
}

//tarea donde se detendrán motores al activarse el sensor touch y se mostraran los resultados
task parada(){
while(true){
if( SENSOR_3==1){
//si se activa el sensor touch
Off(OUT_AC); // se apaga los motes a y c
NumOut(10,7,Puntos);
TextOut(10,8,”Puntaje ” );
StopSound();
for(int x=0;x<30;x++){
TextOut(10,6,”Array” );
NumOut(x+3,5, ArrayPunt[p]);
}
}
}

//tarea principal con la inicialización de motores
task main() {
Precedes(circulo,Aplauso,parada,anotacion);  // dar inicio a las tareas
SetSensorLight(IN_1); // inicializacion sensores
SetSensorSound(IN_2);
SetSensorTouch(IN_3);
OnFwd(OUT_AC,potencia);
StartTask(Sound);   // inicio tarea sonido
TiempoAnt = CurrentTick();
if( SENSOR_3==1){//apagar motores y detener tareas
Off(OUT_AC);
Wait(30000);//esperar durante 30 segundos
StopSound();//detener tarea sonido
StopAllTasks();// detener todas las tareas
}
}


Vídeo Actividad Finalizada




Reflexión 

La actividad presentada demuestra como con trabajo en equipo podemos dar solución a la problemática planteada al inicio del blogg, en donde al  asignar cargos y delegar funciones se logro como resultado final que el robot NXC realizara el recorrido de forma exitosa. Cada participante del grupo aporto con una cuota de trabajo para el diseño del robot, producción multimedia , entre otras cosas y un trabajo conjunto para el diseño del código final.



No hay comentarios:

Publicar un comentario