VIBRACIÓN EN SERVOMOTOR

Hola! Como andan?

Ando con un problema muy importante! Resulta que tengo un brazo robot hecho con 3 servos. 2 HX5010 y uno de 9 gramos (no dice marca). Resulta que uno de de los servos HX5010 tiene una vibración media que me resulta terrorífica para el proyecto, ya que la punta del robot termina moviéndose cerca de 1/1,5 cm de cada lado.

Arme un codigo similar al ejemplo Knob, con la diferencia que es para 3 servos juntos. Las señales de cada servo van a un Arduino MEGA y las tensiones de 5v y masas van a una fuente de Pc, compartida con la masa del arduino. Hay algunas conexiones mediante una protoboard.

He probado con cambiar las entradas analogicas de los potenciometros. Las salidas de PWM. Poner un nucleo de ferrita dando 2 vueltas en el cable bien cerca del servo… y aun nada.

Les paso el codigo y un video del asunto. Espero que me puedan aconcejar que hacer, ya que es para un proyecto de la universidad y nunca me paso este problema.

Muchisimas gracias! Saludos a todos!

Seteo_Servos.ino (652 Bytes)

VIDEO.zip (1.04 MB)

Tu problema es que cuando usamos fuentes como la de una PC tenemos mucho RIPPLE o variaciones debido a la fuente de switching (conmutada).
Hay varias soluciones posibles
La primera que te voy a dar es promediar las lecturas de tus AD
Ahora tal como lo lees lo envias a los servos, asi que si la lectura tiene ruido (como es seguro lo tiene) este va directo al servo.

Entonces te respondo con el código algo cambiado, pero que hace lo mismo pero ahora promediando contra N muestras del AD.

#include <Servo.h>
#define MUESTRAS 100

int va1 = 0;
int va2 = 0;
int va3 = 0;

unsigned long suma1 = 0, suma2 = 0, suma3 = 0;

int k1 = A0;
int k2 = A1;
int k3 = A2;

Servo m1;
Servo m2;
Servo m3;

void setup()
{
  m1.attach(2);
  m2.attach(3);
  m3.attach(4);
  Serial.begin(9600);
}

void loop()
{
  suma1 = 0;
  suma2 = 0;
  suma3 = 0;
  
  for (int i=0; i<MUESTRAS; i++) {
      suma1 += analogRead(k1);
      suma2 += analogRead(k2);
      suma3 += analogRead(k3);
  }
  va1 = suma1 / MUESTRAS;
  va2 = suma2 / MUESTRAS;
  va3 = suma3 / MUESTRAS;
  
  va1 = map(va1, 0, 1023, 0, 179);
  va2 = map(va2, 0, 1023, 0, 179);
  va3 = map(va3, 0, 1023, 0, 179);
  Serial.print("Servo 1: ");
  Serial.print(va1);
  Serial.print(" Servo 2: ");
  Serial.print(va2);
  Serial.print(" Servo 3: ");
  Serial.println(va3);
  
  m1.write(va1);
  m2.write(va2);
  m3.write(va3); 
  delay(15);
}