Pages: [1] 2   Go Down
Author Topic: Problema con 3 sensores Ping Parallax  (Read 3299 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

http://youtu.be/7lWpZMIzZqA

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!
Logged

0
Offline Offline
Edison Member
*
Karma: 17
Posts: 1413
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

duration = pulseIn(pingPin,HIGH);
  cm = microsecondsToCentimeters(duration);
 
has olvidado poner duration1 cm1 duration2 cm2 ... en estas dos lineas
Logged

* Si preguntas, pon el código de tu programa, hace mucho mas fácil ayudarte. Y me ahorro un mensaje pidiendo que lo hagas.
* Si consigues solucionar tu problema, dedica unos minutos a explicar en tu post como lo conseguiste para beneficio de todos.
* Cambia el 'Subject' de tu hilo y añade 'SOLUCIONADO' cuando hayas llegado a una solución al problema que planteaste.
* Utiliza un 'Subject' para tu hilo que explique de que va el hilo.
Si estas empezando:
* Comienza a usar Arduino
* Guías de iniciación a Arduino
* Ejemplos
* Referencia del Lenguaje
* Conceptos básicos
Guia de usuario de arduino
Tutoriales en Ingles
Si necesitas que alguien te escriba el código: http://www.freelancer.com/  o esta  http://www.guru.com/

0
Offline Offline
Edison Member
*
Karma: 17
Posts: 1413
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

la placa arduino uno y arduino mega son igual de rapidas. no solucionaras nada poniendo el mega.
no consigo ver porque te va mas lento, pero creo que es por el pulseIn.

deberias hacer una funcion que incluya el codigo de muestrear un ultrasonidos, a esa funcion le pasas como parametro el numero del pin donde esta conectado y que te devuelva la duración. así puedes tener cuantos sensores quieras sin tener que repetir todo el codigo. ademas creo que has separado el pulsein de el codigo del que encabezas como "   // ----------PING 1-------" y creo que esta mal hecho. debe estar todo seguido.
« Last Edit: February 10, 2013, 04:02:37 pm by Sergegsx » Logged

* Si preguntas, pon el código de tu programa, hace mucho mas fácil ayudarte. Y me ahorro un mensaje pidiendo que lo hagas.
* Si consigues solucionar tu problema, dedica unos minutos a explicar en tu post como lo conseguiste para beneficio de todos.
* Cambia el 'Subject' de tu hilo y añade 'SOLUCIONADO' cuando hayas llegado a una solución al problema que planteaste.
* Utiliza un 'Subject' para tu hilo que explique de que va el hilo.
Si estas empezando:
* Comienza a usar Arduino
* Guías de iniciación a Arduino
* Ejemplos
* Referencia del Lenguaje
* Conceptos básicos
Guia de usuario de arduino
Tutoriales en Ingles
Si necesitas que alguien te escriba el código: http://www.freelancer.com/  o esta  http://www.guru.com/

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muchísimas gracias Sergegsx, le echaré un vistazo revisando lo que me has dicho y contaré el que :-)
La verdad es que si lo soluciono me alegras la vida, porque me va la nota final de proyecto...  smiley-sweat
Logged

0
Offline Offline
Edison Member
*
Karma: 17
Posts: 1413
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Seguro que lo arreglas.
Avisame si no te funciona y te ayudo,  es facil
Logged

* Si preguntas, pon el código de tu programa, hace mucho mas fácil ayudarte. Y me ahorro un mensaje pidiendo que lo hagas.
* Si consigues solucionar tu problema, dedica unos minutos a explicar en tu post como lo conseguiste para beneficio de todos.
* Cambia el 'Subject' de tu hilo y añade 'SOLUCIONADO' cuando hayas llegado a una solución al problema que planteaste.
* Utiliza un 'Subject' para tu hilo que explique de que va el hilo.
Si estas empezando:
* Comienza a usar Arduino
* Guías de iniciación a Arduino
* Ejemplos
* Referencia del Lenguaje
* Conceptos básicos
Guia de usuario de arduino
Tutoriales en Ingles
Si necesitas que alguien te escriba el código: http://www.freelancer.com/  o esta  http://www.guru.com/

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Lo solucioné como tu dijiste.
Había una variable mal declarada y además ahora va a la velocidad correcta debido a que el PulseIn va donde le corresponde:

/*
                Ú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);
 
    //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);

 

   
    //Especificamos los vibradores como salida de datos
  pinMode(vibrador,OUTPUT);
  pinMode(vibrador2,OUTPUT);
  pinMode(vibrador3,OUTPUT);
 
 
     //         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;
}


De todas formas ahora se está subiendo un video donde se puede ver claramente :-)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Aquí el video con el código reparado:

http://youtu.be/hw2G-qSXjOM
« Last Edit: February 12, 2013, 10:32:36 am by malcolm_1988 » Logged

0
Offline Offline
Edison Member
*
Karma: 17
Posts: 1413
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Eso es el mejor agradecimiento que he visto en un foro en mi vida jeje

Me alegro que ya te funcione.
Recuerda lo que te dije de crear una función, vas a mejorar muchisimo tu codigo y podras añadir mas sensores con tan solo un par de lineas.

necesitaras crear una función así:
Code:
long UltrasonidosDuration(int Trig_pin)
{
  digitalWrite(Trig_pin, LOW);
  delayMicroseconds(2);
  digitalWrite(Trig_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig_pin, LOW);
  duration = pulseIn(Echo_pin,HIGH,30000);
  if ( duration == 0 ) {duration = 30000;}
  return duration;
}

y la llamaras así

Code:
duration = UltrasonidosDuration(pingPin);
duration2 = UltrasonidosDuration(pingPin2);
duration3 = UltrasonidosDuration(pingPin3);

Si tienes mas dudas avisame.
Logged

* Si preguntas, pon el código de tu programa, hace mucho mas fácil ayudarte. Y me ahorro un mensaje pidiendo que lo hagas.
* Si consigues solucionar tu problema, dedica unos minutos a explicar en tu post como lo conseguiste para beneficio de todos.
* Cambia el 'Subject' de tu hilo y añade 'SOLUCIONADO' cuando hayas llegado a una solución al problema que planteaste.
* Utiliza un 'Subject' para tu hilo que explique de que va el hilo.
Si estas empezando:
* Comienza a usar Arduino
* Guías de iniciación a Arduino
* Ejemplos
* Referencia del Lenguaje
* Conceptos básicos
Guia de usuario de arduino
Tutoriales en Ingles
Si necesitas que alguien te escriba el código: http://www.freelancer.com/  o esta  http://www.guru.com/

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 41
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Este proyecto me recuerda al "bastón guante para invidentes" que prepare.
3 sensores ultra sonidos configurados a 45 grados cada uno. 3 vibradores, colocados en el envés de la mano a centrado, derecha e izquierda. Vibrando proporcionalmente a la distancia del obstáculo.

+1 por ese proyecto.
Logged

   

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sergegsx muchas gracias por el código de función. La verdad es que empiezo con Arduino pero me gusta y creo que empezaré a hacer mis pinitos... Modificaré el código con tu ayuda y ya te diré como me ha quedado :-).

De nada por el agradecimiento, es lo mínimo! Como bien se dice: "Es de bien nacidos, el ser agradecido" :-).


Fm vaya casualidad lo del proyecto, el mio también es para invidentes, pero en vez de meterlo en un palo lo meto en un brazo prototipo.

También quería hacer lo de que los vibradores vibraran según se acercaban al obstáculo, pero no sabía como hacerlo así que pensé en un Speaker.
No tendrás por casualidad el código/link de tu proyecto para poder echarle un vistazo no..?  smiley-sweat

Muchas gracias por vuestra ayuda!  smiley
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sergegsx he pueto el código que me has pasado, pero no me ha funcionado. Me da un error..

Código Arduino - 3 sensores 3 vibradores (long).ino: In function 'void loop()':
Código Arduino - 3 sensores 3 vibradores (long).ino:50: error: a function-definition is not allowed here before '{' token
Código Arduino - 3 sensores 3 vibradores (long).ino:148: error: expected `}' at end of input



Logged

0
Offline Offline
Edison Member
*
Karma: 17
Posts: 1413
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

tienes que declarar la funcion fuera del loop()

intentalo y si no te funciona pon tu codigo en formato texto y te ayudo
Logged

* Si preguntas, pon el código de tu programa, hace mucho mas fácil ayudarte. Y me ahorro un mensaje pidiendo que lo hagas.
* Si consigues solucionar tu problema, dedica unos minutos a explicar en tu post como lo conseguiste para beneficio de todos.
* Cambia el 'Subject' de tu hilo y añade 'SOLUCIONADO' cuando hayas llegado a una solución al problema que planteaste.
* Utiliza un 'Subject' para tu hilo que explique de que va el hilo.
Si estas empezando:
* Comienza a usar Arduino
* Guías de iniciación a Arduino
* Ejemplos
* Referencia del Lenguaje
* Conceptos básicos
Guia de usuario de arduino
Tutoriales en Ingles
Si necesitas que alguien te escriba el código: http://www.freelancer.com/  o esta  http://www.guru.com/

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

PARTE 1

Buenos días Sr.'s,
hace días estuve mirando lo que me propusieron. FM Me propuso que los vibradores aumentaran su intensificación según la distancia del objeto. Eso lo he conseguido.
Este es un cachito pequeñito de este código:

Code:
//Si esta entre 45cm y 60cm
              if((cm2>=45)&&(cm2<=60))
              {
                    for(int fadeValue = 0 ; fadeValue <= 64; fadeValue +=5)
                       {
                        analogWrite(vibrador2, fadeValue);                                    
                       }
              }
              else
              {    //Si NO esta entre 45cm y 60cm, esta entre 25cm y 45cm
                    for(int fadeValue = 0 ; fadeValue <= 127; fadeValue +=5)
                       {
                        analogWrite(vibrador2, fadeValue);                                    
                       }
              }

Pero lo que pasa es que me queda un código muy largo, aunque funciona todo correctamente.

He intentado aplicar la función tal y como me dijiste Sergegsx pero no he podido hacer que funcione.
El código actual y kilométrico es:

Code:
[color=brown][color=green]// 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[/color]
int vibrador = 11;
int vibrador2 = 10;
int vibrador3 = 9;

[color=green]//Sensores de ultrasonido[/color]
const int pingPin = 7;
const int pingPin2 = 4;
const int pingPin3 = 2;

void setup()
{
[color=green]  // Iniciamos la comunicación por serial:[/color]
  Serial.begin(14400);
}

void loop()
{
  [color=green]/* Establevemos variables para la duración del ping
     y mostramos el resultado de la distancia en centrimetros*/[/color]

[color=green] //Distancia espacio/tiempo     [/color]
  long duration, duration2, duration3, cm, cm2, cm3;
 
 [color=green]/*Dentro del Loop vamos a activar los vibradores
   en las distancias correspondientes */[/color]
  
[color=green]    // ----------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)[/color]
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);
  
[color=green]    //Especificamos los sensores como entrada de datos[/color]
  pinMode(pingPin,INPUT);
  duration = pulseIn(pingPin,HIGH);
  cm = microsecondsToCentimeters(duration);



 [color=green]   // ----------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)[/color]
  pinMode(pingPin2, OUTPUT);
  digitalWrite(pingPin2, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin2, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin2, LOW);

[color=green]  //Especificamos los sensores como entrada de datos[/color]
  
  pinMode(pingPin2,INPUT);
  duration2 = pulseIn(pingPin2, HIGH);
  cm2 = microsecondsToCentimeters2(duration2);
  
  

  [color=green]  // ----------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)[/color]
  pinMode(pingPin3, OUTPUT);
  digitalWrite(pingPin3, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin3, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin3, LOW);
  
[color=green] //Especificamos los sensores como entrada de datos[/color]
  pinMode(pingPin3,INPUT);
  duration3 = pulseIn(pingPin3, HIGH);
  cm3 = microsecondsToCentimeters3(duration3);
  

    
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
[color=red][u][b]PARTE 2[/b][/u][/color]


