Go Down

Topic: Problema con 3 sensores Ping Parallax (Read 3 times) previous topic - next topic

malcolm_1988

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




Sergegsx

tienes que declarar la funcion fuera del loop()

intentalo y si no te funciona pon tu codigo en formato texto y te ayudo
* 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/

malcolm_1988

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: [Select]
//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: [Select]
[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);
 

   

malcolm_1988

Code: [Select]
[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! :-)

fm

#14
Feb 26, 2013, 09:54 pm Last Edit: Feb 26, 2013, 09:59 pm by fm Reason: 1
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: [Select]

// 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: [Select]

{
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.
   

Go Up