martes, 11 de octubre de 2011

Robot pitFinder

Robot pitFinder




Alumno: Juan Francisco Mendoza Martínez
Competencia: Desarrollo de Software
Palabras claves: Robot, pitFinder, sensor, altura.




Descripción de la actividad:


  - El robot ha de recorrer una mesa, en donde deberá detectar a través de un sensor de ultrasonido que detectara la altura que hay desde ese punto. Deberemos usar nuestro Robot sobre la pista que se encuentra en laboratorio, para este caso sin paredes. Utilizaremos nuevos comando llamado ARRAY, WriteLnString, ReadLnString, Mutex y los archivos tipo bytes.




Solución:


    -  Se pudo lograr un buen trabajo en equipo, además lograda con éxito las distintas formas que se implementaron para desarrollar lo solicitado y lo más importante que el robot cumpliera.




Pseudocódigo:


DEFINIMOS ENTERO J=0, i=0, S=0, N=0, t=512, altura [4]
DEFINIMOS PALABRAS pr=”PRECIPICIO”, ln=”=>”,str,scn,ns
DEFINIMOS VARIABLE EXCLUSION MUTUAL mut
DEFINIMOS PUNTEROS arch,byt
DEFINIMOS prox 20
DEFINIMOS SUBRUTINA archivo ()
 {
 CREAMOS ARCHIVO (“datos1.txt”, t, arch)
 ESCRIBIMOS EN EL ARCHIVO (arch,”datos pitfinder”,byt)
 ESCRIBIMOS EN EL ARCHIVO (arch,”---------------”,byt)
 PARA (CON J=0; HASTA J< LONGITUD de altura; llendo J mas 1)
 {
 N aumentando en 1
  ns= NUMERO COMVERTIDO A PALABRAno
  str = NUMERO COMVERTIDO A PALABRA (altura[j])
 str = pr + ns + ln + str
 ESCRIBIMOS EN EL ARCHIVO (arch,str,byt)
 }
 CERRAR ARCHIVO (arch)
 }
DEFINIMOS SUBRUTINA alturag ()
{
 Altura[s]= DATOS RECOGIDOS DEL SENSOR 2
 MOSTRAMOS NUMEROS EN Pantalla (0,10*s,altura[s])
 S aumentando en 1
}
DEFINIMOS TAREA Avanzar ()
 {
 CICLO HASTA (i<4)
 {
 AVANZAMOS (MOTOR C, poder: 50)
 AVANZAMOS (MOTOR A, poder: 52)
  SI (EL SENSOR 2 > prox)
  {
 I AUMENTANDO EN 1
 EMPIEZA (mut)
 AVANZAMOS (MOTOR C, PODER: 50)
 AVANZAMOS (MOTOR A, PODER: 52)
 POR (300 MILISEGUNDOS)
 APAGAMOS MOTORES (MOTOR A Y C)
 POR (1 SEG)
 INVOCAMOS A SUBRUTINA alturag ()
 RETROCEDEMOS (MOTOR C, PODER: 50)
 RETROCEDEMOS (MOTOR A, PODER: 52)
 POR (1SEG)
 AVANZAMOS (MOTOR C, PODER: 50)
 RETROCEDEMOS (MOTOR A, PODER: 52)
 POR (TIEMPO ALEATORIO ENTRE 400 Y 1500 MILISEG)
 SOLTAR (mut);
  }
 }
 DEFINIMOS ENTERO pa=50
 DEFINIMOS VARIABLE BOOLEANA eof = falso
 APAGAMOS MOTORES (MOTOR A Y C)
 INVOCAMOS A LA SUBRUTINA archivo ()
 LIMPIAMOS PANTALLA
 ABRIMOS ARCHIVO PARA LEER("datos1.txt", t, arch)
 CICLO HASTA (eof es igual a falso) {  si (la línea del achivo(arch,scn) es distinto NO_ERR) eof = verdadero
 MOSTRAR NUMEROS EN PANTALLA (PANTALLA_INEA8, pa, scn)
 pa= pa-10
 POR (500 MILISEG)}
 POR (5 SEG)
 CIERRO ARCHIVO (arch)
 BORRO ARCHIVO ("datos1.txt")
}
TAREA PRINCIPAL ()
{
 EJECUTAR TODO A LA VEZ (Avanzar)
 SETEAMOS SENSOR DE PROXIMIDAD
}


