Sensor de aparcamiento- nano + 2 x HC-SR4

Hola a tod@s.

LLevo algún tiempo cacharreando con Arduino, por fin tengo un proyecto serio y desarrollado, pero tengo una duda que espero me podais aclarar.

Por si os interesa el proyecto:

Y no tengo problema en compartir el código, aunque simple me dió algún dolor de cabeza, que uno ya no está para estudiar...

Quiero conectar un arduino nano en el coche, alimentado de la batería.

La batería da 12v teóricos pero con el coche en marcha sube a casi 15v, por eso debo reducir el voltaje, lo tengo claro.

Quiero reducirlo a 9v para que la generación de calor sea mínima en el disipador.( LM7809 )
Si no me queda más remedio reduciré el voltaje a 5v, pero creo que trabajará mejor a 9v, ¿Me equivoco?

Ahora viene la duda.
¿Puedo meter 9v por el mini-usb? ¿Es recomendable - fiable?
¿Puedo hacerlo por los pines 2+ y 6- del ICSP o lo freiré?

Con el UNO no tendría problema, sé que puedo meter 9v por la entrada de alimentación pero el NANO no la tiene.

Saludos!!!!!

A ver.. ya que armas algo, haz que la tensón sea de 7V, usa un LM317 que permite regular cualquier tensión de salida. Yo optaría por alguna fuente de switching que no tiene grandes disipaciones una step-down. Las venden en módulo por todos lados.
Una como esta

que puedes comprar aca

Estas fuentes son Step Down Converter Module LM2596
Es decir, son fuentes de switching (conmutacion) que reciben una tensión mayor a la entrada que a la salida

Entrada DC = 4.0~40
Salida = 1.3-37V Adjustable Voltage Regulator

Se que lo puedes armar pero sabes que pasa, va a calentar, le tienes que encontrar caja, como a esta también, y no te va aquedar bien.

Gracias Surbyte.

Buena recomendación, ya que te pones, hazlo bien.
Ya he comprado el Nano, dos HC-SR04...ponle una fuente decente que no quemes todo.

Los 7V ¿tienen que entrar por el micro-usb o los pines ICSP también están regulados?

Entran por la entrada Vin del NANO. Nunca por 5V nunca por ningun otro lado.
Entre GND y VIN hasta 15V o algo mas pero no es convieniente. Lo convientes son 7V.
Si usas esa fuente, no tendras disipación, te quedará todo profesional.
Otra alternativa es algun adaptador de auto que entregue digamos 9V 500mA pero no se si habrá.

Lo pedís, lo tenés enlace

Gracias de nuevo Surbyte.

Aclarado el asunto de la alimentación.

Me gustaría mejorar el código en los siguientes puntos:

1- Que ambas lecturas sean simultáneas.
2- Que tome como referencia la lectura de menor valor (distancia).
3- Que el testigo sólo muestre la lectura de menor valor.

CODE:

// Pins de Derecha
const int trigger_d = 9;
const int echo_d = 8;

// Pins de Izquierda
const int trigger_i = 6;
const int echo_i = 7;

// Pins del testigo
const int buzzer = 5;
const int verde = 4;
const int amarillo = 3;
const int rojo = 2;

void setup()

{
Serial.begin(9600);

// Configuración de los pines
pinMode(trigger_d, OUTPUT);
pinMode(echo_d, INPUT);

pinMode(verde, OUTPUT);
pinMode(amarillo, OUTPUT);
pinMode(rojo, OUTPUT);
pinMode(buzzer, OUTPUT);

pinMode(trigger_i, OUTPUT);
pinMode(echo_i, INPUT);

}

