// ===============================
// VELOCIDAD HACIA ADELANTE
// ===============================
// Rango: 0 - 255
// 0 = detenido
// 255 = máxima velocidad
// Si el robot se desvía ligeramente hacia un lado,
// ajuste la velocidad del motor correspondiente.
// Se recomienda disminuir la velocidad en pasos de 5 unidades.
// Después, puede ajustar de 1 en 1 hasta obtener
// el desplazamiento deseado.
int velocidadMotorA = 255; // MOTOR DERECHO - Ajustar si el robot gira hacia la IZQUIERDA
int velocidadMotorB = 255; // MOTOR IZQUIERDO - Ajustar si el robot gira hacia la DERECHA
// ===============================
// TIEMPO DE ESPERA AL INICIAR
// ===============================
// Tiempo en milisegundos
// 0 = sin espera
// 1000 = 1 segundo
// 3000 = 3 segundos
// 5000 = 5 segundos
unsigned long tiempoEsperaInicio = 0;
// ===============================
// PINES DE LOS MOTORES
// ===============================
int motB0 = 2;
int motB1 = 3; // PWM
int motA1 = 4;
int motA0 = 5; // PWM
// ===============================
// SENSORES DE LÍNEA
// ===============================
int sensorleft = A7;
int sensorcenter = A6;
int sensorright = A5;
long cont1 = 0;
int l1 = 0;
int l2 = 0;
int l3 = 0;
int f1 = 0;
int f2 = 0;
int f3 = 0;
int f4 = 0;
int f5 = 0;
int f6 = 0;
// ===============================
// BUZZER
// ===============================
int buzzer = 6; // El pin al que se conecta el buzzer es el 6
// ===============================
// SENSOR ULTRASÓNICO
// ===============================
int echo = 8;
int triger = 7;
int vel = 200;
// ===============================
// SETUP
// ===============================
void setup()
{
Serial.begin(9600);
pinMode(motA0, OUTPUT);
pinMode(motA1, OUTPUT);
pinMode(motB0, OUTPUT);
pinMode(motB1, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(echo, INPUT);
pinMode(triger, OUTPUT);
digitalWrite(triger, LOW);
digitalWrite(motA0, LOW);
digitalWrite(motA1, LOW);
digitalWrite(motB0, LOW);
digitalWrite(motB1, LOW);
pinMode(sensorright, INPUT);
pinMode(sensorcenter, INPUT);
pinMode(sensorleft, INPUT);
// ===============================
// ESPERA ANTES DE COMENZAR
// ===============================
delay(tiempoEsperaInicio);
}
// ===============================
// LOOP
// ===============================
void loop()
{
l3 = analogRead(sensorleft);
l2 = analogRead(sensorcenter);
l1 = analogRead(sensorright);
if ((l1 > 550 && l2 > 550 && l3 > 550 ||
l1 < 550 && l2 < 550 && l3 < 550) && cont1 > 0)
{
l1 = f1;
l2 = f2;
l3 = f3;
cont1 = cont1 - 1;
}
////////////////////////////////////////////////////////////////////////////
if (l1 > 550 && l2 < 550 && l3 < 550 ||
l1 > 550 && l2 > 550 && l3 < 550)
{
derecha();
}
else if (l1 < 550 && l2 < 550 && l3 > 550 ||
l1 < 550 && l2 > 550 && l3 > 550)
{
izquierda();
}
else if (l1 < 550 && l2 > 550 && l3 < 550)
{
adelanter();
cont1 = 20000; // Numero de ciclos para mantener la memoria
}
else
{
if (l1 > 550 && l2 > 550 && l3 > 550 ||
l1 < 550 && l2 < 550 && l3 < 550)
{
alto();
}
}
///////////////////////////////////////////////////////////////////
f1 = l1;
f2 = l2;
f3 = l3; // memory variables
}
// ===============================
// SENSOR ULTRASÓNICO
// ===============================
long distancia()
{
long t;
long d;
digitalWrite(triger, HIGH);
delayMicroseconds(10);
digitalWrite(triger, LOW);
t = pulseIn(echo, HIGH);
d = t / 59;
if (d <= 1 || d >= 25)
{
d = 1000;
}
delay(10);
return d;
}
// ===============================
// ALTO
// ===============================
void alto()
{
digitalWrite(motA0, 0);
digitalWrite(motA1, 0);
digitalWrite(motB0, 0);
digitalWrite(motB1, 0);
}
// ===============================
// ATRÁS
// ===============================
void atras()
{
digitalWrite(motA0, 1);
digitalWrite(motA1, 0);
digitalWrite(motB1, 1);
digitalWrite(motB0, 0);
}
// ===============================
// ADELANTE CON CONTROL DE VELOCIDAD
// ===============================
void adelante()
{
digitalWrite(motA1, HIGH);
analogWrite(
motA0,
255 - velocidadMotorA
);
digitalWrite(motB0, HIGH);
analogWrite(
motB1,
255 - velocidadMotorB
);
}
// ===============================
// ADELANTE RÁPIDO
// ===============================
// Se conserva porque el LOOP utiliza adelanter().
// Ahora utiliza la función adelante() para aplicar
// el control de velocidad.
void adelanter()
{
adelante();
}
// ===============================
// ADELANTE SUAVE
// ===============================
void adelantes()
{
digitalWrite(motA1, 1);
analogWrite(motA0, 80);
digitalWrite(motB0, 1);
digitalWrite(motB1, 0);
}
// ===============================
// IZQUIERDA
// ===============================
void izquierda()
{
digitalWrite(motA0, 0);
digitalWrite(motA1, 1);
digitalWrite(motB0, 0);
digitalWrite(motB1, 0);
}
// ===============================
// DERECHA
// ===============================
void derecha()
{
digitalWrite(motA1, 0);
digitalWrite(motA0, 0);
digitalWrite(motB0, 1);
digitalWrite(motB1, 0);
}
// ===============================
// ATRÁS DERECHA
// ===============================
void atrasderecha()
{
digitalWrite(motA0, 0);
digitalWrite(motA1, 0);
digitalWrite(motB0, 0);
digitalWrite(motB1, 1);
}
// ===============================
// ATRÁS IZQUIERDA
// ===============================
void atrasizquierda()
{
digitalWrite(motA0, 1);
digitalWrite(motA1, 0);
digitalWrite(motB0, 0);
digitalWrite(motB1, 0);
}