Código de fuente en NXC:

int j=0;
int i=0;
string pr="Precipicio";
string ln="==>";
int s=0;
int n=0;
int altura[4];
byte arch;
string str;
mutex mut;
string scn;
byte byt;
int t=512;
string ns;




#define prox 20


sub archivo()
{
CreateFile("datos1.txt", t, arch);
WriteLnString(arch, "DATOS PITFINDER", byt);
WriteLnString(arch, "--------------", byt);
for(j=0; j < ArrayLen(altura); j++)
{
n++;
ns= NumToStrno;
str = NumToStr(altura[j]);
str = pr + ns + ln + str;
WriteLnString(arch, str, byt);
}
CloseFile(arch);
}


sub alturag()
{
altura[s]=SensorUS(IN_2);
NumOut(0,10*s,altura[s]);
s++;
}


task Avanzar()
{
while (i<4)
{
OnFwd(OUT_C,50);
OnFwd(OUT_A,52);


if (SensorUS(IN_2)>prox)
{
i++;
Acquire(mut);
OnFwd(OUT_C,50);
OnFwd(OUT_A,52);
Wait(300);
Off(OUT_AC);
Wait(1000);
alturag();
OnRev(OUT_C,50);
OnRev(OUT_A,52);
Wait(1000);
OnFwd(OUT_C,50);
OnRev(OUT_A,52);
Wait(Random(1500)+400);
Release(mut);
}
}
int pa=50;
bool eof = false;
Off(OUT_AC);
archivo();
ClearScreen();
OpenFileRead("datos1.txt", t, arch);
while (eof == false){ // read the text file till the end
if(ReadLnString(arch,scn) != NO_ERR) eof = true;
TextOut(LCD_LINE8,pa,scn);
pa= pa-10;
Wait(500);}
Wait(5000);
CloseFile(arch);
DeleteFile("datos1.txt");


}




task main()
{
Precedes(Avanzar);
SetSensorLowspeed(IN_2);
}



Vídeo del Robot:






Reflexión:

  -  Actividad complicada al principio, pero no que un buen equipo no pueda desarrollar. Se logró llegar a buen puerto y queda demostrado que uno cada día aprende a nuevas cosas (como nuevos comando etc.).

Robot Dribbler

Robot Dribbler




Alumno: Juan Francisco Mendoza Martínez.
Competencia: Desarrollo de software.
Palabras Claves: Robot, Dribbler, Puntos, Luz, Touch.


Descripción:


   -  Se construyo un robot para que esté funcionara con dos sensores, que serian el de Touch y el sensor de Luz. El sensor de Luz deberá estar ubicado hacia la pista de modo que cuando detecte un circulo negro, esté pueda aumentar su velocidad y puntos (velocidad máxima es igual a 100)... el proceso se repetirá las veces que sea HASTA que el sensor de Touch sea presionado, es aquí donde el juego termina.


Solución:


    -  Hemos alcanzado la solución para llevar a cabo la actividad del Robot Dribbler. Todo esto con un buen y desarrollado trabajo en equipo, no obstante las dificultades que se nos presentaron las pudimos sacar adelante, con ayuda de los profesores en el laboratorio y horas autónomas de estudio. Se aprendió a usar las nuevas líneas de comando que fueron enseñadas en clases como Acquire, Array, Release(Mutex), ExitTo(task).


Pseudocódigo:



definimos enteros vel=20,rdm=0,puntajemostrado=0,i=0,puntaje[]
definimos variable mutual exclusion MUTEX
definimos enteros largos tiempoini,tiempo,tiempo2,tiempodif
Definimos TAREA MELODIA()
{
Ciclo infinito
{
Melodia para busqueda de puntos
}
}
DEFINIMOS TAREA AVANZAR ()
{
tiempoini= tiempo actual
Ciclo infinito
{
Inicializamos el turno MUTEX
tiempoini= tiempo actual
Avanzamos (vel, control de motores)
Liberamos a MUTEX
}
}
DEFINIMOS TAREA GIRAR ()
{
Ciclo infinito
{
SI (el sensor de sonido >90)
{
Inicializamos el turno MUTEX
Retrocedemos ambos motores (45, control de motores)
Por 0,4 seg
Liberamos a MUTEX
}
}
}
DEFINIMOS TAREA GIROPUNTOS ()
{
Ciclo infinito
{
SI (el sensor de luz <40)
{
Inicializamos el turno MUTEX
Apagamos los dos motores
Avanzamos ambos motores (45, control de motores)
Retrocedemos el motor b(45,control de motores)
Por 0,7 seg
Liberamos a MUTEX
}
}
}
DEFINIMOS TAREA PUNTOS ()
{
Ciclo infinito
{
SI (el sensor de luz <40)
{
tiempo= tiempo actual
tiempo2 =(tiempo-tiempoini)
Música de anotación
tiempodif=(tiempo2)/1000
SI(tiempodif<10)
{
puntajeSum=(-5*tiempodif)+50
puntaje[i]=puntajeSum
}
SI (tiempodif>10)
{
puntaje[i]=0
}
i aumentando en una unidad
vel=vel+10
POR 0,4 seg
}
}
}
DEFINIMOS TAREA CHOQUE()
{
CICLO INFINTO
{
SI(SENSOR DE TACTO ES ACTIVADO)
{
Inicializamos el turno MUTEX
Apagamos motores
Ciclo for(desde int i=0;hasta la longitud final de arreglo;con i aumentando en una unidad)
{
puntajemostrado=puntaje[i]+puntajemostrado
}
Mostramos en pantalla(50,50,puntajemostrado)
Por 1 segundo
Limpiar Pantalla
Parar todas las tareas
Liberamos el MUTEX
}
}
}
TAREA PRINCIPAL(){
Iniciamos el sensor de luz
Iniciamos el sensor de sonido
Iniciamos el sensor de tacto
INICIALIZAMOS TODAS LAS TAREAS(AVANZAR,GIRAR,PUNTOS,CHOQUE,MELODIA)
}



Código de fuente en NXC:

int vel=20;
mutex Mutex;
int rdm=0;
int puntaje[];
int puntajeSum;
long tiempo;
long tiempodif;
long tiempoini;
int i=0;
int puntajemostrado=0;
long tiempo2;



task melodia()
{
while(true)
{

PlayTone(262,240);
Wait(160);
PlayTone(262,240);
Wait(160);
PlayTone(294,240);
Wait(160);
PlayTone(294,240);
Wait(160);
PlayTone(330,240);
Wait(160);
PlayTone(330,240);
Wait(160);
PlayTone(294,240);
Wait(160);
PlayTone(294,240);
Wait(160);
PlayTone(262,240);
Wait(160);
}

}

task avanzar(){
tiempoini=CurrentTick();
while(true){
Acquire(Mutex);
OnFwdReg(OUT_AB,vel,OUT_REGMODE_SPEED);
Release(Mutex);
}
}

task girar(){
while(true){
if(Sensor(IN_2)>90){
Acquire(Mutex);
//rdm=Random(650)+100;
OnFwdReg(OUT_A,45,OUT_REGMODE_SPEED);
OnRevReg(OUT_B,45,OUT_REGMODE_SPEED);
Wait(400);
Release(Mutex);


}
}

}
task giropuntos(){
while(true){
if(Sensor(IN_3)<40){
Acquire(Mutex);
Off(OUT_AB);
OnFwdReg(OUT_AB,45,OUT_REGMODE_SPEED);
OnRevReg(OUT_B,45,OUT_REGMODE_SPEED);
Wait(750);
Release(Mutex);
}
}

}
task puntos(){
while(true)
{
if(Sensor(IN_3)<40)
{
tiempo=CurrentTick();
tiempo2=(tiempo-tiempoini);
PlayTone(800,800);
tiempodif=tiempo2/1000;
if(tiempodif < 10)
{

puntajeSum=(-5*tiempodif)+50;
puntaje[i]=puntajeSum;


}

if(tiempodif >10)
{

puntaje[i]=0;

}


i++;
vel=vel+10;
Wait(400);

} //fin del primer if


} //fin del while

} //fin de puntos

task choque(){
while(true){

if(Sensor(IN_1)==1)
{
Acquire(Mutex);
Off(OUT_AB);
for(int i=0;i<ArrayLen(puntaje);i++)
{

puntajemostrado=puntaje[i]+puntajemostrado;


}

NumOut(50,50,puntajemostrado);
Wait(5000);
ClearScreen();




StopAllTasks();
Release(Mutex);
}

}
}



