viernes, 16 de diciembre de 2011

Actividad: Paso de Parametros

Autor: Felipe Andres Lagos Morapasten
Competencia: Aprendizaje Autónomo (Nivel 1)
Palabras Clave: Proyecto de Robots, NXC, Robótica, Kit Lego.

Descripción de la Actividad:


Finalizando la competencia de aprendizaje autónomo, quiero compartirles la  actividad inicial del Curso de Proyecto Robot, esta actividad está enfocada en el uso de parámetros, además con el desarrollo de un código fuente en NXC.

La actividad consiste en que el robot debe desplazarse en una superficie (con paredes en su bordes) que en ella se encuentran puntos negros, el robot toma diferentes caminos durante la actividad, ejemplo de esto cuando choca con una pared, lo más fundamental de esto es disminuir su potencia de velocidad y retroceder más un giro lo que lo hace para retomar su rumbo, otro suceso diferente es cuando detectar un punto negro ya que debe aumentar su velocidad y girar aleatoriamente, menor a los 180° todo lo anteriormente nombrado lo realiza hasta escuchar una señal auditiva superior a los 80 decibeles ,  luego de esto genera un reporte sobre los puntos detectar y las paredes chocadas.


Solución

Para la solución de este problema se debe analizar la problemática presente para posterior realizar un pseudocódigo que facilita la creación del código fuente de la actividad.

Pseudocódigo:
Definir umbral Luz = 40
Definir umbral Sonido = 80
Potencia=80
Choques=0
Punto=0
Iniciar sensores de Luz, Tacto y sonido

Choque()

{ retroceder
   Girar 180º
   Potencia-10
   Choques++  }

Punto_negro()

{ girar con un grado random menor a 180º
   Potencia+10
   Punto++   }

Mostrar()

{Mostrar nº de choques y puntos}

Mientras(umbral sonido < 80)
  {avanzar con Potencia
   Si(choca)
     { llamar a Choque }

   Si(detecta punto)
     { llamar a Punto_negro}
   }

Llamar Mostrar

El código fuente correspondiente a la actividad:
 
#define UMBRAL_SONIDO 80  // Importante para marcar el final de la actividad.
#define UMBRAL_LUZ 40     // Usada para detectar un punto negro.
int potencia=80; // Rango inicial de potencia que con el desarrollo variará su valor.
int choques=0; // Variable usada para contar la cantidad que choques que se realizan en la actividad.
int punto=0;   // Al igual que el anterior sirve para contar los puntos negros durante la ejecución del programa.

sub GiroPotencia(int t, string direccion, string evento) // sub modo dedicado a los giros con parametros.
{
    if(evento=="choque" ) // Si el evento es igual a choque
      {  if(direccion == "d" )// Si la dirección es d, d= derecha.
          { OnRev(OUT_A,50); // Las dos instrucciones son para que realice un
           OnFwd(OUT_C,50); // giro de 180° a la derecha.
            Wait(900);}
            }          // Cierre del if del choque.
     
    if(evento=="punto") // Si la direccion es igual a punto.
       { if(direccion == "i") // Si la direccion es igual a i, i= izquierda.
            { OnRev(OUT_C,Random(50)); // Realiza un giro con valores random lo que hace que la dirección
              OnFwd(OUT_A,Random(50));// no se pueda determinar, aleatorio y menor que 180°
              Wait(900);  }
                         }   // Cierre if del punto

                         }// Cierre GiroPotencia
   
  sub choque()
  {
    OnRevReg(OUT_AC,potencia,OUT_REGMODE_SYNC); // Retroceso por medio segundo con motores sincronizados (igualados)
    Wait(1000);
    GiroPotencia(1000,"d","choque" ); // Le da los valores a los parámetros del sub modo GiroPotencia, 1 segundo,"direccion derecha",choque.
    potencia=potencia-10; // Esto modifica potencia restando 10 unidades por cada choque.
    choques++;      // Lo que realiza es sumar una unidad a la variable choque.
    if(potencia<30) // Si la potencia es menor que 30
    potencia=30;    // esta tomará un nuevo valor en este caso 30
    if(potencia>100) // Si la potencia es mayor que 100
    potencia=100;   // cambiará su valor a 100.
                     } // Cierre del sub modo choque
