he conectado el circuito de la imagen del siguiente link
con el programa que viene de ejemplo con el arduino
// 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...
// 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...
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.
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.