miércoles, 28 de septiembre de 2011

Robot SigueLíneas (IV): Resultados

Y aquí os dejo un vídeo de este robot moviéndose a lo largo de la línea del panel que venía con el Lego(C) Mindstorms.



Va bastante lento. El que se mueva más rápido iba a necesitar de más labores de programación y tampoco estaba por la labor. Con hacer un seguidor de líneas utilizando dos sensores ya me daba por satisfecho.

En el vídeo se puede ver como comienza a girar el robot. Cuando uno de los sensores se acerca a la línea negra. Cuando la línea está entre los dos sensores el robot sigue recto.

El cable conectado al arduino,se utiliza para darle energía y para enviar la información al Matlab, que la lee a través del puerto serie. Matlab envía las órdenes utilizando el bluetooth, que milagrosamente ahora funciona.

Me gustaría como mejora, ponerle un portapilas al arduino para no tener cables. Enviar la información a través de un emisor rf a otro arduino, este sí, conectado por usb a un Matlab y que este envíe las órdenes por bluetooth al bloque.

Robot SigueLíneas (III): Matlab

Aquí adjunto el código para mover todo con matlab.

umbral = 150;
potenciaAdelante = 5;
potenciaGiro = 3 * potenciaAdelante;

COM_CloseNXT all
hNXT = COM_OpenNXT('bluetooth.ini');
COM_SetDefaultNXT(hNXT);

placa = serial( 'COM4' , 'BaudRate', 9600 );
fopen( placa );

try
i = 1;

mi = NXTMotor('A');
md = NXTMotor('B');


while (i < 10000)
loQueRecibo = fscanf( placa );
loQueRecibo = sscanf(loQueRecibo,'%d');

a = size(loQueRecibo);

if(a(1) == 2)

loQueRecibo;

valorIzquierda = loQueRecibo(1);
valorDerecha = loQueRecibo(2);

if( (valorIzquierda < umbral) && (valorDerecha > umbral) )
display('Me muevo hacia la izquierda.');
mi.Stop('off');
mi.SendToNXT();

md.Power = potenciaGiro;
md.SendToNXT();
elseif( (valorDerecha < umbral) && (valorIzquierda > umbral) )
display('Me muevo hacia la derecha.');

md.Stop('off');
md.SendToNXT();

mi.Power = potenciaGiro;
mi.SendToNXT();
elseif( (valorDerecha > umbral) && (valorIzquierda > umbral) )
display('Me muevo hacia adelante como los de alicante.');

mi.Power = potenciaAdelante;
mi.SendToNXT();

md.Power = potenciaAdelante;
md.SendToNXT();
else
md.Stop('off');
mi.Stop('off');

loQueRecibo

%pause;
end

i = i + 1;
end % compruebo que he recibido dos
end

catch err
loQueRecibo
display('LEÑO GORDO')

err

try
mi.Stop('off');
md.Stop('off');
catch err1
end

fclose( placa );
COM_CloseNXT(hNXT);
end % try-catch

mi.Stop('off');
md.Stop('off');

fclose( placa );
COM_CloseNXT(hNXT);


He utilizado la la última versión estable de laRWHT toolbox. Ahora está orientada a objetos y utiliza una aplicación en nxc para un, según ellos, mejor control de los motores.

Robot SigueLíneas (II): Parte Arduino leyendo un sensor óptico QRD1114

El montaje es bastante sencillo. Habría que repetirlo dos veces, para tener un sensor a cada lado de la línea.





En las entradas analógicas 0 y 5 del arduino recogemos la información del sensor.

El código del arduino es el siguiente

int pinIzquierdo = 0;
int pinDerecho = 5;

void setup(){
Serial.begin(9600);

pinMode( pinIzquierdo , INPUT );
pinMode( pinDerecho , INPUT );
}//setup

void loop(){
delay(500);

Serial.print( analogRead ( pinIzquierdo ) );
Serial.print( " " );
Serial.print( analogRead ( pinDerecho ) );
Serial.println();
Serial.flush();
}//loop


Y aquí está la salida que se muestra por el monitor serie.

A la izquierda de cuando detecta blanco por ambos lados. En el centro cuando detecta blanco a un lado y negro al otro. Y a la izquierda viceversa.

Robot Sigue Líneas (I): Introducción

Hoy voy exponer un pequeño proyecto que es bastante típico dentro del mundo de la construcción de robots: un seguidor de líneas.

Cierto es que ya había construido un robot de características similares en un par de ocasiones. Pero en ambos casos sólo tenía un sensor para leer la línea. Ahora, voy a tener dos. Además de que no puse ningún vídeo.

No me he comprado ningún sensor de lego nuevo. Vamos a hacerlo con estos dos pequeños sensores (QRD1114), un arduino y un lego.



Estos sensores tienen aquí una hoja de especificaciones muy bien explicada para gente experta. Como soy un poco más mundano, lo voy a explicar para zotes como yo. Es un sensor análogico que mide la cantidad de luz reflejada por una superficie. De este modo, una superficie negra no refleja la misma luz que una blanca, permitiendo diferenciar el color de la superficie.

Lo que pretendo construir es un vehículo que tenga incrustado el arduino conectado a los dos sensores. Este arduino enviará la lectura de los sensores a Matlab a través de un cable usb. Matlab la interpretará y moverá los motores del vehículo acorde a través de la conexión bluetooth.





Lo ideal sería prescindir del cable usb y enviar la información a Matlab a través de un emisor rf, como ya hice con anterioridad. Pero es que de momento, tampoco sé alimentar al arduino con otra cosa que no sea un cable usb.