Paso 4: Código de Arduino - calibración del sensor de
Línea que sigue la secuencia de calibración de sensores de robots
Braian
***/
/*
CÓMO UTILIZAR:
Sube imágenes de este script.
Arduino tiene que permanecer conectado a la computadora.
Los sensores deben tener su voltaje proporcionado.
Colocar el robot enteramente sobre su blanca superficie de funcionamiento
suponer es línea negra a su izquierda,
pero no en la visión de los sensores.
Pulse el botón reset arduinos.
Después de 2 segundos pin 13 a bordo LED deberá encenderse.
Mediciones de calibración superficie blanca se realizan mientras el LED está encendido - aproximadamente 2 seg.
LED se apagará después de eso.
Después de 2 segundos demora el LED se enciende otra vez.
Ahora tienes 5 segundos para mover el robot hacia un lado sobre una línea negra.
Línea tiene que ser el de la izquierda frente a la misma manera como robot se va a ejecutar.
Tienes que mover el robot a la izquierda y aproximadamente en ángulo recto a la línea.
Durante este paso que se toman las lecturas máximas que se producen cuando un solo sensor es directamente sobre la línea.
No se apresura, pero todos los sensores deben estar sobre la línea cuando llevó se apaga después de 5 segundos.
Después de otro 2 segundos demora el LED se encenderá una vez más.
Ahora tienes que mover el robot sobre la línea, frente a lo que hiciste en el paso pasado.
Significa durante 5 seg movimiento robot nuevo derecho sobre la línea.
Importante: este robot del tiempo tiene que moverse a la derecha - derecha sensor tiene que pasar primero por línea!
Durante esto son tomadas medidas que dicen, cómo baja al lado de los dos sensores IR, cuando la línea está exactamente entre los dos.
Mediciones finales cuando condujo sale después de 5 seg.
Iniciar el monitor de la serie.
Detener el desplazamiento automático y copiar valores de corrección de las líneas sucesivas de tres robots script del montar a caballo.
*/
/ * entrada de sensor pernos * /
const int sensorPins [] = {A0, A1, A2}; derecha, centro, izquierda
/ * a bordo LED pin * /
const int indicatorPin = 13;
/ * arrays para almacenar datos computados y sensor
tres sensores en cada arreglo de discos:
0 - A LA DERECHA, 1 - CENTRO, 2 - IZQUIERDA * /
lecturas de flotación [3]; lecturas del sensor
Float averageReadings [3] = {0, 0, 0}; media lecturas
Float whitePoints [3] = {0, 0, 0}; lectura en superficie blanca
blackPoints int [3] = {0, 0, 0}; máxima lectura pasando sobre la línea negra
Float unitSteps [3]; diferencia entre blanco y negro dividido 100
correcciones de int [3]; puntos blancos como int
Float peakDetect [3] = {0, 0, 0};
Float betweenReadings [2] = {1024, 1024}; las lecturas cuando la línea está entre dos sensores, centro-derecha, centro-izquierda
Boolean betweenState [3] = {false, false, false}; ayuda para saber que mínimo para almacenar
/ * bucle ayudante variables * /
int i;
int j;
void setup() {}
Serial.Begin(9600); inicia a serial monitor para datos de salida después de mediciones
pinMode (indicatorPin, salida); pin Set nboard led para indicar Estado de medición
/ * iniciar calibración después de retardo de 2 segundos * /
Delay(2000);
/ * MEDICIÓN EN SUPERFICIE BLANCA POR UNOS 2 SEGUNDOS SUPUESTOS * /
digitalWrite (indicatorPin, HIGH); a bordo enciende el LED
para (i = 0; i < 125; i ++) {//125 las lecturas de cada sensor
para (j = 0; j < = 2; j ++) {//loop a través de cada sensor
lecturas [j] = analogRead(sensorPins[j]); obtener valor
/ * calcular promedio sensor valores * /
whitePoints [j] = (whitePoints [j] * j + readings[j]) / (j + 1); promedio de los measurings tomados esto ahora
Delay(2);
}
Delay(10);
}
digitalWrite (indicatorPin, bajo); LED a bordo sale
Delay(2000); retardo de 2 seg
/ * VA HACIA LOS LADOS SOBRE LA LÍNEA NEGRA DENTRO DE PRÓXIMOS 5 SEGUNDOS SUPUESTOS * /
digitalWrite (indicatorPin, HIGH); a bordo enciende el LED
para (i = 0; i < 320; i ++) {//320 las lecturas de cada sensor
para (j = 0; j < = 2; j ++) {//loop a través de cada sensor
lecturas [j] = analogRead(sensorPins[j]); obtener valor
Si (lecturas [j] > blackPoints[j]) {//if valor actual es mayor que un olready guardado
blackPoints [j] = lecturas [j]; almacenar si aplicable
}
Delay(2);
}
Delay(10);
}
digitalWrite (indicatorPin, bajo); LED a bordo sale
/ * calcular el "paso de la unidad" - 1/100 de diferencia entre blanco y negro para cada sensor
y transformar puntos blancos a int (correcciones) * /
para (j = 0; j < = 2; j ++) {}
unitSteps [j] = (blackPoints [j] - whitePoints [j]) / 1000;
correcciones [j] = (int) (whitePoints [j] + 0.5);
}
Delay(2000); retardo de 2 seg
/ * VA HACIA LOS LADOS (A LA DERECHA!!!!!!) SOBRE LA LÍNEA NEGRA DENTRO DE PRÓXIMOS 5 SEGUNDOS SUPUESTO * /
digitalWrite (indicatorPin, HIGH); a bordo enciende el LED
para (j = 0; j < = 2; j ++) {//to reutilizar este arreglo de discos, todo a 0
blackPoints [j] = 0;
}
para (i = 0; i < 320; i ++) {//320 las lecturas de cada sensor
para (j = 0; j < = 2; j ++) {//loop a través de cada sensor
lecturas [j] = (analogRead(sensorPins[j]) - corrections[j]) / unitSteps [j]; obtener valor de cada uno en unidades finales
}
para (j = 0; j < = 2; j ++) {//loop a través de tres lecturas de sensor
Si (lecturas [j] > blackPoints[j]) {//if actual es mayor que la maxima almacenada
blackPoints [j] = lecturas [j]; almacenar si appicable
}
else if (lecturas [j] + 30 < blackPoints[j]) {//if lectura está disminuyendo (almacenado es mayor que el actual)
betweenState [j] = true; indicar en esta variable que el sensor se ha movido en un máximo de lectura (línea)
}
Si (betweenState [0] == true & & betweenState [1] == false) {//if primera lectura sensor ha pasado su maxima y segundo no ha
Si (betweenReadings [0] > lecturas [0] + readings[1]) {//if almacenado suma de dos lecturas del sensor es más grande que la suma actual
betweenReadings [0] = lecturas [0] + lecturas [1]; almacenar si es aplicable
}
}
else if (betweenState [1] == true & & betweenState [2] == false) {//if segunda lectura sensor ha pasado su maxima y tercero no ha
Si (betweenReadings [1] > lecturas [1] + readings[2]) {//if almacenado suma de dos lecturas del sensor es más grande que la suma actual
betweenReadings [1] = lecturas [1] + lecturas [2]; almacenar si es aplicable
}
}
Delay(2);
}
Delay(10);
}
digitalWrite (indicatorPin, bajo); LED a bordo sale
} / / instalación
void loop() {}
/ * imprimir los resultados en el monitor serial * /
Serial.Print ("const int correcciones [3] = {");
Serial.Print(Corrections[0]);
Serial.Print(",");
Serial.Print(Corrections[1]);
Serial.Print(",");
Serial.Print(Corrections[2]);
Serial.println("};");
Serial.Print ("const float unitSteps [3] = {");
Serial.Print(unitSteps[0]);
Serial.Print(",");
Serial.Print(unitSteps[1]);
Serial.Print(",");
Serial.Print(unitSteps[2]);
Serial.println("};");
Serial.Print ("const float betweenReadings [2] = {");
Serial.Print(betweenReadings[0]);
Serial.Print(",");
Serial.Print(betweenReadings[1]);
Serial.println("};");
Serial.println("");
} / / / lazo