Ir al contenido principal

Robot 4x4 Arduino


Me compre el chasis en la web GearBest (con los motores y ruedas incluidas), despues realice el montaje con un Arduino Uno, una shield L293N, un sensor ultrasónico HC-SR04 con un micro servo.
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      // Llama a la librería del Shield L293D
#include        // Llama a la librería del Servo

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

φιλοσοφία ha dicho que…
Hola, podrías explicar como realizar las colecciones de los motores, el debo, y el ultrasónico. Gracias

Entradas populares de este blog

Shield L293D

Algún que otro problema a la hora de conectarlo...

He conectado los 5v para el arduino y los 9v para el shield L293D el modulo bluetooth no esta encendido ¿? *** SOLUCIONADO, tenia el HC-05 a 9600 en el codigo y estaba configurado a 38400.  Estas son las conexiones realizadas; Pin 2 - el Echo del sensor ultrasonico HC-SR04 Pin 13 - Trig del sensor ultrasonico HC-SR04 Cable Blanco positivo del sensor HC-SR04 Cable Gris negativo del sensor HC-SR04 He realizado unas soldaduras en el Shield L293D, Pin 0 y Pin 1 para el modulo Bluetooth He realizado dos soldaduras para poder conectar el modulo de bluetooth al shield L293D. Positivo y negativo del modulo.