[SOLUCIONADO] Robot 4x4 con L293D y HC-SR04 con un servo

Hola, buenos días
Me he embarcado en el proyecto de montar un Robot 4x4 con L293D y HC-SR04 con un servo.
De momento me ha llegado el todo menos el kit del sensor ultrasónico HC-SR04 con el servo.
He realizado el montaje del chasis con éxito.
He realizado pruebas del funcionamiento de los motores (avance, retroceso y giros izq y drch) todo con éxito. Ahora mientras espero que me llegue el resto del pedido me estoy informando del montaje del mismo. Y me doy cuenta que con el Arduino Uno y con el Shield L293D no se donde conectar el sensor HC-SR04, he navegado varias horas por la red y lo único que he encontrado es una sugerencia de soldar unos pines a la placa L293D, sabiendo que pines quedan libres, para poder conectar el sensor. Pero no explica como hacerlo paso a paso, ya que es una cosa delicada.

Alguien me puede echar una mano
Orientandome, informandome donde puedo encontrar dicha información. O si mejor hacer otro tipo de montaje con una placa...si es así, cuál

Un saludo y un gracias por anticipado.

como no pongas un enlace de la placa que has comprado complicado

Hola, toda la razón tienes...

Tampoco, encuentro el datasheet de esta placa.

No es esa exactamente, que al final la compre de GearBest, perdona.

http://www.gearbest.com/other-accessories/pp_218079.html

pues según veo todos los pines digitales están ocupados, menos el 13 y el 2, pero en estos tendrias que soldar cables

Puedes usar dos pines analógicos cuales sean que la placa los tiene en unos pads que han dejado expresamente para que sea fácil de soldar

Gracias, por responder.

Estaba buscando y he encontrado este video ahora mismo en el cual veo que han soldado unos pines al shield pero no veo exactamente donde.

Tema soldar, no tengo mucha experiencia en lo de soldar, se trataría de soldar unos pines encima de la shield,no?

Aqui he he subido unas imagenes de mi shield L293D

Así, tengo que averiguar en que pines exactamente tengo que soldar los pines, no es asi?

Me he olvidado de poner el enlace al video.

no, puedes usar lo agujeros que hay en las A0..5

Entiendo que tengo que soldar;

1º pin en 5v (el agujero delante del condensador marcado como 5V)
2º pin en GND (el agujero delante del condensador marcado como GND)
3º y 4º en los pines Analogicos (A0 al A5) donde conectaría el Trig y el Echo

es correcto?

En el video hay enlaces a todas las librerías, al código que esta usando.
Tienes documentación suficiente para resolver todo.

GO_zalo:
no, puedes usar lo agujeros que hay en las A0..5

A0..5 es una manera corta para referirme a cualquier pin entre el 0 y el 5

Según el código que te he puesto de tu video que no se si has visto y descargado.

#define Trig 13
#define Echo 10
AF_DCMotor motor2(2);
AF_DCMotor motor4(4);
servo.attach(9);

Tiene razón Go_zalo, pines 13 y 2 libres. No entiendo como lo hizo el ruso del video?
Acá se ve el esqumea del SHIELD L293D


Los pines en uso son
12 DIR_LATCH 595
11 PWM2A
10 PWM1B 16bits PWM si no se usa esta libre
09 PWM1A 16bits PWM si no se usa esta libre
08 DIR_SER 74595
07 DIR_EN 74595
06 PWM0A
05 PWM0B
04 DIR_CLK 74595
03 PWM2B
02

Con los jumpers en la posición baja, no se usan PWM1A y 1B y quedan libres 10 y 9 como el usa.
Me falta justificar el pin 4 que veo en el código

Buenas tardes, Go_zalo y Surbyte gracias por vuestra ayuda.

"Con los jumpers en la posición baja" a que te refieres, perdona mi poco entender.

buscaste en Google esto : Arduino Shield L293D
lo primero que encuentro es

El conector esta arriba a la izquierda.
Mira esta documentación en el Playground de Arduino

