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
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
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, 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.
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)
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
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
Ahora, investigaré el código para ultrasónico con el servo y después lo intentaré copilar
todo junto.
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);
}