"Torreta Mortal"

Autor: Daniela Muñoz Muñoz
Competencia: Aprendizaje Autónomo (Nivel 2)
Palabras Clave: Programación,NXC, robótica, 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 informatica, en mi proyecto llamado "Torreta Mortal" realizado en el programa de lenguaje NXC, para el kit de robots de Lego NXT.
Para desarrollar el laboratorio teniamos que tener en mente que:
-Nuestra torreta atacara al tener a un enemigo a menos de 1 metro.

Solución
La solución al problema es crear el modelo físico,  pseudocódigo que nos facilitara el desarrollo del código y el código como solución final; también un vídeo que nos muestre como actúa el robot frente al enemigo.

Diseño:

En las siguientes fotografías aclararemos cada parte que compone el robot.


La forma física del robot, está constituida por una base, la cual afirma nuestra Torreta, por sensores, motores, ladrillo NXT, ejes de rotación, entre otras; algunas de las mencionadas serán definidas con más detalle a continuación.


-Los sensores: en nuestro proyecto usaremos los siguientes sensores:

-Sensor de Tacto:
 el sensor de Tacto está ubicado en la parte izquierda del ladrillo NXT, al apretar el sensor de tacto, éste reinicia los disparos.

-Sensor de UltraSonido:
 el sensor de Ultrasonido está ubicado en dirección frental, por lo que su rol principal es para que el robot mida la distancia que hay desde él hasta el oponente, y luego pueda atacar.

-Sensor de Sonido: el sensor de Sonido está ubicado en la parte derecha del ladrillo NXT, con el cual al escuchar un ruido o música, el robot se moverá más rápido y al encontrar el oponente atacara.


-Motor base: el motor base sirve para mover una rueda que llega a la base de nuestra torreta.
En la parte superior tenemos 2 motores, los cuales cumplen con la función de:
-Primer Motor: el primer motor es el que dispara al encontrar al objetivo.
-Segundo Motor: el segundo motor tiene como función buscar el ángulo del objetivo


Esta fotografía muestra a nuestra Torreta Mortal en todos sus ángulos.




Pseudocodigo:

