Al hablar de robótica inmediatamente nos imaginamos máquinas capaces de andar, de moverse o de actuar de forma inteligente. Muchas de ellas solo están, aún, en nuestra imaginación, otras las vamos realizando a pequeña escala con nuestro NXT. En este artículo trabajamos algo menos conocido, pero necesario, las posibilidades del DataLog.
El campo en el que más se usa la robótica en la actualidad es el de la automatización industrial. En él, máquinas automáticas y robots, como por ejemplo los observados en la cadena de montaje de los automóviles, realizan las actividades que antes realizaban los humanos.
Es en dicho sector donde cobra especial importancia la toma de datos. Obtener y almacenar datos de nuestros robots, como valores de variables, valores de los sensores etc, y después saber representarlas e interpretarlas pueden ayudarnos a conocer los fallos del diseño o las posibles mejoras de este. Una forma de almacenar estos datos en el NXT es mediante el uso de datalogs.
Para realizar nuestro ejemplo usaremos un proyecto realizado originalmente por NxtPrograms. El proyecto consiste en un carril inclinado por el que circularan bolas de colores. Al llegar a la parte más baja, un sensor de color detectará la bola y la pala se elevará para colocar dicha bola, de nuevo, al principio del circuito, en un bucle casi infinito.
Como todo lo que construimos, el paso del diseño al papel implica una serie de problemas que deberemos resolver. Es ocasional que por un mal montaje o una mala programación, las bolas se salgan del circuito, o bien se junten en el carril dando problemas a la pala. Para solucionar esto hemos colocado una barrera en la última sección del carril que haga esperar a una bola mientras la otra está en la pala.
Una vez tenemos nuestro proyecto queremos analizar los tiempos que tarda cada bola en completar una vez el circuito, así como su tiempo cuando hay más de una bola en el carril.
Para ello realizamos un programa que, además de realizar el comportamiento de la máquina, introduzca los datos que deseamos en un datalog. La elección de qué datos introducir y en qué momento del programa influirá mucho en la buena realización del experimento.
En este caso, como queremos contar el tiempo que tarda cada bola en volver a la pala, añadiremos un dato más al datalog cada vez que la bola pase por esta, reiniciando el temporizador tras ello. Como vamos a disponer de dos bolas distintas, una roja y otra azul, usaremos dos temporizadores distintos, pero esto no debe preocuparnos, pues el datalog almacenara, junto al dato del tiempo, una referencia que nos permitirá identificar cada temporizador.
Este es el código, implementado por Erling.
#pragma config(Sensor, S1, color, sensorI2CHiTechnicColor)
//*!!Code automatically generated by 'ROBOTC' configuration wizard !!*//
task control();//Control de barrera//
task cuenta();//Cuenta de bolas//
task lcd();//Muestra de cuenta de bolas en pantalla//
task data();//Almacenamiento de datos en datalog//
bool pala=0;//Pala con o sin bola//
int rojo=0;
int azul=0;
task main()
{
StartTask(control);
StartTask(cuenta);
StartTask(lcd);
StartTask(data);
while(true)
{
if(SensorValue(color)!=0)//Si detecta color//
{
pala=true;
wait1Msec(200);
nMotorEncoderTarget[motorA]=60;
motor[motorA]=-100;
wait1Msec(750);
nMotorEncoderTarget[motorA]=60;
motor[motorA]=100;
wait1Msec(10);
pala=false;
}
}
}
task control()
{
while(true)
{
if((pala==true))//Si la pala esta operando//
{
nMotorEncoderTarget[motorB]=90;
motor[motorB]=-100;
wait1Msec(1000);
while(pala==true)//Espera hasta que la bola sale//
{
wait1Msec(100);
}
nMotorEncoderTarget[motorB]=90;
motor[motorB]=100;
wait1Msec(10);
}
}
}
task cuenta()
{
while(true)
{
if(SensorValue(color)==9)
{
wait1Msec(1000);
rojo++;
}
if(SensorValue(color)==2)
{
wait1Msec(1000);
azul++;
}
}
}
task lcd()
{
while(true)
{
nxtDisplayCenteredBigTextLine(2, “ROJO=%d”, rojo);
nxtDisplayCenteredBigTextLine(4, “AZUL=%d”, azul);
wait1Msec(100);//Tiempo de refresco//
}
}
task data()
{
nDatalogSize=500;
while(true)
{
if(SensorValue(color)==9)
{
AddToDatalog(time1[T1]);
time1[T1]=0;
wait1Msec(1500);
SaveNxtDatalog();
}
if(SensorValue(color)==2)
{
AddToDatalog(time1[T2]);
time1[T2]=0;
wait1Msec(1500);
SaveNxtDatalog();
}
}
}
Realizaremos dos experimentos, el primero con una sola bola de color rojo. Y el segundo con una bola roja y otra azul. Es importante que realicemos el mismo número de tomas de datos, es decir, las veces que la bola repite el circuito, para poder compararlos de forma correcta.
Una vez que tenemos los datos de nuestros dos experimentos almacenados en nuestro datalog, hemos de ordenarlos con una tabla de excel para poder representarlos. Lo primero es pasar el formato ”.cvs” del datalog a uno más manejable. Para ello seguiremos este tutorial.
Tras obtener un nuevo formato para nuestros datos, podemos clasificar estos por color de la bola (el primer número corresponde a la referencia del temporizador, la segunda al tiempo en milisegundos ) y, tras ello, representarlos. Obteniendo las siguientes gráficas:
En nuestro eje “x” tenemos el número de toma del dato, y en nuestro eje “y” el tiempo que ha tardado la bola en realizar el circuito en milisegundos.
Como comprobamos en esta gráfica, los tiempos para la bola roja y la bola azul son prácticamente iguales. Algo totalmente lógico si tenemos en cuenta que poseen el mismo peso y diámetro, siendo su única diferencia el color, que no afectará a su comportamiento en su movimiento por el carril.
Pero: ¿Qué pasaría si tuviéramos bolas de distintos tamaños y pesos? Podríamos diferenciar cuales son las más rápidas y determinar que el radio influye mucho en su velocidad. O bien podríamos detectar bolas que, aunque en un principio deberían ser iguales, presentan alguna anomalía.
Si comparamos el comportamiento de la bola roja sola y de esta junto a la bola azul:
Como se ve los tiempos se reducen considerablemente de un caso a otro, además de haber menor dispersión de datos. Es decir, con una sola bola, los recorridos en tiempo son muchísimo más similares. Algo lógico al no tener que esperar en la barrera debido a que haya otra bola. También es lógico comprobar que el tiempo medio de diferencia entre ambos casos (427 ms, aproximadamente medio segundo) se corresponde al tiempo adicional que tarda la bola por esperar en la barrera reguladora.
Ahora bien: ¿Qué pasaría si añadiéramos otra bola más al circuito? La pala estaría más tiempo ocupada, por lo que las bolas tendrían que esperar más veces en la barrera, aumentando los tiempos para cada recorrido.
Esto, traducido a un caso real de una fábrica, puede darnos conocimientos sobre con cuantas unidades un proceso se satura, formándose cuellos de botella y tardando con ello mucho más tiempo en realizar cada tarea.
En definitiva, la toma de datos y el análisis de estos son una parte fundamental en el diseño de maquinaría en fábricas, y puede resultarnos muy útil para entender de una forma precisa como se relaciona nuestro robot con su medio.