Paso 5: Código Arduino - robot funcionando
Seguidor de línea robot operación script
Braian
***/
/ * motores de salida pines * /
const int Señor = 6; Pin delantero motor derecho
const int ML = 5; Eje delantero motor izquierdo
/ * entrada de sensor pernos * /
const int sensorPins [] = {A0, A1, A2}; derecha, centro, izquierda
/ * otros pines de entrada y salida * /
const int ledPin = 13; LED indica si el modo de búsqueda está en
const int potPin = A5; para ajustar el error de izquierda a derecha
/ * arrays para almacenar sensor y computarizada de datos * /
int sensorReadings [3]; lecturas del sensor a la derecha, centro, izquierda
Float sensorValues [3]; lecturas del sensor a la derecha, centro, izquierda
int potAdjust = 0; balance del sensor con el valor del potenciómetro de ajuste
/ * contadores, ayudantes etc. * /
int i; contador general en bucles
int unknownCount = 0; contador de sucesivos Estados de línea-desconocido
int s; valor de PWM para la velocidad
/ *** CONFIGURACIÓN *** /
const int turnThreshold = 15; en que la diferencia entre izquierda y derecha para sensorreadings Inicio torneado liso (1000 unidades de escala de forma de blanco a negro)
const int quickturnThreshold = 20; que diferencia entre izquierda y derecha sensorreadings comenzar giro escarpado
const int indicateThreshold = 2; que lectura de consideramos línea conocida
const int moveLength = 55; Cuánto tiempo debe un movimiento tomar después de que ha ganado velocidad (depende de la raíz de tres variables)
y antes de que se convoque nueva verificación del estado del sensor (en milisegundos)
tiempo tarda en ganar velocidad = [(maxSpeed-startSpeed) / speedStep] (en millis) actuales: 9
const int maxSpeed = 160; máximo valor PWM para motores
para empezar mejor aumentamos el valor PWM en tiempo:
const int startSpeed = 80; PWM de para empezar, por ejemplo a 1/2 del máximo
const int speedStep = 10; cuántos valores PWM a aumentar después de cada 1 milisegundo
const int pauseLength = 140; pausa entre movimientos para mejor lectura del sensor
int unknownMax = 25; después cuántas mediciones sucesivas línea"desconocido" para empezar la búsqueda línea rutina
/ * SENSOR correcciones para punto blanco y "pasos de unidad": derecha, centro, izquierda
COPIAR ESTOS VALORES DE CALIBRACIÓN PROGRAMA SALIDA SERIAL * /
const int correcciones [3] = {38,38,31};
const float unitSteps [3] = {0.06,0.01,0.02};
const float betweenReadings [2] = {219.30,233.33};
/**/
void setup() {}
/ * motor de pasadores /
pinMode (Señor, salida);
pinMode (ML, salida);
/ * pines del sensor * /
pinMode (sensorPins [0], entrada);
pinMode (sensorPins [1], entrada);
pinMode (sensorPins [2], entrada);
pinMode (potPin, entrada);
} / / instalación
void loop() {}
readSensors();
If
(
sensorValues [0] + sensorValues [1] < 0.1 * betweenReadings [0] ||
sensorValues [1] + sensorValues [2] < 0.1 * betweenReadings [1] ||
sensorValues [0] < indicateThreshold ||
sensorValues [1] < indicateThreshold ||
sensorValues [2] < indicateThreshold
) {
unknownCount ++;
}
Else {}
unknownCount = 0;
}
Si (unknownCount < = unknownMax) {}
rideLine();
}
Else {}
searchLine();
}
} / / / lazo
void readSensors() {//sets matriz sensorValues [] a las lecturas del sensor con correcciones calculadas
para (i = 0; i < = 2; i ++) {}
sensorReadings [i] = analogRead(sensorPins[i]);
sensorValues [i] = (sensorReadings [i] - corrections[i]) / unitSteps [i];
}
potAdjust = (analogRead(potPin) - 45) * 10;
} / / /readSensors
void goStraight() {}
aumentar la velocidad poco a poco
para (s = startSpeed; s < = maxSpeed; s = s + speedStep) {}
analogWrite (Señor, s);
analogWrite (ML, s);
Delay(1);
}
velocidad máxima
analogWrite (Señor, s);
analogWrite (ML, s);
Delay(moveLength);
digitalWrite (Señor, LOW);
digitalWrite (ML, baja);
parada
Delay(pauseLength);
}
void goLeft (int turnspeed) {//turnspeed = 0 -> torneado liso, otra manera escarpada torneado
digitalWrite (ML, baja);
aumentar la velocidad poco a poco
para (s = startSpeed; s < = maxSpeed; s = s + speedStep) {}
analogWrite (Señor, s);
{if(turnspeed==0)}
analogWrite (ML, s * 0.4);
}
Delay(1);
}
velocidad máxima
analogWrite (Señor, s);
{if(turnspeed==0)}
analogWrite (ML, s * 0.4);
}
Delay(moveLength);
digitalWrite (Señor, LOW);
digitalWrite (ML, baja);
parada
Delay(pauseLength);
}
void goRight (int turnspeed) {//turnspeed = 0 -> torneado liso, otra manera escarpada torneado
digitalWrite (Señor, LOW);
aumentar la velocidad poco a poco
para (s = startSpeed; s < = maxSpeed; s = s + speedStep) {}
analogWrite (ML, s);
{if(turnspeed==0)}
analogWrite (Señor, s * 0.4);
}
Delay(1);
}
velocidad máxima
analogWrite (ML, s);
{if(turnspeed=0)}
analogWrite (Señor, s * 0.4);
}
Delay(moveLength);
digitalWrite (ML, baja);
digitalWrite (Señor, LOW);
parada
Delay(pauseLength);
}
void rideLine() {}
que indica la diferencia entre sensores izquierdos y derecho, teniendo en cuenta ajustes de potenciómetro, gire de forma
Si (sensorValues [0] - sensorValues [2] > turnThreshold + potAdjust & & sensorValues [0] - sensorValues [2] < quickturnThreshold + potAdjust) {}
goRight(0);
}
else if (sensorValues [0] - sensorValues [2] > quickturnThreshold + potAdjust) {}
goRight(1);
}
else if (sensorValues [2] - sensorValues [0] > turnThreshold - potAdjust & & sensorValues [2] - sensorValues [0] < quickturnThreshold - potAdjust) {}
goLeft(0);
}
else if (sensorValues [2] - sensorValues [0] > quickturnThreshold - potAdjust) {}
goLeft(1);
}
Else {}
goStraight();
}
} / / /rideLine()
void searchLine() {}
digitalWrite (ledPin, HIGH); indicar el modo de búsqueda con LED
int searchVar = 1; variable auxiliar para aumentar el radio de movimiento de la búsqueda
al mismo tiempo
(
sensorValues [0] + sensorValues [1] < 0.1 * betweenReadings [0] & &
sensorValues [1] + sensorValues [2] < 0.1 * betweenReadings [1] & &
sensorValues [0] < indicateThreshold & &
sensorValues [1] < indicateThreshold & &
sensorValues [2] < indicateThreshold
) {
Si (searchVar < = 5) {//go recto durante un tiempo, en caso de que realmente no se pierde
goStraight();
}
Else {//rightward movimiento con el aumento del radio mediante la inserción de secuencias de recta
para (i = 0; i < 7; i ++) {}
goRight(1);
}
para (i = 0; i < searchVar/5; i ++) {}
goStraight();
}
}
searchVar ++; indicar Estado rutinaria búsqueda completada
readSensors(); obtener nuevas lecturas
}
unknownCount = 0; reiniciar contador
digitalWrite (ledPin, LOW); indicar el final del modo de búsqueda
} / / /searchLine()