Buenas tardes Sr.,
estoy en un proyecto de la universidad con la aplicación de Arduino y 3 sensores Ping Parallax y he tropezado con una piedra.
Hice un código para 1 sensor Ping de Parallax y 1 Vibrador, el cual se mostraba en el Monitor Serial.
Todo funciona correctamente, pero si intento hacer lo mismo con 3 sensores y 3 vibradores no me funciona. Solamente muestra las medidas del primer sensor y no de los demás.
Llevo mucho tiempo investigando, haciendo pruebas, de que puede ser pero no hay manera... Tengo muy pocos conocimientos de Arduino y es la primera vez que programo para este mismo así que no se muy bien como lo puedo arreglar y les estaría MUY agradecido de saber que puede estar fallando..
El Código es el siguiente:
/*
ÚLTIMA MODIFICACIÓN: 17 DE SEPTIEMBRE DEL 2012, POR ISAAC FERRES MELENDRES
PROYECTO FINAL DE
ISAAC FERRES MELENDRES
DAMIÀ MIGUEL FIGA NOTA: NOS FALTAN PUERTOS LIBRES. SE DEBERÍA AMPLIAR A UN ARDUINO MEGA O A OTRA PLACA ARDUINO.
HABRÍA QUE TENER EN CUENTA LA ALIMENTACIÓN NECESARIA DE SER 1 O 2 ARDUINOS Y FUTURAS
AMPLIACIONES COMO GPS, TRANSFORMADOR DE OCR, ETC.
Codigo PIN para:
3 sensor
3 motores vibrador
El circuito:
- +V connection of the PING))) attached to +5V
- GND connection of the PING))) attached to ground
- SIG connection of the PING))) attached to digital pin 7
Estas constantes no cambian. */
// Vibradores conectados al PIN correspondiente y a GND
int vibrador = 13;
int vibrador2 = 12;
int vibrador3 = 8;
//Sensores de ultrasonido
const int pingPin = 7;
const int pingPin2 = 4;
const int pingPin3 = 2;
void setup()
{
// Iniciamos la comunicación por serial:
Serial.begin(14400);
}
void loop()
{
/* Establevemos variables para la duración del ping
y mostramos el resultado de la distancia en centrimetros*/
//Distancia espacio/tiempo
long duration, duration2, duration3, cm, cm2, cm3;
/*Dentro del Loop vamos a activar los vibradores
en las distancias correspondientes */
// ----------PING 1-------
// The PING))) envia un pulso alto (HIGH) con duracion de 2 microsegundos.
// Luego envia un pulso bajo (LOW) para hacer una limpieza del pulso alto (LOW)
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);
// ----------PING 2-------
// The PING))) envia un pulso alto (HIGH) con duracion de 2 microsegundos.
// Luego envia un pulso bajo (LOW) para hacer una limpieza del pulso alto (LOW)
pinMode(pingPin2, OUTPUT);
digitalWrite(pingPin2, LOW);
delayMicroseconds(2);
digitalWrite(pingPin2, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin2, LOW);
// ----------PING 3-------
// The PING))) envia un pulso alto (HIGH) con duracion de 2 microsegundos.
// Luego envia un pulso bajo (LOW) para hacer una limpieza del pulso alto (LOW)
pinMode(pingPin3, OUTPUT);
digitalWrite(pingPin3, LOW);
delayMicroseconds(2);
digitalWrite(pingPin3, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin3, LOW);
//Especificamos los vibradores como salida de datos
pinMode(vibrador,OUTPUT);
pinMode(vibrador2,OUTPUT);
pinMode(vibrador3,OUTPUT);
//Especificamos los sensores como entrada de datos
pinMode(pingPin,INPUT);
duration = pulseIn(pingPin,HIGH);
cm = microsecondsToCentimeters(duration);
pinMode(pingPin2,INPUT);
duration = pulseIn(pingPin2, HIGH);
cm2 = microsecondsToCentimeters2(duration);
pinMode(pingPin3,INPUT);
duration = pulseIn(pingPin3, HIGH);
cm3 = microsecondsToCentimeters3(duration);
// VIBRADOR 1 (DELANTERO)
//Si Sensor 1 es menor a 50cm y mayor a 10cm activamos Vibrador 1.
if((cm>=10)&&(cm<=60))
{
digitalWrite(vibrador,HIGH);
}
else
{
digitalWrite(vibrador,LOW);
}
// VIBRADOR 2 (DERECHO)
//Si Sensor 1 es menor a 50cm y mayor a 10cm activamos Vibrador 1.
if((cm2>=10)&&(cm2<=60))
{
digitalWrite(vibrador2,HIGH);
}
else
{
digitalWrite(vibrador2,LOW);
}
// VIBRADOR 3 (IZQIUERDO)
//Si Sensor 1 es menor a 50cm y mayor a 10cm activamos Vibrador 1.
if((cm3>=10)&&(cm3<=60))
{
digitalWrite(vibrador3,HIGH);
}
else
{
digitalWrite(vibrador3,LOW);
}
Serial.print(cm);
Serial.print("cm");
Serial.print(" ");
Serial.print(cm2);
Serial.print("cm2");
Serial.print(" ");
Serial.print(cm3);
Serial.print("cm3");
Serial.println();
//Tiempo de muestreo expresado en milisegundos
delay(10);
} //Cerramos el LOOP
//Convertimos las medidas de microsegundos a centimetros
long microsecondsToCentimeters(long microseconds)
{
// The speed of sound is 340 m/s or 29 microseconds per centimeter.
// The ping travels out and back, so to find the distance of the
// object we take half of the distance travelled.
return microseconds / 29 / 2;
}
long microsecondsToCentimeters2(long microseconds)
{
// The speed of sound is 340 m/s or 29 microseconds per centimeter.
// The ping travels out and back, so to find the distance of the
// object we take half of the distance travelled.
return microseconds / 29 / 2;
}
long microsecondsToCentimeters3(long microseconds)
{
// The speed of sound is 340 m/s or 29 microseconds per centimeter.
// The ping travels out and back, so to find the distance of the
// object we take half of the distance travelled.
return microseconds / 29 / 2;
}
Aquí un video demostrativo:
Otro problema también es que tarda MUCHO en muestrear cuando están los 3 sensores Ping puestos, y no como cuando solamente tengo 1 Ping que tarda 10mseg. Mi pregunta respecto a eso es, se podría mejorar la velocidad de muestreo con los 3 Ping cambiando la Placa Arduino UNO por un Arduino MEGA o superior?
Muchísimas gracias de nuevo!