lunes, 14 de noviembre de 2011

Robot Laberinto

Robot Laberinto


Alumno: Juan Francisco Mendoza Martínez
Competencia: Gestion en TI
Palabras Claves: Laberinto, robot


Descripción de la actividad:

Diseñaremos un robot que sea capaz de descifrar laberintos de forma aleatoria. Esto consiste en que el robot deberá ir avanzo a través de la pista. Poseerá 3 motores, de los cuales 2 serán designados para el movimiento de las ruedas y el otro para el movimiento del sensor de ultrasonido (el cual debe ser de 180°). Se hará que nuestro robot al detectar una pared este active el motor donde se encuentre el sensor de ultrasonido, donde haciendo el movimiento de 180° doble hacia el lado que no se encuentra la pared y así sucesivamente hasta poder encontrar la salida del laberinto que se encuentra con una mancha negra que será reconocida por el sensor de luz para que el robot se pueda detener. En la pantalla del robot se iban a mostrar la distancia de las paredes del centro, izquierda y derecha desde el sensor de ultrasonido.


Solución:

Diseñar el codigo con el más minimo detalle, en donde pudiera cumplir con lo prosupuestado, desde detectando las paredesm, hasta poder llegar a detenerse al final del laberinto con el sensor de luz.

Codigo fuente:

mutex sem;
int dist[3];
int i=0;
int t=512;
byte arch;
byte byt;
string tr="Inicio: ";
string fin="Fin: ";
string str;
string str2;
string wak;
string wak2;
string scn;
long time[2];
long ini;
long fn;
sub archivo()
{
CreateFile("ar6.txt", t, arch);
WriteLnString(arch, "tiempo del laberinto:", byt);
WriteLnString(arch, "--------------", byt);
str = NumToStr(ini);
str2= NumToStr(fn);
wak = tr+str;
wak2=fin+str2;
WriteLnString(arch,wak2, byt);
CloseFile(arch);
}
sub giro(){
if(dist[0]<27 && dist[1]<27 && dist[2]>27){
OnFwd(OUT_A,30);
OnRev(OUT_B,30);
Wait(1330);
}
if(dist[0]<27 && dist[1]<27 && dist[2]<27){
OnFwd(OUT_A,30);
OnRev(OUT_B,30);
Wait(1520);
}
if(dist[0]>27 && dist[1]<27 && dist[2]<27){
OnFwd(OUT_B,30);
OnRev(OUT_A,30);
Wait(1590);
}
if(dist[0]>27 && dist[1]<27 && dist[2]>27){
OnFwd(OUT_B,30);
OnRev(OUT_A,30);
Wait(1590);
}
}
//task avanzar(){
// while(true){
// Acquire(sem);
// OnFwd(OUT_A,48);
// OnFwd(OUT_B,50);
// Release(sem);
// }
// }
task parar(){
while(true){
if(Sensor(IN_2)<50){
fn=CurrentTick()/100000;
time[1]=((time[0]-fn)/1000);
Off(OUT_AB);
int pa=50;
bool eof = false;
archivo();
ClearScreen();
OpenFileRead("ar6.txt", t, arch);
while (eof == false)
{
if(ReadLnString(arch,scn) != NO_ERR) eof = true;
TextOut(LCD_LINE8,pa,scn);
pa= pa-10;
Wait(500);
}
Wait(5000);
CloseFile(arch);
DeleteFile("ar6.txt");
Wait(1000);
StopAllTasks();
}
}
}
task revisar(){
ini=CurrentTick();
time[0]=ini;
while(true){
//Wait(2700);
OnFwdReg(OUT_AB,40,OUT_REGMODE_SYNC);
until(SensorUS(IN_1)<10);
Acquire(sem);
Off(OUT_AB);
Wait(1000);
OnFwd(OUT_C,70);
Wait(200);
Off(OUT_C);
Wait(200);
dist[i]=SensorUS(IN_1);
i++;
OnRev(OUT_C,70);
Wait(180);
Off(OUT_C);
Wait(200);
dist[i]=SensorUS(IN_1);
i++;
OnRev(OUT_C,70);
Wait(230);
Off(OUT_C);
Wait(200);
dist[i]=SensorUS(IN_1);
OnFwd(OUT_C,70);
Wait(210);
Off(OUT_C);
i=0;
if(dist[2]>1){
PlayTone(123,323);
NumOut(50,5,dist[0]);
NumOut(50,10,dist[1]);
NumOut(50,20,dist[2]);
Wait(2500);
ClearScreen();
}
giro();
Release(sem);
}
}
task main(){
SetSensorLowspeed(IN_1);
SetSensorLight(IN_2);
Precedes(revisar,parar);
}