sub punto_negro()
{
  punto++;  // Suma una unidad a la variable punto.
  potencia=potencia+10; // La potencia cambia su valor, sumando 10 unidades al detectar un punto negro.
  GiroPotencia(1000,"i","punto" ); // Le da valores a los parámetros del sub modo GiroPotencia,1 segundo, "dirección izquierda”, punto.
  if(potencia<30)  // Si la potencia es menor que 30
  potencia=30;     // tomará un nuevo valor, siendo ahora 30.
  if(potencia>100)  // Si la potencia es mayor que 100 cambiará
  potencia=100;    // el valor de la potencia a 100.
}
sub mostrar()
{

 TextOut(0,40,"N Choques"); // Muestra en pantalla en palabras abreviadas Número de choques
 NumOut (85,40,choques); // Indica la cantidad ( numero) de la variable choques.
 TextOut(0,60,"N Puntos" ); // Muestra en pantalla en palabras abreviadas Número de puntos
 NumOut (80,60,punto);  // Indica la cantidad ( numero) de la variable punto.

}

task main()
{
 SetSensorLight(IN_3); // Encender Sensor de Luz en el puerto 3
 SetSensorSound(IN_2); // Encender Sensor de Sonido, puerto 2
 SetSensorTouch (IN_1); // Encender Sensor de Tacto, puerto 1


 while(Sensor(IN_2) < UMBRAL_SONIDO)// Mientras el sensor de Sonido sea menor al umbral_sonido(80 decibeles).
 {
  OnFwdReg(OUT_AC,potencia,OUT_REGMODE_SYNC);   // Avanzar con motores sincronizados(igualados).
  if(Sensor(IN_1) == 1) // Si el sensor de Tacto es igual a 1, sienta el choque.
  {choque();}   // Llamado al sub modo choque
 
  if(Sensor(IN_3) < UMBRAL_LUZ)// Si el sensor de luz es menor que el Umbral de luz(negro)
  {
   punto_negro(); // Llamado al sub modo punto_negro.
   }
  mostrar();
} // Cierre  while
   Float(OUT_AC);  // Usado para que al termina con la señal auditiva su frenado sea más suave.
}    // Cierre del Task

En este código podemos destacar el uso de los sensores de tacto y luz para las diferentes tareas que el robot debía cumplir, teniendo bastante importancia el uso de estos, además de subrutinas donde se le aplica el uso de parámetros.

El video de la actividad: 



Reflexión:

La principal dificultad de esta actividad fue determinar cuándo pasar un parámetro a las distintas subrutinas de las actividades ya que cada subrutinas está enfocado a sucesos totalmente diferentes como bajar ( subrutina choque) o aumentar( subrutina punto negro) la potencia de la velocidad

Te invito a que si tienes dudas o quieres complementar esta actividad mediante opiniones, otras informaciones no tengas miedo de emitir tus comentarios, a participar donde cada comentario hará que se haga más interactivo este espacio.

PitFinder

Autor: Felipe Andres Lagos Morapasten
Competencia: Aprendizaje Autónomo (Nivel 1)
Palabras Clave: Proyecto de Robots, NXC, Robótica, Kit Lego.

Descripción de la Actividad:

Iniciando la competencia de aprendizaje autónomo, quiero compartirles con ustedes mi actividad número dos llamada PitFinder que es correspondiente al Curso de Proyecto Robot, donde se tuvo que realizar un código fuente en NXC.

El problema de la actividad consistió en hacer que el robot sea capaz de recorrer toda la plataforma (pista) en busca de detectar las alturas de los precipicios presentes en la pista, todo esto termina al realizar las mediciones de cuatro precipicios, entregando un reporte sobre esto.

Solución

Lo primero que se debe hacer para realizar esta actividad es analizar la problemática correspondiente a la actividad esto hace que se simplifique y facilite para llegar a un buen resultado donde el análisis sirve de ayuda para la realización del pseudocódigo, para luego finalizar con la creación de el código fuente en el lenguaje NXC.

Pseudocódigo:
CERCA 10
altura[4]
i=0     

