Go Down

Topic: Servomotores tiemblan demasiado [Hexápodo] (Read 416 times) previous topic - next topic

Shielxz

May 26, 2018, 03:00 am Last Edit: May 26, 2018, 04:27 am by Shielxz
He estado trabajando en un proyecto de un robot hexápodo con sensor ultrasónico.

Anteriormente ya había realizado uno sin problemas con servomotores de 10kg.cm pero esta vez opte por usar los MG90S de 1.8kg.cm, más sin embargo no consigo lograr que se queden quietos,

ya intenté poner capacitores y nada, aquí dejo un link de lo que hace

¿Alguién habrá tenido problemas parecidos que pueda darme sugerencias?


Aquí otro

Video de lo que hace!

Northof49

#1
May 27, 2018, 06:23 am Last Edit: Jun 08, 2018, 08:27 pm by surbyte
Algunos servos son más propensos a la inestabilidad que otros.


Terminé cambiando a una placa I2C para servos (PCA9685).

https://www.ebay.ca/itm/PCA9685-16-Ch-12-bit-PWM-Servo-Shield-Motor-Driver-I2C-Module-For-Arduino-Robot/201402794566?hash=item2ee48ac246:g:r6cAAOSw6WdXiJSJ


Eso resolvió mi problema con los servos temblorosos.

Solo costó alrededor de cinco dólares y puede controlar 16 servos.


Si no es un problema de suministro de energía, creo que hay un defecto en Arduino y algunas libraries que causan inestabilidad del servo.

Shielxz

Northof49 gracias por tu respuesta intentaré hacer eso haber que pasa, postearé los resultados.

Northof49

Aqui hay un ejemplo:

Code: [Select]
[code]
/***************************************************
  This is an example for our Adafruit 16-channel PWM & Servo driver
  Servo test - this will drive 8 servos, one after the other on the
  first 8 pins of the PCA9685

  Pick one up today in the adafruit shop!
  ------> http://www.adafruit.com/products/815
 
  These drivers use I2C to communicate, 2 pins are required to 
  interface.

  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries. 
  BSD license, all text above must be included in any redistribution
 ****************************************************/

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// you can also call it with a different address you want
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);
// you can also call it with a different address and I2C interface
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(&Wire, 0x40);

// Depending on your servo make, the pulse width min and max may vary, you
// want these to be as small/large as possible without hitting the hard stop
// for max range. You'll have to tweak them as necessary to match the servos you
// have!
#define SERVOMIN  160 // was 150 this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX  550 // was 600 this is the 'maximum' pulse length count (out of 4096)

// our servo # counter
uint8_t servonum = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("8 channel Servo test!");

  pwm.begin();
 
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates

  delay(10);
}

// you can use this function if you'd like to set the pulse length in seconds
// e.g. setServoPulse(0, 0.001) is a ~1 millisecond pulse width. its not precise!
void setServoPulse(uint8_t n, double pulse) {
  double pulselength;
 
  pulselength = 1000000;   // 1,000,000 us per second
  pulselength /= 60;   // 60 Hz
  Serial.print(pulselength); Serial.println(" us per period");
  pulselength /= 4096;  // 12 bits of resolution
  Serial.print(pulselength); Serial.println(" us per bit");
  pulse *= 1000000;  // convert to us
  pulse /= pulselength;
  Serial.println(pulse);
  pwm.setPWM(n, 0, pulse);
}

void loop() {
  // Drive each servo one at a time
  Serial.println(servonum);
  for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) {
    pwm.setPWM(servonum, 0, pulselen);
  }

  delay(500);
  for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) {
    pwm.setPWM(servonum, 0, pulselen);
  }

  delay(500);

  servonum ++;
  if (servonum > 7) servonum = 0;
}
[/code]

Shielxz

Cambie al modulo I2C y pero el problema persistia, cambie varios servos y  el problema desaparecio aparentemente pero al momento de ponerles el tornillo del engrane volvian a moverse como locos y peor todavía,

Así que quite los tornillos y los pegue con Kola Loka lo peor que hecho pero funcionó, sigo sin saber bien que causaba que temblara la tierra esta acomodada correctamente y la fuente no es el problema por que conecte a una fuente de pc y da el mismo problema.

surbyte

En todo el comentario no vemos tu código y por ende poco podemos decir acerca de como actualizas las posiciones y si no hay un defecto en el código.

Si le dieras a todos los servos la misma indicación de posicion, digamos 0, igual tiemblan?
Descartamos por lo que ambos afirman que no es problema de alimentación, estan 100% seguros mas allá de la experiencia de @Northof49?

Go Up