void loop()
{
float distancia;

// Medida derecha
distancia = medida(trigger_d, echo_d);
// Devuelve el resultado vía UART
Serial.print("Derecha: ");
Serial.println(distancia);

//Condiciones del testigo
//Condicion 1 alarma
if (distancia < 40) {
digitalWrite(rojo, HIGH);
delay(150);
tone (5, 3600, 200);
}
else {
digitalWrite(verde, LOW);
digitalWrite(amarillo, LOW);
}

// condicion 2 precaucion
if (distancia >= 40 && distancia <= 80) {
digitalWrite(amarillo, HIGH);
delay(150);
tone (5, 250, 50);
}
else {
digitalWrite(verde, LOW);
digitalWrite(rojo, LOW);
}

// condicion 3 calma
if (distancia >80) {
digitalWrite(verde, HIGH);
}
else {
digitalWrite(amarillo, LOW);
digitalWrite(rojo, LOW);
}
delay(300);

// Medida izquierda
distancia = medida(trigger_i, echo_i);
// Devuelve el resultado vía UART
Serial.print("Izquierda: ");
Serial.println(distancia);

//Condiciones del testigo
//Condicion 1 alarma
if (distancia < 40) {
digitalWrite(rojo, HIGH);
delay(150);
tone (5, 3600, 200);
}
else {
digitalWrite(verde, LOW);
digitalWrite(amarillo, LOW);
}

//Condicion 2 precaucion
if (distancia >= 40 && distancia <= 80) {
digitalWrite(amarillo, HIGH);
delay(150);
tone (5, 250, 50);
}
else {
digitalWrite(verde, LOW);
digitalWrite(rojo, LOW);
}

//Condicion 3 calma
if (distancia >80) {
digitalWrite(verde, HIGH);
}
else {
digitalWrite(amarillo, LOW);
digitalWrite(rojo, LOW);
}
delay(300);
}

float medida(int trigger, int echo) // Función de ejecución de medida
{
// Trigger inicial
digitalWrite(trigger, LOW);
delayMicroseconds(5);

// Comienzo de la medida
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);

// Adquisición y conversión a metros
float distancia = pulseIn(echo, HIGH);
distancia = distancia * 0.01657;
return distancia;

}

// A mejorar:
// 1- Que las dos lecturas sean simultáneas.
// 2- Que sólo tome el valor de la lectura menor.
// 3- Que la lectura menor sea reflejada en el testigo.

Gracias!!

Edito mi respuesta porque me di cuenta que tu título nada tiene que ver tu proyecto.
Duda alimentación arduino no se identifica con lo que estamos discutiendo.
Ahora va mi respuesta.

Bueno mi amigo, por lo que veo tienes mi problema de hace 5 años atras.
Y es querer reinventar la rueda a cada momento.
La rutina para usar un ultrasónico esta hecha, porque es como el 3er código que veo que quieren hacerla de nuevo y claro presenta problemas?
La intención está, pero que mejor que usar algo probado?

New Ping Library
Usa esa librería y se te va a simplificar el desarrollo.

Ahora veo tus consultas

Por lo visto es algún tipo de detector de estacionamiento con dos sensores ultrasónicos Derecho e Izquierdo.
Aca he modificado el ejemplo de 15 sensores para tu ejemplo.
La única duda que no he corregido son los delays que estan en tus condiciones de precaución.
La suma de ellas estas muy cerca del tiempo máximo de lo que tarda un sensor en devolver su información.
Como funciona por timer, hay que liberar la ejecución para que pueda seguir midiendo.
Probalo a ver si se acerca a o que necesitas.
Seguramente puede tener errores.

// ---------------------------------------------------------------------------
// This example code was used to successfully communicate with 15 ultrasonic sensors. You can adjust
// the number of sensors in your project by changing SONAR_NUM and the number of NewPing objects in the
// "sonar" array. You also need to change the pins for each sensor for the NewPing objects. Each sensor
// is pinged at 33ms intervals. So, one cycle of all sensors takes 495ms (33 * 15 = 495ms). The results
// are sent to the "oneSensorCycle" function which currently just displays the distance data. Your project
// would normally process the sensor results in this function (for example, decide if a robot needs to
// turn and call the turn function). Keep in mind this example is event-driven. Your complete sketch needs
// to be written so there's no "delay" commands and the loop() cycles at faster than a 33ms rate. If other
// processes take longer than 33ms, you'll need to increase PING_INTERVAL so it doesn't get behind.
// ---------------------------------------------------------------------------
#include <NewPing.h>

#define SONAR_NUM     2 // Number of sensors.
#define MAX_DISTANCE 200 // Maximum distance (in cm) to ping.
#define PING_INTERVAL 33 // Milliseconds between sensor pings (29ms is about the min to avoid cross-sensor echo).

unsigned long pingTimer[SONAR_NUM]; // Holds the times when the next ping should happen for each sensor.
unsigned int cm[SONAR_NUM];         // Where the ping distances are stored.
uint8_t currentSensor = 0;          // Keeps track of which sensor is active.

// Pins del testigo
const int buzzer = 5;
const int verde = 4;
const int amarillo = 3;
const int rojo = 2;

NewPing sonar[SONAR_NUM] = {     // Sensor object array.
                                 // Each sensor's trigger pin, echo pin, and max distance to ping.
  NewPing(8, 9, MAX_DISTANCE),   // Sensor derecho sonar[0} 
  NewPing(6, 7, MAX_DISTANCE)    // sensor izquierdo sonar[1]
};

void setup() {
  Serial.begin(9600);
  pingTimer[0] = millis() + 75;           // First ping starts at 75ms, gives time for the Arduino to chill before starting.
  for (uint8_t i = 1; i < SONAR_NUM; i++) // Set the starting time for each sensor.
    pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;
  pinMode(verde, OUTPUT);
  pinMode(amarillo, OUTPUT);
  pinMode(rojo, OUTPUT);
  pinMode(buzzer, OUTPUT);

}

void loop() {
  for (uint8_t i = 0; i < SONAR_NUM; i++) {       // Loop through all the sensors.
    if (millis() >= pingTimer[i]) {               // Is it this sensor's time to ping?
      pingTimer[i] += PING_INTERVAL * SONAR_NUM;  // Set next time this sensor will be pinged.
      if (i == 0 && currentSensor == SONAR_NUM - 1) 
          oneSensorCycle();                       // Sensor ping cycle complete, do something with the results.
      sonar[currentSensor].timer_stop();          // Make sure previous timer is canceled before starting a new ping (insurance).
      currentSensor = i;                          // Sensor being accessed.
      cm[currentSensor] = 0;                      // Make distance zero in case there's no ping echo for this sensor.
      sonar[currentSensor].ping_timer(echoCheck); // Do the ping (processing continues, interrupt will call echoCheck to look for echo).
    }
  }
  
}

void echoCheck() { // If ping received, set the sensor distance to array.
  if (sonar[currentSensor].check_timer())
    cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM;
}

void oneSensorCycle() { // Sensor ping cycle complete, do something with the results.
  char str[20];
  // The following code would be replaced with your code that does something with the ping results.
  for (uint8_t i = 0; i < SONAR_NUM; i++) {
    sprintf(str, " %d = %d cm", i, cm[i]);
    Serial.print(str);
    alarma(i);
  }
  Serial.println();
  
}

void alarma(int sensor) {
//Condiciones del testigo 
//Condicion 1 alarma
  if (cm[sensor] < 40) {  
    digitalWrite(rojo, HIGH); 
    delay(150);             // hay que eliminar este delay
    tone (5, 3600, 200);
  }
  else {
    digitalWrite(verde, LOW);
    digitalWrite(amarillo, LOW);
  }
  
  // condicion 2 precaucion
  if (cm[sensor] >= 40 && cm[sensor] <= 80) {
    digitalWrite(amarillo, HIGH);
    delay(150);                // hay que eliminar este delay
    tone (5, 250, 50);
  }
  else {
    digitalWrite(verde, LOW);
    digitalWrite(rojo, LOW);
  } 
  
  // condicion 3 calma
  if (cm[sensor] >80) {
     digitalWrite(verde, HIGH);
  }
  else {
     digitalWrite(amarillo, LOW);
     digitalWrite(rojo, LOW);
  }  
  delay(300); // hay que eliminar este delay
}