sub medir()       
{ Obtener altura según el sensor de proximidad
  Guardar el valor de la altura en un arreglo
  i++
  Retroceder y gira en un ángulo random
}

sub escribir()
{ Crear un archivo
  Escribir los datos del arreglo en el archivo
  Mostrar los datos del archivo por pantalla
 }

tarea detectar()
{  Mientras (i<=3)
            { Avanza
              Si(sensor de proximidad > CERCA)    
                        {Llamar a subrutina medir()
                           } //cierre de Si
             }  // Cierre del Mientras
Llamar a subrutina escribir ()
} // Cierre de la tarea detectar

Tarea principal ()
{  Ejecutar tarea detectar
  Encender sensor de proximidad }

El código fuente del programa en NXC es el siguiente: 

#define CERCA 10  // Variable usada para definir un valor para el sensor de Proximidad mida, en cm.

int altura[4];   // Es el arreglo de tipo entero para que se guarden los valores cada vez que detecte una medición del precipicio.

int i=0             // Esta variable se usó para guarda el valor en valor entregado por el sensor en la primera posición.

int a=0;          // Para que se pueda recorrer el arreglo, mostrando todos los valores.

int giro;          // Variable que se usará para el giro aleatorio.



sub medir()               // sub modo medir.

{

 Off(OUT_AC);   // Apagar motores por 3 segundos.

 Wait(3000);

 altura[i]=SensorUS(IN_2);// Acá es donde se guarda el valor de la medición en la posición 0 del arreglo.

 i++; // Se le suma uno a i para que guarde en la siguiente posicion del arreglo.

 OnRev(OUT_AC,75);// Retroceso por 3 milisegundos con potencia 75

 Wait(300);

 OnRev(OUT_A,75);// Las dos instrucciones es para realizar un giro con un valor aleatorio.

 OnFwd(OUT_C,75);

 giro=Random(400)+200;  // Como anteriormente dicho, el valor del giro es aleatorio.

 Wait(giro);                // el valor esta entre 400 y 600 milisegundos.

}

sub escribir() // sub modo escribir

  { int fsize; // entero para el tamaño del archivo.

   bool eof = false; // booleano para que al finalizar siempre muestre en pantalla        

   int i=0;// Valor inicial del arreglo, posición 0 

   int x=0,y=0; // Variables que indican las coordenadas de la pantalla del ladrillo.

   byte punteroArchivo;  // Usado para acceder al archivo.

   string cadena;// Donde se guardará el texto que se mostrará en pantalla.

   int pos=1;   // entero para que en pantalla muestra el número de precipicio

   byte bytesEscritos;



    CreateFile("MedicioneS.txt", 1024, punteroArchivo);  // Creación del archivo

            for(i=0; i < ArrayLen(altura); i++) {            // Todo esto nos permite recorrer TODO el arreglo.

                        string alturax = NumToStr(altura[a]); // Se pasa el valor entero del arreglo a String para poder mostrarlo, posición inicial(a=0)

                       string posicion = NumToStr(pos);// Al igual que el anterior se pasa a String, muestra el numero de precipicio que corresponde la medición.

                  cadena = StrCat("Pre.",posicion,"==>",alturax,"m");// Lo que se muestra en pantalla. (Pre.1 ==> 94 m por ejemplo)

                    a++;   pos++;// Sumar uno a y pos lo que nos dice que se avanza en la posición del arreglo y numero de precipicio.

                    WriteLnString(punteroArchivo, cadena, bytesEscritos); // Escribir en el archivo la cadena.

            }           // Cierre del for

           

    CloseFile(punteroArchivo); // Cerrado del archivo

      if(OpenFileRead("MedicioneS.txt", fsize, punteroArchivo) == NO_ERR) // Aqui es donde se abre el archivo que antes se creó.

            {

             while (eof == false) // Mientras sea eof igual a false

            {

             if(ReadLnString(punteroArchivo,cadena) != NO_ERR) eof = true;  // Leer el contenido del archivo que se guardo en cadena.

                 TextOut(x,y,cadena);// Mostrar en pantalla el texto(medición) que contiene cadena.

                y+=10; // Usado para que en la coordenada y aumente en 10 lo que muestra los valores de la mediciones sin errores como sobre escritura en la pantalla.

              Wait(2000); // Por 2 segundos.

             

}           // Cierre del while.

            }  //Cierre if

            }           // Cierre del sub modo



