.: Dave Dan :.

Lo peor que puede hacerse es cruzar un precipicio en dos saltos.

Lego MindStorms ... de regreso a la robotica.

Hola a Todos.

El pasado día 24 Papá Noel ( una gran persona, todo hay que decirlo ), decidió que me había portado bastante bien durante el año y me sorprendió con un Lego MindStorms.

Tras todas las obligaciones familiares, laborales, mi cumpleaños ( SI,otro año más viejo ), etc, etc, ayer por fín comencé ( como diría mi amigo El Bruno ) con mi conquista personal del mundo.

Hace algunos años me inicié en el tema de la robotica totalmente emocionado despues de ver al señor Data en la saga StarTrek, o a nuestro maravilloso T-1000 en Terminator, y como no ... nuestro memorable amigo Roby ( para aquellos que no lo conozcais, Roby es uno de los robots más antiguos de la historia del cine ) y monté un pequeño robotillo que solo éra capaz de seguir una linea de cinta aislante negra sobre un suelo blanco. Esa fue una maravillosa experiencia. ( no recuerdo sobre que lo programé ... pero si recuerdo las horas y horas dedicadas para que el pequeño bicho se pusiera en marcha y me hiciera caso!! ).

Aunque ya conocia el tema de los MindStorms gracias a Miguel Jimenez en la CodeCamp del Escorial ( creo q no olvidaré esas 2 horas antes de la presentación del evento de lucha entre los legos en la que estabamos montando los bichos ) me volvió a impresionar la sencillez con la que puedes montar tu propio humanoide y programarlo sin problemas.

Claro que eso te empieza a abrir la mente y nuevas ideas te empiezan a aparecer, pero claro, lo primero es lo primero. Osea que aquí os dejo la implementación del 'Sigue Lineas', para que la echeis un vistazo a ver que os parece.

namespace sigueLinea
{
   public partial class frmSigueLaLinea : Form
   {
      // Si el color detectado es igual o superior a este valor, es blanco
      int colorBlanco = 50;
      // Si el color detectado es igual o inferior a este valor, es negro
      int colorNegro = 40;

      public frmSigueLaLinea()
      {
         InitializeComponent();
      }

      #region Eventos

      // Indica si está activo
      bool estaActivo = false;
      // Indica si se ha encontrado la linea
      bool negroEncontrado = false;

      protected override void OnLoad(EventArgs e)
      {
         base.OnLoad(e);
         nxtBrick.Connect();
      }

      protected override void OnClosing(CancelEventArgs e)
      {
         nxtBrick.Disconnect();
         base.OnClosing(e);
      }

     // Comprobamos la información del sensor de visión y decidimos que hacer
      private void nxtLightSensor_ValueChanged(NxtSensor sensor)
      {
         // No se hace nada hasta que no esté activo
         if (estaActivo == false)
         { return; }

         // Inicialmente, el bicho se pone en marcha hasta encontrar la linea.                // En el momento que la encuentra el sensor pondrá a seguirla
         if (nxtLightSensor.Value <= colorNegro)
         { negroEncontrado = true; }

         // Como lo hemos encontrado ... le seguimos
         if (negroEncontrado)
         { SigueLaLinea(nxtLightSensor.Value); }
         else
         { SigueRecto(0); }
      }

      // Pulsamos en Ir
      private void btnGo_Click(object sender, EventArgs e)
      {
         estaActivo = true;
      }

      // Pulsamos en Parar
      private void btnStop_Click(object sender, EventArgs e)
      {
         estaActivo = false;
         PararMotor();
         negroEncontrado = false;
      }

      // Pulsamos en Cerrar
      private void btnQuit_Click(object sender, EventArgs e)
      {
         this.Dispose();
      }

   #endregion

   #region Algoritmo para seguir la linea

      public void SigueLaLinea(int LightValue)
      {

      // Si es blanco ... lgiramos a la derecha
      if (LightValue > colorBlanco) { GiraDerecha(); }
      // Si es negro ... giramos a la izquierda ( un poquito )
      else if (LightValue < colorNegro) { GiraIzquierda(); }
      // Si no es ninguno de los dos .. seguimos recto
      else { SigueRecto(0); }

      }

   #endregion

   #region Control del Robot

      // La velocidad de movimiento
      int Velocidad = 10;
      // A que velocidad se gira
      int gradosGiro = 1;

      public void SigueRecto(int grados)
      {
         nxtMotorA.Turn(Velocidad, grados);
         nxtMotorC.Turn(Velocidad, grados);
      }

      public void VuelveAtras(int grados)
      {
         nxtMotorA.Turn(-Velocidad, grados);
         nxtMotorC.Turn(-Velocidad, grados);
      }

      public void GiraIzquierda()
      {
         nxtMotorA.Turn(Velocidad, gradosGiro);
      }

      public void GiraDerecha()
      {
         nxtMotorC.Turn(Velocidad, gradosGiro);
      }

      public void PararMotor()
      {
         nxtMotorA.Coast();
         nxtMotorC.Coast();
      }

   #endregion

   }
}

Pues eso ... un saludo a todos!

Posted: 8/1/2007 12:17 por David Herraiz | con 5 comment(s)
Archivado en:
Comparte este post:

Comentarios

Fran Díaz ha opinado:

Hola,

Como podría conseguir uno aquí en España?

Un Saludo

# January 8, 2007 12:55 PM

kinusa ha opinado:

Hola.

Yo lo compré hace un mes en http://www.electricbricks.com/

No he tenido ningún problema ni con el pedido ni con el envío ni nada, todo perfecto!

# January 8, 2007 1:06 PM

El Bruno ha opinado:

Hey amigo ...

q alegria !!!

a disfrutarlo !!!

Saludos

# January 8, 2007 3:28 PM

Miguel LLopis ha opinado:

Hola David!

Yo también tengo uno (si estuviste en la Code, lo gané en el combate de sumo xD).

Pues nada, si tienes alguna duda espero poder ayudarte... y cuando quieras montamos una orden de caballeros Lego-Jedis... ;)

Un saludo!

# January 8, 2007 6:28 PM