task main(){
SetSensorLight(IN_3);
SetSensorSound(IN_2);
SetSensorTouch(IN_1);
Precedes(avanzar,girar,puntos,choque,melodia);



Vídeo de la actividad:




Reflexión:

  -  Con este trabajo de pudo llegar a buen puerto, cumplimos 100% con el objetivo y el trabajo en equipo fue espectacular. Por mi parte aprendí a usar nuevos comando y la manera de desarrollar estos trabajos cada vez se hacen más fácil.

Robot Turista

Robot Turista


Alumno: Juan Francisco Mendoza Martínez
Competencia: Desarrollo de software
Palabras claves: Robot, turista.




Descripción de la actividad:


  -   A través de un programa predefinido llamado Brick Commander, podremos configurar al robot que por medio de un código, cumpla las funcionas solicitadas en la actividad. El Robot deberá evadir una serie de obstáculos para realiza un tour en un parque de diversiones, y detenerse por dos segundos.




Solución:


  -  La solución al problema fue un mínima diferencia de potencia en cada rueda del robot (2) mientras hacia su recorrido en linea recta. En la primera y tercera curva fue programado para que la rueda derecha fuese con mayor potencia, así realizar la curva de manera precisa, en tanto, en la segunda curva y primera estación se diseño en el código de fuente, que debiera retroceder y aumentar la potencia para continuar su camino en linea recta.




Pseudocodigo:



1) Avanza en línea recta durante 6 segundos aprox.
2) Se apagan los motores durante 2 segundos.
3) Se encienden los motores
4) Avanza durante 0,6 segundos
5) Retrocede
6) Avanza 1,5 segundos
7) Se apagan los motores durante 2 segundos
8) Se encienden los motores
9) Retrocede
10) Avanza durante 2,5 segundos
11) Realiza leve giro hacia la izquierda
12) Avanza durante 1,5 segundos
13) Realiza un leve giro hacia la derecha
14) Se apagan los motores durante 2 segundos
15) Se encienden los motores
16) Retrocede
17) Avanza durante 2.5 segundos
18) Se apagan los motores durante 0,8 segundos
19) Se encienden los motores
20) Retrocede
21) Avanza durante 0,7 segundos
22) Se apagan los motores.




Código de fuente en NXC:



task main ()
{  
      OnFwd (OUT_A,68);
      
OnFwd (OUT_C,67);
      
Wait (6400);             // Avanza 6,4 segundos
      
Off (OUT_AC);            // Se apagan motores
      
Wait (2000);                
//Llega Estación 1

      
OnFwd(OUT_A,68);   //Avanza
      
OnFwd(OUT_C,67);
     
 Wait(600); //
      
OnRev(OUT_A,50);  // Retrocede
      
Wait(450);    
      
OnFwd(OUT_A,68);
      
OnFwd(OUT_C,67); //Avanza
      
Wait(1500);      //Avanza 1,5 sgdos.
       
Off (OUT_AC);   // Se apagan motores  
//Llega estación 2

      
OnFwd(OUT_A,68);
     
 OnFwd(OUT_C,67);
      
Wait (2000);      //Espera dos segundos
      
OnRev(OUT_C,50);  //Retrocede
      
Off(OUT_AC);
      
Wait(2500);
      
OnRev(OUT_A,55);
      
Wait(900);
      
OnFwd(OUT_A,72);
      
OnFwd(OUT_C,70);
      
Wait(2500);

    
     OnFwd(OUT_A,60);      //Avanza
     
OnFwd(OUT_C,65);
    
 Wait(1500);
     
OnFwd(OUT_A,65);    //Gira levemente Izquierda
     
OnFwd(OUT_C,60);
    
 Wait(2000);
    
 OnFwd(OUT_A,60);   //Gira levemente Derecha     OnFwd(OUT_C,65);
     
Wait(1800);     OnFwd(OUT_A,72);
    
 OnFwd(OUT_C,65);
    
 Wait(56);
    
 Off(OUT_AC);
//Llega Estación 3





Reflexión:

  - A pesar de que el robot se tuvo problemas al principio con la potencia de las ruedas, hasta que al final se pudo encontrar la solución para que el robot realizara sin ningún problema lo encomendando por la actividad.