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!