Gracias de nuevo Surbyte.

Voy comprendiendo el código, pero no consigo incorporar el tono (tone)

core.a(Tone.cpp.o): In function __vector_7': C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/Tone.cpp:535: multiple definition of __vector_7'
NewPing\NewPing.cpp.o:C:\Users\Jose\Documents\Arduino\libraries\NewPing/NewPing.cpp:214: first defined here

Es porque ambos intentan usar el mismo timer, el timer 2.
Intenta con esta librería de tonos que usa otro timer, justamente el 1

Acá una solución sin cambiar nada mas que la libreria ultrasónica New_Ping
**HELP - Multiple Definition of vector_7' Error When Compiling** AYUDA - Multiple Definicion del vector_7' Error cuando compilamos.

SIN EMBARGO Y LO PONGO EN MAYUSCULAS: ESTE CODIGO SI USA TIMER2 del ULTRASONICO ASI QUE LA SOLUCION NO NOS SIRVE

Un problema común cuando usamos NewPing es obtener un error de compilación `vector_7'. Lo que este error significa es que Ud. esta usando dos librerías que estan tratando de usar el timer 2. El falla con el timer 2 es solo para NewPing si usamos el metodo de interrupción de timer. Si usas los métodos standars ping(), ping_in(), ping_cm(), or ping_median(), NewPing no esta usando el timer2. Sin embargo, el compilador no es tan inteligente para saber que no estas usando esas interrupciones. Entonces recibes ese error si cualquier otra librería intenta usar el timer2.

Hay una solución simple siempre y cuando no uses ping_timer(). Cambiar en NewPing.cpp y comentar los llamados al timer 2. Encuentras esta sección alrededor de las lineas 210 - 216 en la version 1.5: (ATENCIÖN PORQUE NOSOTROS SI USAMOS TIMER2 del ULTRASONICO ASI QUE NO USES ESTO)

#if defined (__AVR_ATmega32U4__) // Use Timer4 for ATmega32U4 (Teensy/Leonardo).
ISR(TIMER4_OVF_vect) {
#else
ISR(TIMER2_COMPA_vect) {
#endif
       if(intFunc) intFunc(); // If wrapped function is set, call it.
}

Comment it all out like this:

/*
#if defined (__AVR_ATmega32U4__) // Use Timer4 for ATmega32U4 (Teensy/Leonardo).
ISR(TIMER4_OVF_vect) {
#else
ISR(TIMER2_COMPA_vect) {
#endif
       if(intFunc) intFunc(); // If wrapped function is set, call it.
}
*/

That's it! Also, if the conflict is with the tone library, you can use a different tone library that doesn't use timer 2. I've created a couple tone replacement libraries that not only use timer 1 instead of timer 2 to avoid a conflict, they also have many other advantages:

Ok, ahora me deja compilarlo.
He incluido la librería NewTone y cambiado en el código las instrucciones tone por NewTone.
Mañana pruebo y comento.

El código va tomando forma. :wink:

//Modificado Surbyte

#include <NewPing.h>
#include <NewTone.h>

#define SONAR_NUM 2 // Number of sensors.
#define MAX_DISTANCE 200 // Maximum distance (in cm) to ping.
#define PING_INTERVAL 300 // Milliseconds between sensor pings (29ms is about the min to avoid cross-sensor echo).

unsigned long pingTimer[SONAR_NUM]; // Holds the times when the next ping should happen for each sensor.
unsigned int cm[SONAR_NUM];         // Where the ping distances are stored.
uint8_t currentSensor = 0;          // Keeps track of which sensor is active.

// Pins del testigo
const int buzzer = 5;
const int verde = 4;
const int amarillo = 3;
const int rojo = 2;

  NewPing sonar[SONAR_NUM] = {     // Sensor object array.
                                 // Each sensor's trigger pin, echo pin, and max distance to ping.
  NewPing(8, 9, MAX_DISTANCE),   // Sensor derecho sonar[0} 
  NewPing(6, 7, MAX_DISTANCE),    // sensor izquierdo sonar[1]
};

void setup() {
  Serial.begin(9600);
  pingTimer[0] = millis() + 75;           // First ping starts at 75ms, gives time for the Arduino to chill before starting.
  for (uint8_t i = 1; i < SONAR_NUM; i++) // Set the starting time for each sensor.
    pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;
  pinMode(verde, OUTPUT);
  pinMode(amarillo, OUTPUT);
  pinMode(rojo, OUTPUT);
  pinMode(buzzer, OUTPUT);

}

void loop() {
  for (uint8_t i = 0; i < SONAR_NUM; i++) {       // Loop through all the sensors.
    if (millis() >= pingTimer[i]) {               // Is it this sensor's time to ping?
      pingTimer[i] += PING_INTERVAL * SONAR_NUM;  // Set next time this sensor will be pinged.
      if (i == 0 && currentSensor == SONAR_NUM - 1) 
          oneSensorCycle();                       // Sensor ping cycle complete, do something with the results.
      sonar[currentSensor].timer_stop();          // Make sure previous timer is canceled before starting a new ping (insurance).
      currentSensor = i;                          // Sensor being accessed.
      cm[currentSensor] = 0;                      // Make distance zero in case there's no ping echo for this sensor.
      sonar[currentSensor].ping_timer(echoCheck); // Do the ping (processing continues, interrupt will call echoCheck to look for echo).
    }
  }
  
}

void echoCheck() { // If ping received, set the sensor distance to array.
  if (sonar[currentSensor].check_timer())
    cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM;
}

void oneSensorCycle() { // Sensor ping cycle complete, do something with the results.
  char str[20];
  // The following code would be replaced with your code that does something with the ping results.
  for (uint8_t i = 0; i < SONAR_NUM; i++) {
    sprintf(str, " %d = %d cm", i, cm[i]);
    Serial.print(str);
    alarma(i);
  }
  Serial.println();
  
}

void alarma(int sensor) {
//Condiciones del testigo 
//Condicion 1 alarma
  if (cm[sensor] < 40) {  
    digitalWrite(rojo, HIGH); 
    NewTone (5, 3600, 200);
  }
// condicion 2 precaucion
  if (cm[sensor] >= 40 && cm[sensor] <= 80) {
    digitalWrite(amarillo, HIGH);
    NewTone (5, 250, 50);
  }
// condicion 3 calma
  if (cm[sensor] >80) {
     digitalWrite(verde, HIGH);
  }
  
}

Excelente!!! please modifica el título como te pedi en el post #4

Una vez probado presenta algunos problemas.
Comparado con el primer código funciona bastante peor, a pesar de los delays.
Incluso he suprimido los leds, con la señal acústica es suficiente, pero usando NewPing y NewTone una vez que se dispara una alarma queda pitando aunque el obstáculo se aleje, cosa que no ocurre con el código original.

Seguiré probando, aunque para el fin que tiene seguramente use el primer código.

Gracias por el esfuerzo Surbyte.
Una vez esté montado en el coche haré un video decente, para disfrute de quien quiera.

Saludos!!

No hagas todo a la vez
Usa solo la presentación de las distancias para ver como funciona.

Las mediciones son correctas, y simultáneas (o casi), pero si hay dos distancias diferentes envía dos alarmas al buzzer, creo que ése es el problema.
De la otra forma al ser medidas alternativas sólo envía una señal cada turno y los zumbidos son más claros, no quedan trabados.

Seguiré probando, tengo tiempo hasta que lleguen los módulos step down.

edito toda la respuesta porque no tienes sentido.
Encontré un par de errores.
Maravilloso la simulación del sensor Ultrasónico en Proteus.
Bien, acá el código corregido. Tu código tenia algunos fallos.
Simples fallos. Me di cuenta cuando escribiste, se queda encendido con una alarma y nunca cambia.
Pues claro, cuando consultas por

if (dist < 40) {  
    digitalWrite(rojo, HIGH);
    NewTone (5, 3600, 200);
}

nunca apagas dicho led aunque cambie la condición. De manera que cualquier led debe activarse o desactivarse de este modo

if (dist < 40) {  
    digitalWrite(rojo, HIGH);
    NewTone (5, 3600, 200);
} else digitalWrite(rojo, LOW);

Entonces si se cumple la condición el LED se enciende, de lo contrario se apaga.
Además, usamos dos sensores, asi que debemos quedarnos con la distancia minima entre los dos.
Esa distancia es la que activa o no los LEDs en alarma(int dist)

//Modificado Surbyte

#include <NewPing.h>
#include <NewTone.h>

#define SONAR_NUM 2 // Number of sensors.
#define MAX_DISTANCE 200 // Maximum distance (in cm) to ping.
#define PING_INTERVAL 300 // Milliseconds between sensor pings (29ms is about the min to avoid cross-sensor echo).

unsigned long pingTimer[SONAR_NUM]; // Holds the times when the next ping should happen for each sensor.
unsigned int cm[SONAR_NUM];         // Where the ping distances are stored.
uint8_t currentSensor = 0;          // Keeps track of which sensor is active.

// Pins del testigo
const int buzzer = 5;
const int verde = 4;
const int amarillo = 3;
const int rojo = 2;


//NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
  NewPing sonar[SONAR_NUM] = {     // Sensor object array.
                                 // Each sensor's trigger pin, echo pin, and max distance to ping.
  NewPing(8, 9, MAX_DISTANCE),   // Sensor derecho sonar[0} 
  NewPing(6, 7, MAX_DISTANCE),    // sensor izquierdo sonar[1]
};

void setup() {
  Serial.begin(9600);
  pingTimer[0] = millis() + 75;           // First ping starts at 75ms, gives time for the Arduino to chill before starting.
  for (uint8_t i = 1; i < SONAR_NUM; i++) // Set the starting time for each sensor.
    pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;
  pinMode(verde, OUTPUT);
  pinMode(amarillo, OUTPUT);
  pinMode(rojo, OUTPUT);
  pinMode(buzzer, OUTPUT);

}

void loop() {
  for (uint8_t i = 0; i < SONAR_NUM; i++) {       // Loop through all the sensors.
    if (millis() >= pingTimer[i]) {               // Is it this sensor's time to ping?
      pingTimer[i] += PING_INTERVAL * SONAR_NUM;  // Set next time this sensor will be pinged.
      if (i == 0 && currentSensor == SONAR_NUM - 1) 
          oneSensorCycle();                       // Sensor ping cycle complete, do something with the results.
      sonar[currentSensor].timer_stop();          // Make sure previous timer is canceled before starting a new ping (insurance).
      currentSensor = i;                          // Sensor being accessed.
      cm[currentSensor] = 0;                      // Make distance zero in case there's no ping echo for this sensor.
      sonar[currentSensor].ping_timer(echoCheck); // Do the ping (processing continues, interrupt will call echoCheck to look for echo).
    }
  }
  
}

void echoCheck() { // If ping received, set the sensor distance to array.
  if (sonar[currentSensor].check_timer())
    cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM;
}

void oneSensorCycle() { // Sensor ping cycle complete, do something with the results.
  char str[20];
  
  // The following code would be replaced with your code that does something with the ping results.
  for (uint8_t i = 0; i < SONAR_NUM; i++) {
    sprintf(str, " %d = %d cm", i, cm[i]);
    Serial.print(str);
  }
  if (cm[0] < cm[1]) 
      alarma(cm[0]);  // sensor 0 es el menor 
  else
      alarma(cm[1]);  // sensor 1 es el menor
  
  Serial.println();
  
}

void alarma(int dist) {
  char str[30];
  
  //Condiciones del testigo 
  sprintf(str, " Menor distancia = %d cm", dist);
  Serial.print(str);
  digitalWrite(amarillo, HIGH);
  
  if (dist < 40) {  
    digitalWrite(rojo, HIGH);
    NewTone (5, 3600, 200);
  } else digitalWrite(rojo, LOW);
// condicion 2 precaucion
  if (dist >= 40 && dist <= 80) {
    digitalWrite(amarillo, HIGH);
    NewTone (5, 250, 50);
  } else digitalWrite(amarillo, LOW);
// condicion 3 calma
  if (dist > 80) {
     digitalWrite(verde, HIGH);
  } else digitalWrite(verde,LOW);
  
}

Probados ambos códigos sigo con la sensación de que el código original funciona mejor.
Con NewPing queda pitando cuando no detecta obstáculo, pues toma la lectura como 0.
Seguro que es culpa mía pues no termino de comprender bien el código para adaptarlo a lo que necesito, mientras el código original lo tengo controlado.

Lo dicho, cuando lo tenga instalado os pondré un video.
Gracias!!

Así queda el code, eliminados los leds:
Y aquí el video del prototipo: Sensor de aparcamiento - YouTube

const int trigger_d = 8;
const int echo_d = 9;
const int buzz = 5;
const int trigger_i = 6;
const int echo_i = 7;

void setup()

{
  Serial.begin(9600);
 
  // Configuración de los pines
  pinMode(trigger_d, OUTPUT);
  pinMode(echo_d, INPUT);
  pinMode(buzz, OUTPUT);
  pinMode(trigger_i, OUTPUT);
  pinMode(echo_i, INPUT);
}
void loop()
{
  float distancia;
 
  // Medida derecha
  distancia = medida(trigger_d, echo_d);
  // Devuelve el resultado vía UART
  Serial.print("Derecha: ");
  Serial.println(distancia);  
  
  if (distancia <= 60 && distancia >= 20){
  tone (5, 300, 100);
  }
  if (distancia < 20){
  tone (5, 3600, 150);
  } 
    delay(200);
    
    // Medida izquierda
  distancia = medida(trigger_i, echo_i);
  // Devuelve el resultado vía UART
  Serial.print("Izquierda: ");
  Serial.println(distancia);
   if (distancia <= 60 && distancia >= 20){
  tone (5, 300, 100);
  }
  if (distancia < 20){
  tone (5, 3600, 150);
  } 
    delay(200);
}
 
float medida(int trigger, int echo) // Función de ejecución de medida
{
  // Trigger inicial
  digitalWrite(trigger, LOW);
  delayMicroseconds(5);
 
  // Comienzo de la medida
  digitalWrite(trigger, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger, LOW);
 
  // Adquisición y conversión a metros
  float distancia = pulseIn(echo, HIGH);
  distancia = distancia * 0.01657;
  return distancia;
  
 
}

Hola de nuevo, por fín han llegado los dc/dc.

Aún no he terminado el proyecto del asistente de aparcamiento, falta montarlo en el coche, pero debo mirar bien la ubicación de los sensores, desmontar la defensa..........uuuuuuuuf.

Como pedí un lote de cinco reguladores hoy me he entretenido haciendo ésto, seguro que a más de uno os interesa. Una fuente de alimentación regulable de hasta 32v.

Os dejo el enlace a mi blog.

http://blog.pcteknic.es/fuente-de-alimentacion-regulable-low-cost/

Saludos!!!