Parte 1
Bueno, lo prometido es deuda, aunque tarde..
Aquí está todo el código del proyecto, por si a alguien le puede servir.
Cada trozo de código tiene comentada su función.
/*
ÚLTIMA MODIFICACIÓN: 25 DE FEBRERO DEL 2012, POR ISAAC FERRES MELENDRES
PROYECTO FINAL DE
ISAAC FERRES MELENDRES
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
// Estos pines estan conectados a PWM ya que son analalogicos y nos permite modificar los pulsos de energia
// http://arduino.cc/es/Tutorial/PWM y http://arduino.cc/es/Tutorial/SecretsOfArduinoPWM
//Vibradores
int vibrador = 11;
int vibrador2 = 10;
int vibrador3 = 9;
//Sensores de ultrasonido
const int pingPin = 7;
const int pingPin2 = 4;
const int pingPin3 = 2;
//Zumbador
int zumbador = 6;
void setup()
{
// Iniciamos la comunicación por serial:
Serial.begin(14400);
//Especificamos el zumbador como salida de datos
pinMode(zumbador, OUTPUT);
//Especificamos los vibradores como salida de datos
pinMode(vibrador,OUTPUT);
pinMode(vibrador2,OUTPUT);
pinMode(vibrador3,OUTPUT);
}
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);
//Especificamos los sensores como entrada de datos
pinMode(pingPin,INPUT);
duration = pulseIn(pingPin,HIGH);
cm = microsecondsToCentimeters(duration);
// ----------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);
//Especificamos los sensores como entrada de datos
pinMode(pingPin2,INPUT);
duration2 = pulseIn(pingPin2, HIGH);
cm2 = microsecondsToCentimeters2(duration2);
// ----------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 sensores como entrada de datos
pinMode(pingPin3,INPUT);
duration3 = pulseIn(pingPin3, HIGH);
cm3 = microsecondsToCentimeters3(duration3);
//----------------------------------------
// VIBRADOR 1 (DELANTERO)
//----------------------------------------
//Si Sensor 1 es menor a 50cm y mayor a 10cm activamos Vibrador 1.
//Si esta entre 10cm y 60cm
if((cm>=10)&&(cm<=60))
{
// Si esta entre 25cm y 60cm
if((cm>=25)&&(cm<=60))
{
//Si esta entre 45cm y 60cm
if((cm>=45)&&(cm<=60))
{
for(int fadeValue = 0 ; fadeValue <= 64; fadeValue +=5)
{
analogWrite(vibrador, fadeValue);
analogWrite(zumbador, fadeValue);
digitalWrite(zumbador, HIGH); // enciende el zumbador (on)
delay(40); // espera 0,4seg.
digitalWrite(zumbador, LOW); // apaga el zumbador (off)
delay(40); // espera 0,4seg
}
}
else
{ //Si NO esta entre 45cm y 60cm, esta entre 25cm y 45cm
for(int fadeValue = 0 ; fadeValue <= 127; fadeValue +=5)
{
analogWrite(vibrador, fadeValue);
analogWrite(zumbador, fadeValue);
digitalWrite(zumbador, HIGH); // enciende el zumbador (on)
delay(20); // espera 0,2seg.
digitalWrite(zumbador, LOW); // apaga el zumbador (off)
delay(20); // espera 0,2seg.
}
}
}
else
{
//Si NO esta entre 25cm y 60cm, esta entre 10cm y 25cm
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5)
{
analogWrite(vibrador, fadeValue);
analogWrite(zumbador, fadeValue);
digitalWrite(zumbador, HIGH); // enciende el zumbador (on)
delay(10); // espera 0,1seg.
digitalWrite(zumbador, LOW); // apaga el zumbador (off)
delay(10); // espera 0,1seg.
}
}
}
else
{
//Si NO esta entre 10cm y 60cm, esta a menos de 10cm o a mas de 60cm, APAGAMOS vibrador.
for(int fadeValue = 0 ; fadeValue <= 0; fadeValue +=5)
{
analogWrite(vibrador, fadeValue);
analogWrite(zumbador, fadeValue);
}
}
PD: Como bien dicen los expertos (y no es ironía ^_^) el código se puede mejorar bastante mediante funciones, pero yo no se más ni tengo más tiempo, así que así os lo entrego.
Espero que a alguien le pueda servir.
Un saludo y muchas gracias de nuevo a tod@s los que habéis echo posible que apruebe el proyecto 