task detectar()   // Tarea detectar.

{

    while(i<=3)             // Mientras i sea menor o igual a 3, lo que nos garantiza que realiza las 4 mediciones.

            {

            OnFwd(OUT_AC,70);  // Avanzar con una potencia 70

            if(SensorUS(IN_2) > CERCA) // Si el sensor de proximidad es mayor que Cerca

            {

            medir(); // Llamar al sub modo medir.

            }           // Cierre del if

            }  // Cierre del While

            escribir(); // Llamado al sub modo escribir.

           

 } // Cierre de la tarea detectar



 task main () // Tarea Principal.

 {

   Precedes(detectar);// Usado para que la tarea detectar trabajen paralelamente al main.

   SetSensorLowspeed(IN_2); // Encender Sensor de Proximidad, Puerto numero 2

         }


En resumidas cuentas en el código está basado solamente en el funcionamiento del Sensor de Proximidad lo que hace posible medir las distancias de altura en los precipicios, además del uso de subrutinas para cada caso que se pueda plantear en el camino del robot.

El video de esta actividad es el siguiente:




Reflexión:

Para la realización de esta actividad la gran dificultad estuvo marcada por el hecho de escribir un reporte sobre las mediciones de altura que hacia el robot todo esto en un archivo el cual debe ser leído, ya que el archivo se debe crear, se debe abrir y por ultimo cerrar el mismo archivo, además de mostrar en pantalla porque se tuvo que calcular las coordinadas (x, y) en la pantalla para que el texto no se sobrescribiera.

Te invito a que si tienes dudas o quieres complementar esta actividad mediante opiniones, otras informaciones no tengas miedo de emitir tus comentarios, a participar donde cada comentario hará que se haga más interactivo este espacio.

jueves, 15 de diciembre de 2011

Presentación Soporte Informático.

Autor: Felipe Andrés Lagos Morapasten
Competencia: Actuación Ética. (Nivel 1)
Palabras Clave: Administración de Sistema, Soporte, Bases de Datos,
Hospital.

Descripción de la Actividad

Nuevamente para la competencia de actuación ética les quiero compartir con ustedes una actividad de presentación en Power Point sobre el tema: Soporte Informático en una empresa que es correspondiente al curso de Administración y Mantención de Sistemas, el lugar elegido (empresa) para la enfocarnos en el soporte informativo es un hospital, se desarrollarán los temas de seguridad, mantenimiento y las bases de datos.

Solución.


   Presentación de la actividad de soporte en un hospital, con los temás que se desarrollarán como lo son la seguridad, la base de datos y el mantenimiento.

 
Una pequeña introducción sobre el tema y su importancia en el dia a dia.

La seguridad es un tema muy importante en las empresas ya que el mal manejo de esta puede hacer que el rendimiento no sea el esperado. 



    Algunos componentes importantes para la seguridad en un empresa son las redes propias, el firewall , las redes alternativas y  los servidores que posean.






Un tema que también es fundamental en un hospital son el uso de las bases de datos, ya que día a día ingresa gente por los diferentes servicios que ofrecen, proveen, esto genera que se tenga un registro de las consultas, horas de las personas, lo que provoca una actualización seguida.





Un Ejemplo de todo lo nombrado anteriormente:


Finalmente esta el tema de las mantención, que se preocupa de velar el bienestar de todos los productos electrónicos que se encuentran en la empresa (hospital). 





Reflexión

Para desarrollar bien los temas que se abordará en el trabajo de soporte informático se tuvo que pensar sobre el enfoque en que está destinado la empresa ya que estos nos dice con exactitud los temas importantes como por ejemplo en un hospital es sabido que diariamente ingresan personas, esto hace que se debe tener un registro de todas estas personas, actualizar las bases de datos, las cuales luego deben tener mantención.

Te invito a que si tienes dudas o quieres complementar esta actividades mediante opiniones, otras informaciones no tengas miedo de emitir tus comentarios, a participar donde cada comentario hará que se haga más interactivo este espacio.