[color=green]    //Especificamos los vibradores como salida de datos[/color]
  pinMode(vibrador,OUTPUT);
  pinMode(vibrador2,OUTPUT);
  pinMode(vibrador3,OUTPUT);
  
[color=green]     //----------------------------------------
     //         VIBRADOR 1   (DELANTERO)
     //----------------------------------------
//Si Sensor 1 es menor a 50cm y mayor a 10cm activamos Vibrador 1.

  //Si esta entre 10cm y 60cm[/color]
  if((cm>=10)&&(cm<=60))
  {
      [color=green]// Si esta entre 25cm y 60cm[/color]
      if((cm>=25)&&(cm<=60))
        {      
             [color=green] //Si esta entre 45cm y 60cm[/color]
              if((cm>=45)&&(cm<=60))
              {
                    for(int fadeValue = 0 ; fadeValue <= 64; fadeValue +=5)
                       {
                        analogWrite(vibrador, fadeValue);                                    
                       }
              }
              else
              {    [color=green]//Si NO esta entre 45cm y 60cm, esta entre 25cm y 45cm[/color]
                    for(int fadeValue = 0 ; fadeValue <= 127; fadeValue +=5)
                       {
                        analogWrite(vibrador, fadeValue);                                    
                       }
              }
        }
       else
        {
          [color=green]//Si NO esta entre 25cm y 60cm, esta entre 10cm y 25cm[/color]
          for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5)
               {
                analogWrite(vibrador, fadeValue);                                    
               }
        }    
  }
  else
  {
       [color=green] //Si NO esta entre 10cm y 60cm, esta a menos de 10cm o a mas de 60cm, APAGAMOS vibrador.[/color]
         for(int fadeValue = 0 ; fadeValue <= 0; fadeValue +=5)
           {
            analogWrite(vibrador, fadeValue);                                    
           }    
  }
  
  
  
  
  
  
  
  
  
    [color=green] //----------------------------------------
     //         VIBRADOR 2   (DERECHO)
     //----------------------------------------[/color]
[color=green]//Si Sensor 1 es menor a 50cm y mayor a 10cm activamos Vibrador 1.[/color]
if((cm2>=10)&&(cm2<=60))
  {
      [color=green]// Si esta entre 25cm y 60cm[/color]
      if((cm2>=25)&&(cm2<=60))
        {      
              [color=green]//Si esta entre 45cm y 60cm[/color]
              if((cm2>=45)&&(cm2<=60))
              {
                    for(int fadeValue = 0 ; fadeValue <= 64; fadeValue +=5)
                       {
                        analogWrite(vibrador2, fadeValue);                                    
                       }
              }
              else
              {  [color=green]  //Si NO esta entre 45cm y 60cm, esta entre 25cm y 45cm[/color]
                    for(int fadeValue = 0 ; fadeValue <= 127; fadeValue +=5)
                       {
                        analogWrite(vibrador2, fadeValue);                                    
                       }
              }
        }
       else
        {
          [color=green]//Si NO esta entre 25cm y 60cm, esta entre 10cm y 25cm[/color]
          for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5)
               {
                analogWrite(vibrador2, fadeValue);                                    
               }
        }    
  }
  else
  {
       [color=green] //Si NO esta entre 10cm y 60cm, esta a menos de 10cm o a mas de 60cm, APAGAMOS vibrador.[/color]
         for(int fadeValue = 0 ; fadeValue <= 0; fadeValue +=5)
           {
            analogWrite(vibrador2, fadeValue);                                    
           }    
  }
 
 
 
 
 
 
 
 
  

   [color=green]  //----------------------------------------
     //         VIBRADOR 3   (IZQIUERDO)
     //----------------------------------------     [/color]
[color=green]//Si Sensor 1 es menor a 50cm y mayor a 10cm activamos Vibrador 1.[/color]
if((cm3>=10)&&(cm3<=60))
  {
      [color=green]// Si esta entre 25cm y 60cm[/color]
      if((cm3>=25)&&(cm3<=60))
        {      
              [color=green]//Si esta entre 45cm y 60cm[/color]
              if((cm3>=45)&&(cm3<=60))
              {
                    for(int fadeValue = 0 ; fadeValue <= 64; fadeValue +=5)
                       {
                        analogWrite(vibrador3, fadeValue);                                    
                       }
              }
              else
              {    [color=green]//Si NO esta entre 45cm y 60cm, esta entre 25cm y 45cm[/color]
                    for(int fadeValue = 0 ; fadeValue <= 127; fadeValue +=5)
                       {
                        analogWrite(vibrador3, fadeValue);                                    
                       }
              }
        }
       else
        {
[color=green]          //Si NO esta entre 25cm y 60cm, esta entre 10cm y 25cm[/color]
          for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5)
               {
                analogWrite(vibrador3, fadeValue);                                    
               }
        }    
  }
  else
  {
[color=green]        //Si NO esta entre 10cm y 60cm, esta a menos de 10cm o a mas de 60cm, APAGAMOS vibrador.[/color]
         for(int fadeValue = 0 ; fadeValue <= 0; fadeValue +=5)
           {
            analogWrite(vibrador3, fadeValue);                                    
           }    
  }  

  Serial.print(cm);
  Serial.print("cm");
  Serial.print("   ");
  Serial.print(cm2);
  Serial.print("cm2");
  Serial.print("   ");
  Serial.print(cm3);
  Serial.print("cm3");
  Serial.println();


[color=green]  //Tiempo de muestreo expresado en milisegundos[/color]
  delay(10);
} [color=green]//Cerramos el LOOP[/color]



[color=green]  //Convertimos las medidas de microsegundos a centimetros[/color]
long microsecondsToCentimeters(long microseconds)
{
[color=green]  // 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.[/color]
  return microseconds / 29 / 2;
}

long microsecondsToCentimeters2(long microseconds)
{
[color=green]  // 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.[/color]
  return microseconds / 29 / 2;
}

long microsecondsToCentimeters3(long microseconds)
{
[color=green]  // 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.[/color]
  return microseconds / 29 / 2;
}
[/color]

Lo que necesitaría es un ejemplo de uso o creación de funciones, tampoco voy a pedir que se me haga el trabajo, como es lógico xDD
Muchas gracias por vuestra ayuda! :-)
Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 41
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ahora si que me has pillado con la solución. Me explico, no entiendo muy bien para que haces el bucle for y tanto if... Es decir eso lo puedes reducir a algo tan simple como una linea de código que además será mucho más lineal en función de la distancia.

Ejemplo de función:
Code:
// Esta función hace lo que tu has puesto entre tanto if...
void vibraMotor ( int pin, unsigned int distancia )
{
   analogWrite ( pin, map ( distancia, 255, 0, 0, 60 ) ); // transformo mi distancia en un valor entre 255 y 0 para el vibrador
}
Vamos, lo que viene a ser una linea recta pero cuanto más lejos, más vibro.
Los parámetros cuando distancia es 0cm -> 255 (a tope), 60cm -> 0 (nada) y todos los valores intermedios.

En tu loop solo tienes que llamarla de la siguiente forma.
Code:
{
void loop ()
{
   // leo mis distancias en cm, cm2 y cm3
   // ... tu codigo va aquí, el de la lectura y generación de pulsos.
  
   // una vez lo hayas leido y tenga en cm, cm2 y cm3 las distancias usas la función
   vibraMotor ( vibrador1, cm );
   vibraMotor ( vibrador2, cm2 );
   vibraMotor ( vibrador3, cm3 );
}

Hay otras muchas cosas que se puede simplificar sustancialmente en tu código. Como es el envío de pulsos, no tienes que estar esperando ni enviando LOW, espero, HIGH, espero, LOW ni estar continuamente configurando los pines como salidas. Los pines los configuras como salida en la función setup y los pones a LOW. En el bucle principal simplemente haces: HIGH, espero, LOW.

Tampoco necesitas tanto microsecondsToCentimeters, solo una función y siempre llamas a esa única función en tu código.
« Last Edit: February 26, 2013, 03:59:00 pm by fm » Logged

   

Pages: [1] 2   Go Up
Jump to: