Paso 6: Aplicación de la lógica del Sensor
El sensor infrarrojo consiste en un individuo IR LED y un fotodiodo IR. La luz IR emitida por el LED incide en la superficie y se refleja hacia el fotodiodo IR. El fotodiodo entonces da un voltaje de salida proporcional a la reflectividad de la superficie (alto valor para la luz de la superficie) y baja para la superficie de negro oscuro. En el caso de los sensores utilizados, un circuito integrado en el módulo genera como salida una señal digital simple (alto: oscuro; BAJO: La luz). Un potenciómetro instalado en el módulo (ver foto) ajustará el nivel correcto de la luz para ser considerado "oscuro" o no. Actúa de forma que cuando el color de la luz reflejado es negro oscuro, un nivel alto ("1") se genera en su producción y un bajo ("0") por otro color más claro. Aquí usé un módulo integrado con 4 sensores y módulo adicional con un único sensor (forma diferentes, pero la misma lógica). La combinación es un arreglo de 5 sensores que creo que es bueno para un buen control como explicado abajo.
La serie de 5 sensores está montada de forma que si sólo un sensor se centra con relación a la línea negra, sólo que el sensor específico producirá un alto. Por otro lado, se calculará el espacio entre sensores para permitir que 2 sensores pueden cubrir todo el ancho de la línea negra simultáneamente, produciendo también una alta en ambos sensores (ver las fotos aquí).
La matriz del sensor posible al seguir una línea de salida son:
- 0 0 0 0 1
- 0 0 0 1 1
- 0 0 0 1 0
- 0 0 1 1 0
- 0 0 1 0 0
- 0 1 1 0 0
- 0 1 0 0 0
- 1 1 0 0 0
- 1 0 0 0 0
Tener 5 sensores, permite una generación de una "variable de error" que ayudará a controlar la posición del robot sobre la línea, como se muestra a continuación.
Vamos a considerar que la condición óptima es cuando el robot está centrado, con la línea justo debajo de "medio sensor" (Sensor 2). La salida de la matriz será: 0 0 1 0 0 y en esta situación, el "error" será "cero". Si el robot empieza a conducido a la izquierda (la línea "parece mover" la derecha") debe aumentar el error con una señal positiva. Si el robot comienza a moverse a la derecha (la línea "parece mover" izquierda"), de la misma manera, el error debe aumentar, pero ahora con una señal negativa.
Relacionadas con la variable de error con el sensor de estado será:
- 0 0 0 0 1 == > error = 4
- 0 0 0 1 1 == > error = 3
- 0 0 0 1 0 == > error = 2
- 0 0 1 1 0 == > error = 1
- 0 0 1 0 0 == > error = 0
- 0 1 1 0 0 == > error = -1
- 0 1 0 0 0 == > error = -2
- 1 1 0 0 0 == > error = -3
- 1 0 0 0 0 == > error = -4
Mirando el código de Arduino, cada uno de los sensores se define con un nombre específico (considerar que la línea siga Sensor más a la izquierda debe asignarse con una etiqueta "0"):
const int lineFollowSensor0 = 12;
const int lineFollowSensor1 = 18;
const int lineFollowSensor2 = 17;
const int lineFollowSensor3 = 16;
const int lineFollowSensor4 = 19;
En orden de almacenamiento se crearán los valores de cada sensor una variable de matriz:
int LFSensor [5] = {0, 0, 0, 0, 0};
Cada posición del array se actualizará constantemente con la salida de cada uno de los sensores:
LFSensor [0] = digitalRead(lineFollowSensor0);
LFSensor [1] = digitalRead(lineFollowSensor1);
LFSensor [2] = digitalRead(lineFollowSensor2);
LFSensor [3] = digitalRead(lineFollowSensor3);
LFSensor [4] = digitalRead(lineFollowSensor4);
Tener el valor de cada uno de los sensores, se debe implementar una lógica para generar la variable de error:
Si ((LFSensor [0] == 0) & & (LFSensor [1] == 0) & & (LFSensor [2] == 0) & & (LFSensor [3] == 0) & & (LFSensor [4] == 1)) error = 4;
else if ((LFSensor [0] == 0) & & (LFSensor [1] == 0) & & (LFSensor [2] == 0) & & (LFSensor [3] == 1) & & (LFSensor [4] == 1)) error = 3;
else if ((LFSensor [0] == 0) & & (LFSensor [1] == 0) & & (LFSensor [2] == 0) & & (LFSensor [3] == 1) & & (LFSensor [4] == 0)) error = 2;
else if ((LFSensor [0] == 0) & & (LFSensor [1] == 0) & & (LFSensor [2] == 1) & & (LFSensor [3] == 1) & & (LFSensor [4] == 0)) error = 1;
else if ((LFSensor [0] == 0) & & (LFSensor [1] == 0) & & (LFSensor [2] == 1) & & (LFSensor [3] == 0) & & (LFSensor [4] == 0)) error = 0;
else if ((LFSensor [0] == 0) & & (LFSensor [1] == 1) & & (LFSensor [2] == 1) & & (LFSensor [3] == 0) & & (LFSensor [4] == 0)) error =-1;
else if ((LFSensor [0] == 0) & & (LFSensor [1] == 1) & & (LFSensor [2] == 0) & & (LFSensor [3] == 0) & & (LFSensor [4] == 0)) error = -2;
else if ((LFSensor [0] == 1) & & (LFSensor [1] == 1) & & (LFSensor [2] == 0) & & (LFSensor [3] == 0) & & (LFSensor [4] == 0)) error = -3;
else if ((LFSensor [0] == 1) & & (LFSensor [1] == 0) & & (LFSensor [2] == 0) & & (LFSensor [3] == 0) & & (LFSensor [4] == 0)) error = -4;