Alimentando por separado la placa de Arduino y la shield L293N.
Ahora quiero hacer algunas mejoras:
el código usado es:
#include // Llama a la librería del sensor ultrasónico HC-SR04
#include #include
Servo PingServo; // creamos un objeto tipo Servo que llamamos PingServo
AF_DCMotor motor1(1); // Motor 1 - Delante Derecha conectado al Puerto 1
AF_DCMotor motor2(2); // Motor 2 - Delante Izquierda conectado al Puerto 2
AF_DCMotor motor3(3); // Motor 3 - Atrás Izquierda conectado al Puerto 3
AF_DCMotor motor4(4); // Motor 4 - Atrás Derecha conectado al Puerto 4
int minDistGuardada = 15 ; //Declaramos la distancia minima
// Mínima distancia para el sensor ultrasónico de la orden de parar y girar.
int trigger = 13; // trigger conectado al pin 13 digital
int eco = 2; // eco conectado al pin 2 digital
int centroDist, izqDist, drchDist, atrasDist;
// Define variables centro, izq., drch. y atrás para la distancia
long tiempo, distancia; // Define variables para el sensor
long ping;
void setup() {
//pinMode(trigger,OUTPUT); // declaramos el trigger como Salida
//pinMode(eco,INPUT); // declaramos el eco como Entrada
PingServo.attach(10); // El servo está conectado pin 10 del módulo shield
PingServo.write(90); // Centra la posición del servo a 90º
motor1.setSpeed(80); // Configura velocidad motor1 a 180 (de 0 (stop) a 255 (fast)
motor2.setSpeed(80); // Configura velocidad motor2 a 180 (de 0 (stop) a 255 (fast)
motor3.setSpeed(80); // Configura velocidad motor3 a 180 (de 0 (stop) a 255 (fast)
motor4.setSpeed(80); // Configura velocidad motor4 a 180 (de 0 (stop) a 255 (fast)
Serial.begin(9600); // Inicia el monitor serial
Serial.println("Testeamos la comunicación Serial!!!"); // Testea la comunicación al monitor serial
}
void TodoParado() { // Hace que el robot este PARADO
motor1.run(RELEASE); // Motor 1 - Delante Derecha
motor2.run(RELEASE); // Motor 2 - Delante Izquierda
motor3.run(RELEASE); // Motor 3 - Atrás Izquierda
motor4.run(RELEASE); // Motor 4 - Atrás Derecha
}
void TodoAvance() { // Hace que el robot AVANCE
motor1.run(FORWARD); // Motor 1 - Delante Derecha
motor2.run(FORWARD); // Motor 2 - Delante Izquierda
motor3.run(FORWARD); // Motor 3 - Atrás Izquierda
motor4.run(FORWARD); // Motor 4 - Atrás Derecha
Serial.println("Hacia Adelante"); // Escribe en el monitor serial
}
void GirarDerecha() { // Hace que el robot gire a la DERECHA
motor1.run(FORWARD); // Motor 1 - Delante Derecha
motor2.run(BACKWARD); // Motor 2 - Delante Izquierda
motor3.run(BACKWARD); // Motor 3 - Atrás Izquierda
motor4.run(FORWARD); // Motor 4 - Atrás Derecha
delay(1600); // Tiempo requerido para girar a la DERECHA 1.6 seg.
Serial.println("Girando a la Derecha"); // Escribe en el monitor serial
}
void MarchaAtras() { // Hace que el robot vaya marcha ATRÁS
motor1.run(BACKWARD); // Motor 1 - Delante Derecha
motor2.run(BACKWARD); // Motor 2 - Delante Izquierda
motor3.run(BACKWARD); // Motor 3 - Atrás Izquierda
motor4.run(BACKWARD); // Motor 4 - Atrás Derecha
delay(1600); // Tiempo requerido para poner marcha ATRÁS 1.6 seg.
Serial.println("Marcha Atrás"); // Escribe en el monitor serial
}
void GirarIzquierda() { // Hace que el robot gire a la IZQUIERDA
motor1.run(BACKWARD); // Motor 1 - Delante Derecha
motor2.run(FORWARD); // Motor 2 - Delante Izquierda
motor3.run(FORWARD); // Motor 3 - Atrás Izquierda
motor4.run(BACKWARD); // Motor 4 - Atrás Derecha
delay(1600); // Tiempo requerido para girar a la IZQUIERDA 1.6 seg.
Serial.println("Girando a la Izquierda");// Escribe en el monitor serial
}
// Comienza la función para decidir qué hacer
void loop() {
MirarFrente();
Serial.println("Distancia: "); // Imprime una línea en el monitor serial
Serial.print(distancia);
if (distancia >= minDistGuardada) /* Si las pulgadas delante de un objeto
son mayores que o iguales a la distancia mínima salva (11 pulgadas),
reaccionar*/
}
{
TodoAvance(); // Todas las ruedas adelante
delay(110);
}
else // Si no:
{
TodoParado(); // Detener todos los motores
MirarLados(); // Compruebe su entorno para elegir la mejor ruta
if (drchDist > izqDist) // Si la distancia derecha es mayor que la distancia izquierda, girar a la derecha
{
GirarDerecha();
}
else if (izqDist > drchDist) // Si la distancia izquierda es mayor que la distancia derecha, girar a la izquierda
{
GirarIzquierda();
}
else if (izqDist && drchDist < minDistGuardada) // Si la distancia izquierda y derecha es más pequeña que la distancia minima, marcha atrás.
{
MarchaAtras();
}
}
}
long ping() {
pinMode(trigger, OUTPUT); // Declaramos trigger como SALIDA
digitalWrite(trigger, LOW); // Por cuestión de estabilización del sensor lo ponemos en estado BAJO
delayMicroseconds(2); // esperamos 2 microsegundos
digitalWrite(trigger, HIGH); // Envío del pulso ultrasónico, estado ALTO
delayMicroseconds(5); // esperamos 5 microsegundos
digitalWrite(trigger, LOW); // Lo ponemos en estado BAJO
pinMode(eco, INPUT); // Declaramos eco como ENTRADA
tiempo = pulseIn(eco, HIGH); /* Función para medir la longitud del pulso entrante.
Mide el tiempo que transcurrido entre el envío del pulso ultrasónico y cuando
el sensor recibe el rebote, es decir: desde que el pin 2 empieza a recibir el rebote,
HIGH, hasta que deja de hacerlo, LOW, la longitud del pulso entrante*/
distancia=(tiempo/2)29.1;
void MirarFrente() { // Servo mirar al frente
PingServo.write(90); // Posición servo a 90º para mirar al frente.
delay(175);
ping();
}
void MirarLados() { // Servo mira a los lados 180º y 0º
PingServo.write(180); // Posición de 180° - derecha
delay(320);
ping();
drchDist = distancia; // obtiene la distancia a la derecha
PingServo.write(0); // Posición de 0º - izquierda
delay(620);
ping();
izqDist = distancia; // obtiene la distancia a la izquierda
PingServo.write(90); // Posición de 90° (al frente)
delay(275);
// Imprime en el Monitor Serial
Serial.print("Distancia a la Derecha: ");
Serial.print(drchDist);
Serial.println("Distancia a la Izquierda: ");
Serial.println(izqDist);
Serial.println("Distancia en el Centro: ");
Serial.println(centroDist);
}
He visto por youtube que los motores los colocan debajo del chasis, para asi disponer de más espacio para colocarlas baterias.
También quiero poner en los motores los condensadores cerámicos 104 para reducir el ruido.
Como también colocar un pan tilt para que el sensor ultrasónico pueda hacer un barrido hacia abajo.
También he visto que usan baterias de 7,4 a 2200mAh...
ya que las pilas AA se gastan en un periquete.
Comentarios