Pseudocódigo:

Nombre mutex;
int dist 3
int i=0
int t=512
byte archivo
byte byt 
string tr="Inicio: ";

string fin="Fin: ";

string str;

string str2;

string wak;

string wak2;

string scn;

long time[2];

long ini;

long fn;

subrutina archivo
{
crear archivo;
escribe en el archivo 
escribe en el archivo
transforma a String el INT
crea una cadena para mostrar los puntajes ordanadamente
escribe archivo ;
cierre archivo arch;
}

subrutina giro;
si (distancia [0]<27 y dist[1]
Avanzar A potencia 30
retroceder b potencia 30
tiempo de 1330 }

si (dist[0]<27 && dist[1]<27 && dist[2]<27)
avanzar A potencia 30
retroceder B potencia 30
tiempo de 1520

}

si(dist[0]>27 && dist[1]<27 && dist[2]<27)
avanzar B potencia 30
retroceder A potencia 30
tiempo de 1590
}

si(dist[0]>27 && dist[1]<27 && dist[2]>27)
avanzar B potencia 30
retroceder A potencia 30
tiempo 1590 

task parar(){// tarea parar

while(true){// mientras sea (verdadero)

if(Sensor(IN_2)<50){// si (Sensor(IN_2)<50)

fn=CurrentTick()/100000;

time[1]=((time[0]-fn)/1000);

Off(OUT_AB);

int pa=50;

bool eof = false;

archivo();

ClearScreen();

OpenFileRead("ar6.txt", t, arch);

while (eof == false)

{

if(ReadLnString(arch,scn) != NO_ERR) eof = true;

TextOut(LCD_LINE8,pa,scn);

pa= pa-10;

Wait(500);

}

Wait(5000);

CloseFile(arch);

DeleteFile("ar6.txt");

Wait(1000);

StopAllTasks();

}


}

}

task revisar(){

ini=CurrentTick();

time[0]=ini;

while(true){

//Wait(2700);

OnFwdReg(OUT_AB,40,OUT_REGMODE_SYNC);

until(SensorUS(IN_1)<10);

Acquire(sem);

Off(OUT_AB);

Wait(1000);

OnFwd(OUT_C,70);

Wait(200);

Off(OUT_C);

Wait(200);

dist[i]=SensorUS(IN_1);

i++;

OnRev(OUT_C,70);

Wait(180);

Off(OUT_C);

Wait(200);

dist[i]=SensorUS(IN_1);

i++;

OnRev(OUT_C,70);

Wait(230);

Off(OUT_C);

Wait(200);

dist[i]=SensorUS(IN_1);

OnFwd(OUT_C,70);

Wait(210);

Off(OUT_C);

i=0;

if(dist[2]>1){

PlayTone(123,323);

NumOut(50,5,dist[0]);

NumOut(50,10,dist[1]);

NumOut(50,20,dist[2]);

Wait(2500);

ClearScreen();

}

giro();

Release(sem);
}
}
task main(){

SetSensorLowspeed(IN_1);

SetSensorLight(IN_2);

precedes(revisar,parar);
} 


Video del robot: 



Reflexión:

Pese a que al construir el robot y diseñar el codigo pertinente, tuvimos ciertos problemas con la rueda timon, dado que muchas veces hacia que nuestro robot tomará un rumbo con cierta inclinación (minima) hacia la derecha a la izquierda, por lo que para la presentación EXPLORA, le explicamos en que consistia este robot y lo que pretendiamos llegar, y acudiendo a ayuda de nosotros mismos hacia el robot con nuestra manos para que pudiera avanzar sin desviarse. 

No hay comentarios:

Publicar un comentario