Paso 3: Instalación y prueba los nuevos sensores
La nueva matriz de ahora 7 sensores, se monta de forma que los originales 5 se utilizan exclusivamente para control PID (y la detección de la "línea completa", explicada más adelante) y la nueva izquierda 2 para izquierda y derecha detección de cruce solamente.
Como un repaso, vamos a recordar cómo funcionan los sensores "digitales" originales 5:
Si 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 al mismo tiempo, también produce una señal de alto en ambos sensores.
Cómo funcionan los 2 nuevos sensores "análogos":
Si uno de los sensores se centra con relación a la línea negra, el resultado será un valor análogo, generalmente produciendo una salida en el bramido de ADC Arduino "100" (Recuerde que el ADC produce una salida de 0 a 1023). Con superficies más ligeras, el valor de salida será mayor (he probado 500 a 600 sobre papel blanco, por ejemplo). Este valor debe ser probado en diferentes situaciones de luz y superficie para definir la constante umbral correcto para utilizar en su caso (ver imagen aquí).
Mirando el código de Arduino, cada uno de los sensores se define con un nombre específico (tener en cuenta que debe asignarse el Sensor original de seguir línea más a la izquierda con una etiqueta "0"):
const int lineFollowSensor0 = 12; Utilizando la entrada Digital
const int lineFollowSensor1 = 18; Utilizando Analog Pin A4 como entrada Digital
const int lineFollowSensor2 = 17; Utilizando Analog Pin A3 como entrada Digital
const int lineFollowSensor3 = 16; Utilizando Analog Pin A2 como entrada Digital
const int lineFollowSensor4 = 19; Utilizando Analog Pin A5 como entrada Digital
const int farRightSensorPin = 0; Pin analógico A0
const int farLeftSensorPin = 1; Pin analógico A1
Para recordar, el posible 5 original sensor de matriz cuando siguiendo una línea de salida son:
- 1 1 1 1 1
- 0 0 0 0 0
- 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
Con la adición de los 2 nuevos, sus posibles salidas son:
- Sensor de extrema izquierda: Salida analógica mayor o menor que un umbral
- Sensor de la derecha: Salida analógica mayor o menor que un umbral
En orden de almacenamiento los valores de cada sensor se crea una variable de matriz para los sensores digitales 5 originales:
int LFSensor [5] = {0, 0, 0, 0, 0};
Y dos variables de número entero para los 2 nuevos sensores analógicos:
int farRightSensor = 0;
int farLeftSensor = 0;
Cada posición del array y variables se actualizarán 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);
farRightSensor = analogRead(farRightSensorPin);
farLeftSensor = analogRead(farLeftSensorPin);
Tener 5 sensores, como vimos en el proyecto de seguidor línea Robot, permite la generación de una "variable de error" que ayudará a controlar la posición del robot sobre la línea. También, se utilizará una variable llamada "mode" para la determinación si el robot está siguiendo una línea, sobre una línea continua, una intersección o no en todos.
Esta variable "modo" se utilizarán también con los sensores ahora derecha/izquierda ". Para la representación, vamos a considerar los sensores lejos izquierdos y derecho tiene 3 Estados posibles: H (superior a umbral), L (menor umbral) y X (irrelevante). Para las salidas digitales, será el habitual 0, 1 y también presentará la X:
- X 1 1 1 1 1 X == > modo = CONT_LINE; error = 0;
- H 0 X X X X L == > modo = RIGHT_TURN; error = 0; (ver el ejemplo en la imagen de arriba)
- L X X X X 0 H == > modo = LEFT_TURN; error = 0;
- X 0 0 0 0 0 X == > modo = NO_LINE; error = 0;
- H 0 0 0 0 1 H == > modo = FOLLOWING_LINE; error = 4;
- H 0 0 0 1 1 H == > modo = FOLLOWING_LINE; error = 3;
- H 0 0 0 1 0 H == > modo = FOLLOWING_LINE; error = 2;
- H 0 0 1 1 0 H == > modo = FOLLOWING_LINE; error = 1;
- H 0 0 1 0 0 H == > modo = FOLLOWING_LINE; error = 0;
- H 0 1 1 0 0 H == > modo = FOLLOWING_LINE; error = -1;
- H 0 1 0 0 0 H == > modo = FOLLOWING_LINE; error = -2
- H 1 1 0 0 0 H == > modo = FOLLOWING_LINE; error = -3;
- H 1 0 0 0 0 H == > modo = FOLLOWING_LINE; error = -4;
Por lo tanto, aplicar la lógica anterior en la función:
void readLFSsensors()
volverá al modo"variables" y "error" que se utilizará en la lógica de programación.
Es importante probar la lógica de los sensores antes de seguir con el proyecto. La función del fuelle está incluida en el código y puede ser utilizada para propósitos de prueba:
void testSensorLogic(void)
{
Serial.Print (farLeftSensor);
Serial.Print ("< == derecha izquierda == >");
Serial.Print (farRightSensor);
Serial.Print ("modo de:");
Serial.Print (modo);
Serial.Print ("error:");
Serial.println (error);
}