sub TraspasaArchivo()
{Guardar Archivo}
sub disparoA ()
{Avanzar(motor A, 100);
esperar(0.6 seg);
Apagar(motor A);}
sub disparoB ()
{Retroceder(motor A, 100);
esperar(0.6 seg);
Apagar(motor A);}
sub eje()
{Girar 270º derecha;
Girar 270º Isquierda;
}
Tarea mover_eje()
{Mientras (Verdad)
{
eje();
}
Tarea chequear_objetivo_sensores()
{Mientras (Verdad){
Si (Sensor Ultrasonido>= Distancia Objetivo && Sensor Ultrasonido<= Distancia Objetivo && contador==0)
{
Apagar(MOTOR B);
Distancia Objetivos[j] =Sensor Ultrasonido;
j++;
Apagar(MOTOR B);
Retroceder(MOTOR C, 100);
Esperar;
Apagar(MOTOR B);
disparoA();
Esperar(1 seg);
Apagar(MOTOR B);
contador++;
Avanzar(MOTOR C, 70);
Esperar(0.2 seg);
}
Si (Sensor Ultrasonido >= Distancia Objetivo/2 && Sensor Ultrasonido <= Distancia Objetivo && contador==1)
{
Apagar(MOTOR B);
Distancia Objetivos[j] =Sensor Ultrasonido;
j++;
Apagar(MOTOR B);
Retroceder(MOTOR C, 100);
Apagar(MOTOR B);
Avanzar(MOTOR C, 1);
Esperar(10);
Apagar(MOTOR B);
disparoB();
Esperar(1000);
Apagar(MOTOR B);
contador++;
Avanzar(MOTOR C, 70);
Esperar(200);
}
Si (Sensor Ultrasonido <= Distancia Objetivo/2 && Sensor Ultrasonido <= Distancia Objetivo && contador==0)
{
Apagar(MOTOR B);
Distancia Objetivos[j] =Sensor Ultrasonido;
j++;
Apagar(MOTOR B);
Retroceder(MOTOR C, 100);
Apagar(MOTOR C);
Apagar(MOTOR B);
disparoA();
Esperar(1000);
Apagar(MOTOR B);
contador++;
Avanzar(MOTOR C, 50);
Esperar(0.2 seg);
}
Si (Sensor Ultrasonido <= Distancia Objetivo/2 && Sensor Ultrasonido <= Distancia Objetivo && contador==1)
{
Apagar(MOTOR B);
Distancia Objetivos[j] =Sensor Ultrasonido;
j++;
Apagar(MOTOR B);
Retroceder(MOTOR C, 100);
Apagar(MOTOR C);
Apagar(MOTOR B);
disparoB();
Esperar(1 seg);
Apagar(MOTOR B);
contador++;
Avanzar(MOTOR C, 50);
Esperar(0.2 seg);
}
Si(SENSOR SONIDO>= GRITO)
{
VELOCIDAD GIRO=80;
TIEMPO GIRO=1 seg;
}
Si(SENSOR SONIDO<= GRITO)
{
VELOCIDAD GIRO=50;
TIEMPO GIRO=2 seg;
}
Mientras(contador==2)
{
Apagar(MOTOR B);
Tocar Musica;
Esperar(200);
Apagar(MOTOR B);
TraspasaArchivo();
Parar todas las Tareas();
Si(SENSOR TACTO==1)
{contador=0;}}}
}
Tarea texto()
{Mientras(Verdad)
{Imprimir "Disparos =";
Imprimir j; }
}
Tarea main()
{
Activar Sensor Tacto;
Activar Sensor Sonido;
Activar Sensor Ultrasonido;
Ejecutar (chequear_objetivo_sensores, mover_eje,texto);
}






Codigo:

Codigo NXC:


#define GRITO 85
int VELOCIDADGIRO=60;
int AnguloARRIBA=220;
int TIEMPOGIRO=1000;
int AnguloABAJO=90;
int Distancia=200;
int Distancias[2];
int contador=0;
int Fsize=512;
int numero=0;
int h=0;
int j=0;


string numerocadena;
string cadenita1;
string cadenita2;
string cadenita3;
string cadenita;
string cadenit;
string cadena;

byte punteroArchivo;
byte bytesEscritos;

mutex moverMutex;


sub TraspasaArchivo()
{CreateFile("Distancias.txt", Fsize, punteroArchivo);
 WriteLnString(punteroArchivo,"REPORTE DISPARO", bytesEscritos);
 WriteLnString(punteroArchivo,"---------------", bytesEscritos);
for(h=0; h < j; h++)
{numero++;
numerocadena  = NumToStr(numero);
cadenita="Disparo ";
cadenita1=NumToStr(numero);
cadenit=" ==>  ";
cadenita2=NumToStr(Distancias[h]);
cadenita3=" cm";
cadena = cadenita+cadenita1+cadenit+cadenita2+cadenita3;
WriteLnString(punteroArchivo,  cadena, bytesEscritos);
}CloseFile(punteroArchivo);}

sub disparoA ()
{OnFwd(OUT_A, 100);
Wait(600);
Off(OUT_A);}

sub disparoB ()
{OnRev(OUT_A, 100);
Wait(590);
Off(OUT_A);}

sub eje()
{OnRev(OUT_B, VELOCIDADGIRO);
Wait(TIEMPOGIRO);
Off(OUT_B);
OnFwd(OUT_B, VELOCIDADGIRO);
Wait(TIEMPOGIRO);
Off(OUT_B);}

task mover_eje()
{while (true)
{Acquire(moverMutex);
eje();
Release(moverMutex);}}

task chequear_objetivo_sensores()
{while (true){

if (SensorUS(IN_4) >= Distancia/2 && SensorUS(IN_4) <= Distancia && contador==0)
{
Off(OUT_B);
Distancias[j] =SensorUS(IN_4);
j++;
Off(OUT_B);
OnRev(OUT_C, 100);
Wait(AnguloARRIBA);
Off(OUT_B);
OnFwd(OUT_C, 1);
Wait(10);
Off(OUT_B);
disparoA();
Wait(1000);
Off(OUT_B);
contador++;
OnFwd(OUT_C, 70);
Wait(200);
}

if (SensorUS(IN_4) >= Distancia/2 && SensorUS(IN_4) <= Distancia && contador==1)
{
Off(OUT_B);
Distancias[j] =SensorUS(IN_4);
j++;
Off(OUT_B);
OnRev(OUT_C, 100);
Wait(AnguloARRIBA);
Off(OUT_B);
OnFwd(OUT_C, 1);
Wait(10);
Off(OUT_B);
disparoB();
Wait(1000);
Off(OUT_B);
contador++;
OnFwd(OUT_C, 70);
Wait(200);
}

if (SensorUS(IN_4) <= Distancia/2 && SensorUS(IN_4) <= Distancia && contador==0)
{
Off(OUT_B);
Distancias[j] =SensorUS(IN_4);
j++;
Off(OUT_B);
OnRev(OUT_C, 100);
Wait(AnguloABAJO);
Off(OUT_C);
Off(OUT_B);
disparoA();
Wait(1000);
Off(OUT_B);
contador++;
OnFwd(OUT_C, 50);
Wait(200);
}

if (SensorUS(IN_4) <= Distancia/2 && SensorUS(IN_4) <= Distancia && contador==1)
{
Off(OUT_B);
Distancias[j] =SensorUS(IN_4);
j++;
Off(OUT_B);
OnRev(OUT_C, 100);
Wait(AnguloABAJO);
Off(OUT_C);
Off(OUT_B);
disparoB();
Wait(1000);
Off(OUT_B);
contador++;
OnFwd(OUT_C, 50);
Wait(200);
}

if(SENSOR_2>= GRITO)
{
VELOCIDADGIRO=80;
TIEMPOGIRO=1000;
}

if(SENSOR_2<= GRITO)
{
VELOCIDADGIRO=50;
TIEMPOGIRO=2000;
}

while(contador==2)
{
Off(OUT_B);
PlayTone(2000,2000);
Wait(200);
Off(OUT_B);
TraspasaArchivo();
StopAllTasks();

if(SENSOR_1==1)
{
contador=0;
}//if sensor}//cierre while contador 2
}//while CONTADOR
}//while true sensores


}// task chequear

task texto()
{while(true)
{TextOut(10,60,"Disparos =");
NumOut(80,60, j); }
}

task main()
{
SetSensorTouch(IN_1);
SetSensorSound(IN_2);
SetSensorLowspeed(IN_4);
Precedes(chequear_objetivo_sensores, mover_eje,texto);


}


Reflexión:
Este laboratorio en especial, tubo la diferencia del resto, que nosotros creamos nuestro proyecto, su funcionamiento, lo que haría, el diseño físico,entre otras cosas.
Ademas lo que fue el desarrollo en si del código, lo usamos con lo aprendido de todo el año, así que fue aun mas provechoso por el hecho de utilizar y ver que elementos nos convenía mas utilizar.