Buenas, gracias por toda la información
Como soy nuevo en esto del Arduino, me he bajado manuales en español y he realizado proyectos de www.prometec.net, www.elcajondeardu.blogspot.com.es y otras muchas, sobre leds, botones, sensor de temperatura, sensor de infrarojos, sensor de ultrasonico, zumbadores, hasta he cogido el mando de la TV con el cual encendia o apaga leds... y poco a `poco voy enterandome un poco más pero quiero comprender lo que hago y estar seguro que es lo correcto por eso puede ser que haga preguntas básicas de cosas que no acabo de entender.

Creo haber sacado en claro que tengo que soldar 4 pines. donde?
TRIG y ECHO los puedo poner en los analógicos y tambien el 13 y 2 de los digitales.
Lo del 10 y 9 no lo entiendo.
5v y GND los tengo que soldar en los agujeros marcados como 5V y GND.

mi modulo L293D

Si no es correcto decidmelo.
Espero vuestra repuesta antes de hacer nada más.

En serio, gracias por vuestra ayuda

Creo que deberías hacer primero un Tutorial sobre el uso del sensor de ultrasonidos solo, conectándolo directamente al arduino por que creo que no tienes muy claro como funciona

Una vez lo tengas puedes añadir tu shield y cambiar el programa para adaptarlo a los pones que quieras usar para el trig y el echo

Lo del 9 y el 10 olvídalo... Ha reutilizado pines que están ocupados por el Shield de motores y no sabemos bien como...

Si quieres soldar sobre los agujeros fácilmente usa para trig y para echo a0 y a1 por ejemplo no hay ninguna diferencia que usar 2 y 13 si no vas a meter muchos sensores analógicos

2 y 13 te sirven pero es dificil soldar (bueno en realidad es muy fácil si tienes algo de experiencia)

Lo del 9 y el 10 olvídalo... Ha reutilizado pines que están ocupados por el Shield de motores y no sabemos bien como..

Me quedé con las ganas de lo que quisiste decir Go_zalo
no sabemos bien como ... van a funcionar?

Que no se colocan hecho para reutilizar pines sin que afecte a los motores, pero vamos que tampoco lo he mirado en detalle igual son los controles de los servo o de los pap y no los esta usando

GO_zalo, gracias por el consejo, así lo haré.

Lo de soldar, he soldado al pin 13 (encima) y al pin 2 (en el agujero).
El pin 13, no ha quedado muy bien, de momento funciona, pero lo más seguro
es que lo cambie a un pin analógico.

Ya he probado el código del shield, mi niño (3años) flipaba un poco más y me lo pisa :slight_smile:
Ahora, investigaré el código para ultrasónico con el servo y después lo intentaré copilar
todo junto.

Gracias, a los dos por vuestra inestimable ayuda.

Ya os digo cosas de como me va.

:slight_smile: :wink:

Buenos dias,

Estoy luchando con el sketch.

He realizado el siguiente sketch para mi robot 4x4, pero en la linea dentro del void loop()
MirarFrente(); me da error a la hora de verificar el código, que hago mal?

#include <Ultrasonic.h>  // Llama a la librería del sensor ultrasónico HC-SR04
#include <AFMotor.h>     // Llama a la librería del Shield L293D
#include <Servo.h>       // 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

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();
    }
  }
}
unsigned 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;
/*
  Serial.print("Distancia  ");
  Serial.print(distancia);
  Serial.print("cm");
  Serial.println();
  delay(1000);
*/

/*
  // Convertir microsegundos a pulgadas
  pulgadas = microsegundosApulgadas(tiempo);
  cm = microsegundosAcentimetros(tiempo);
}
long microsegundosApulgadas(long microsegundos) // convierte el tiempo en distancia
{
  return microsegundos / 74 / 2;
}
long microsegundosAcentimetros(long microsegundos) // convierte el tiempo en distancia
{
  return microsegundos / 29 / 2;
}
*/

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);
}

Les agradecería cualquier ayuda, sugerencia

Un saludo,