Servo Oscilando

Fiz a programação de um braço robótico, desses kits que a gente encontra na internet, é aquele com 4 servos, eu primeiro fiz ele no arduino e acabei portando para o ESP32, para controlar os servos eu estou usando o modulo controlador de servos de 16 canais, alimentado por uma fonte separada, para controlar os diferentes eixos estou usando 4 entradas analógicas com 4 potenciômetros de 10k.

O caso é que no servo que fica na base, fica oscilando e tremendo, como a fonte é externa, eu descartei o problema de energia.
Eu acredito que isso acontece justamente pela oscilação dos valores, existe alguma solução via código para resolver ou mesmo melhorar isso?

Segue o meu codigo:

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
#define SERVOMIN1  100
#define SERVOMAX1  600
#define SERVOMIN2  230
#define SERVOMAX2  500 
#define SERVOMIN3  300
#define SERVOMAX3  480 
#define SERVOMIN4  276
#define SERVOMAX4  488 
#define pot1 34
#define pot2 35
#define pot3 32
#define pot4 33

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();


int servo1 = 0;
int servo2 = 1;
int servo3 = 2;
int servo4 = 3;

void setup() {
  Serial.begin(115200);
  
  pwm.begin();
  
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
  
 // pwm.setOscillatorFrequency(27000000);

  delay(10);

}

void loop() {
  /*uint16_t lido = analogRead(pot);
  uint16_t angulo = map(lido, 0, 1023, SERVOMIN, SERVOMAX);
  */
  
  int lido1 = analogRead(pot1);
  int angulo1 = map(lido1, 0, 4096, SERVOMIN1, SERVOMAX1);

  int lido2 = analogRead(pot2);
  int angulo2 = map(lido2, 0, 4096, SERVOMIN2, SERVOMAX2);

  int lido3 = analogRead(pot3);
  int angulo3 = map(lido3, 0, 4096, SERVOMIN3, SERVOMAX3);

  int lido4 = analogRead(pot4);
  int angulo4 = map(lido4, 0, 4096, SERVOMIN4, SERVOMAX4);
  
  pwm.setPWM(servo1, 0, angulo1);
  pwm.setPWM(servo2, 0, angulo2);
  pwm.setPWM(servo3, 0, angulo3);
  pwm.setPWM(servo4, 0, angulo4);

  Serial.println(angulo1);

}

Mesmo fazendo algo mais simples, controlando um servo apenas e tirando o código dos outros, fica tremendo?

Então, eu não fiz esse teste, mas oque posso adiantar é que, apenas um dos servos oscila de forma mais forte, os outros nem tanto, olhando no monitor serial, realente há uma oscilação nos valores, será que não é essa oscilação nos valores que esta causando a oscilação no servo, talvez por ele ser oq tem o curso maior, o que esta oscilando muito é o servo1.
Mas posso tentar fazer um teste sugerido e depois posto o resultado aqui.

Fiz o teste, e fica do mesmo jeito, a unica coisa que notei, foi que se o ESP32 estiver ligado no USB do computador a vibração diminui um pouco, mas lembrando que os servos estão ligados através do modulo de 16 portas e com uma fonte de bancada, eu estou achando que oque ele esta reagindo é a própria oscilação dos valores, como eu poderia contornar isso, pensei em um tipo de deadband, mas não sei como fazer isso, mas acho que talvez ajudasse.

Estranho. Conseguiria fazer um pequeno vídeo mostrando o seu circuito e a oscilação do servo, mesmo com um programinha simples? Talvez com esse vídeo pudêssemos ter uma noção melhor do que está acontecendo.

Outra pergunta: isso acontece só com esse servo de maior curso? Se trocar ele e colocar outro, com o mesmo programa e circuito, funciona normal?

Aconteceu algo estranho, liguei o braço hoje para tentar fazer o vídeo e colocar aqui, só que agora a oscilação parou, ou seja, no momento não consigo demonstrar, não se se é porque o tempo esta frio ou porque ficou parado alguns dias, o caso é que esta normal agora, mas a duvida ainda continua, se o problema surgir novamente eu tento fazer um vídeo e colocar aqui.

1 curtida