Pages: [1]   Go Down
Author Topic: variaciones en la senyal del potenciometro al servo  (Read 1022 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

he conectado el circuito de la imagen del siguiente link

http://arduino.cc/en/uploads/Tutorial/knob_BB.png

con el programa que viene de ejemplo con el arduino

Code:
// Controlling a servo position using a potentiometer (variable resistor)
// by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

#include <Servo.h>
 
Servo myservo;  // create servo object to control a servo
 
int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin
 
void setup()
{
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
   Serial.begin(9600);   // abrimos el puerto serie a 9600 bps
}
 
 
void loop()
{
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  Serial.print("Valor del potenciometro antes de escalar = ");
    Serial.print(val);
      Serial.print("\n");
  val = map(val, 0, 1023, 0, 179);     // scale it to use it with the servo (value between 0 and 180)
  Serial.print("Valor del potenciometro = ");
    Serial.print(val);
      Serial.print("\n");
  myservo.write(val);                  // sets the servo position according to the scaled value
  delay(15);                           // waits for the servo to get there
}

 i el servo no para quieto, siempre esta "temblando", y he comprovado que realmente la señal de entrada , "val" que la muestra en el serial monitor, realmente esta variando todo el rato...

alguien me podria indicar a que puede ser devido?

gracias
Logged

0
Offline Offline
Edison Member
*
Karma: 8
Posts: 1040
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Haz un muestreo de la entrada analogica, cogiendo 10 muestras y haciendo la media.
Logged

Trabajando en ...

    * Control Domotico (En montaje ...)
    http://casitadomotica.blogspot.com/
 

[url=https://bitbucket.org/fmalpartida

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

gracias flico por la rapida respuesta. te cuento:

he hecho lo que me has propuesto:
Code:
// Controlling a servo position using a potentiometer (variable resistor)
// by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

#include <Servo.h>
 
Servo myservo;  // create servo object to control a servo
 
int potpin = 1;  // analog pin used to connect the potentiometer
int i,val;    // variable to read the value from the analog pin
int n=10;
int vector[10];
int valmedio;
int opcion;
int valanterior;
double difper;

void setup()
{
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
   Serial.begin(9600);   // abrimos el puerto serie a 9600 bps
   opcion = 0;
}
 
 
void loop()
{
 
  if (opcion == 0)//------------------------------------------------------------------------
  {
      val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
      Serial.print("\nValor del potenciometro antes de escalar = ");
        Serial.print(val);
          Serial.print("\n");
      val = map(val, 0, 1023, 0, 179);     // scale it to use it with the servo (value between 0 and 180)
  }//------------------------------------------------------------------------------------

  if(opcion == 1)//----------------------------------------------------------------------
  {
 
      //mediante un bucle cogemos 10 valores i hacemos la media para evitar fluctuaciones
      for(i=0;i<n-1;i++)
      {
        val=analogRead(potpin);
        val=map(val,0,1023,0,179);
        vector[i]=val;
        Serial.print("\nValor n");
        Serial.print(i);
        Serial.print(" = ");
        Serial.print(val);

      }
     
      //calculamos el valor medio del vector
      for(i=0;i<n-1;i++)
      {
        valmedio=valmedio+vector[i];
      }
      valmedio=valmedio/n;
      val=valmedio;
  }//---------------------------------------------------------------------------------------
 
  Serial.print("\nValor anterior =");
  Serial.print(valanterior);
 
  Serial.print("     dif ABS =");
  Serial.print(valanterior-val);
 
  difper= ((valanterior-val)*100/180);
  Serial.print("     dif % = ");
  Serial.print(difper);
 
 
  valanterior = val;
  Serial.print("\nValor enviado al servo =");
  Serial.print(val);
 
  myservo.write(val);                  // sets the servo position according to the scaled value
  delay(1000);                           // waits for the servo to get there
}

y he sacado varias conclusiones:

1.al enviar al servo un valor promedio ha mejorado, ya que si lo envio directamente sin hacer el valor promedio me da una variacion porcentual alrededor de 16%

y al enviar el valor promedio de 10 valores, la variacion porcentual es alrededor de  3% pero puntualmente puede augmentar mucho.


he comprovado que esto solo me ocurre cuando alimento el circuito del servo i el potenciometro con una alimentacion externa a la que me ofrece la placa arduino (que la tengo alimentada directamente del USB y Las masas del arduino y de la alimentacion externa estan conectadas)

He probado con un alimentador que me da 7v y con unas pilas que me dan unos 5 voltios.

Me gustaria saber a que es debido este efecto, me he quedado en blanco, ya no se que probar.

gracias

PD: queria poner una imagen de los resultados que me da el serial monitor, pero no consigo hacerlo, no se si es un  problemapor que estoy usando ubuntu...
Logged

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Alimenta el potenciómetro con la tensión de Arduino y el servo con otra fuente externa.
Logged


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

ok, he alimentado el potenciometro con la tension de arduino, y el servo con una fuente externa, pero hace una cosa extraña, es como si hubiera un retardo, de manera que cuando giro el potenciometro, no gira el servo en seguida, sino que lo hace en dos veces... pero no siempre.

gracias

por cierto, alguien me podria indicar como pegar imagenes en los post? cuando le doy a "inser image" me pone las etiquetas, pero no se que poner dentro.
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tiene pinta de ser un problema de hardware, probablemente porque aparece una realimentación positiva parásita.

El sistema lee una tensión en el potenciómetro. Esa tensión es función de la posición del potenciómetro y de la tensión con que se alimente ese potenciómetro. Si el servo no está en la posición correcta, el sistema ordena moverse al servo. Cuando el servo se activa, su motor consume corriente de la misma alimentación que alimenta el potenciómetro y eso hace que la tensión que genera el potenciómetro cambie, aunque la posición del potenciómetro no cambie. Hay que desacoplar el conjunto de forma que los cambios de consumo del servo no modifiquen la tensión con que se alimenta el potenciómetro.
Logged

Pages: [1]   Go Up
Jump to: