El servo digital de 20 kg no funciona, probablemente porque mis cálculos de frecuencia son muy incorrectos (raspberry pi)

resumen

Cambié mis servos por uno más potente y no puedo hacerlo funcionar, creo que es porque no puedo obtener el ciclo de trabajo correcto en el código

explicación

Tengo un brazo robótico que comencé a programar por diversión, hice que todo funcionara, pero los servos que venían con el brazo eran demasiado débiles, alguien me recomendó este que seguro se ve más robusto, hoy llegó, así que pensé que estaría a punto de reemplazarlo. eso, para mi sorpresa no funciona en absoluto.

después de investigar, creo que es porque no configuré el ciclo de trabajo correcto, nunca había oído hablar de eso antes, pero traté de calcularlo con información que encontré en Internet, pero después de horas todavía no pude hacerlo funcionar correctamente.

a veces se mueve, pero definitivamente no en el ángulo correcto y no es consistente, pero como soy nuevo en todo esto, ni siquiera sé si esa es la razón.

No estoy seguro si solo necesito actualizar SERVO_MIN_DUTYo si debo cambiar los hercios cuando configuro el GPIO PWM también.

servos

Este es el viejo servo :

  • Velocidad de funcionamiento : 0,17 s/60 grados (4,8 V sin carga)
  • Velocidad de funcionamiento: 0,13 seg/60 grados (6,0 V sin carga).
  • Par de parada : 13 kg-cm (180,5 oz-in) a 4,8 V;
  • Par de parada: 15 kg-cm (208,3 oz-in) a 6 V.

este es el nuevo servo :

  • Artículo : DS3218 20KG Servo digital de par grande
  • Par de bloqueo (5 V): 19 kg/cm (263,8 oz/in)
  • Par de parada (6,8 V): 21,5 kg/cm (298,5 oz/in)
  • Velocidad: 0,16 seg/60°(5V) / 0,14 seg/60°(6,8V)
  • Voltaje de funcionamiento: 4,8 ~ 6,8 voltios de CC
  • Marca muerta: 3μs
  • Peso: 60g
  • Tipo de motor: Engranaje de motor de CC
  • Tipo: Cobre y Aluminio
  • Frecuencia de trabajo : 1520 μs / 333 Hz
  • Tamaño: 40x20x40,5mm
  • Características:
    • Servo estándar digital de alto rendimiento
    • Engranajes metálicos de alta precisión con anodizado duro
    • Carcasa central de aluminio CNC
    • Rodamientos de bolas dobles

El código original (traté de actualizarlo usando los datos que encontré sin éxito, principalmente de esta guía )

import RPi.GPIO as GPIO
import time
OFFSE_DUTY = 0.5        #define pulse offset of servo
SERVO_MIN_DUTY = 2.5+OFFSE_DUTY     #define pulse duty cycle for minimum angle of servo
SERVO_MAX_DUTY = 12.5+OFFSE_DUTY    #define pulse duty cycle for maximum angle of servo
servoPin = 12

def map( value, fromLow, fromHigh, toLow, toHigh):  # map a value from one range to another range
    return (toHigh-toLow)*(value-fromLow) / (fromHigh-fromLow) + toLow

def setup():
    global p
    GPIO.setmode(GPIO.BOARD)         # use PHYSICAL GPIO Numbering
    GPIO.setup(servoPin, GPIO.OUT)   # Set servoPin to OUTPUT mode
    GPIO.output(servoPin, GPIO.LOW)  # Make servoPin output LOW level

    p = GPIO.PWM(servoPin, 50)     # set Frequece to 50Hz
    p.start(0)                     # Set initial Duty Cycle to 0
    
def servoWrite(angle):      # make the servo rotate to specific angle, 0-180 
    if(angle<0):
        angle = 0
    elif(angle > 180):
        angle = 180
    p.ChangeDutyCycle(map(angle,0,180,SERVO_MIN_DUTY,SERVO_MAX_DUTY)) # map the angle to duty cycle and output it
    
def loop():
    while True:
        for dc in range(0, 181, 1):   # make servo rotate from 0 to 180 deg
            servoWrite(dc)     # Write dc value to servo
            time.sleep(0.001)
        time.sleep(0.5)
        for dc in range(180, -1, -1): # make servo rotate from 180 to 0 deg
            servoWrite(dc)
            time.sleep(0.001)
        time.sleep(0.5)

def destroy():
    p.stop()
    GPIO.cleanup()

if __name__ == '__main__':     # Program entrance
    print ('Program is starting...')
    setup()
    try:
        loop()
    except KeyboardInterrupt:  # Press ctrl-c to end the program.
        destroy()

Entonces, ¿qué necesito exactamente de allí para saber exactamente cómo actualizar el código para cualquier servo?

La descripción del artículo dice 0,16 para 60°, así que esperaba poder obtenerlo con una regla de 3 (para 180° podría hacer 0,16 x 180 / 60 = 0,48 s, pero ese resultado parece demasiado alto para mi poca comprensión) .

tienes que usar una fuente de alimentación, de lo contrario el servo no se moverá
¿Cómo se mantiene la fuente de alimentación bajo la mayor carga de estos nuevos servos?
¡esto es correcto! Después de actualizar el servo, también puse el voltaje hasta el recomendado por la descripción del servo, pero parece que no es suficiente, si lo pongo hasta 9v (más de lo que se supone que es, pero asumo que mi fuente de alimentación también dar menos amperios) el servo vuelve a funcionar, asumí que era el código porque tenía el voltaje recomendado y los cambios en el código harían que el servo se moviera a veces (todavía no entiendo por qué) ¿Cómo manejo esta situación en términos de respuesta aceptada en un comentario?
Si aumentaste la fuente de alimentación a 9V, es posible que hayas dañado los servos. Probablemente necesite una fuente de alimentación con una corriente nominal más alta , no con voltaje.

Respuestas (2)

No debería haber necesitado cambiar ningún código si ambos servos tienen los mismos límites de ángulo.

El servo digital no necesita un pulso 333 veces por segundo.

0.16sec/60° es la velocidad del eje, no el pulso HI requerido. El pulso aún debe ser de 1500us para el centro, 1000us para un extremo y 2000us para el otro extremo.

@ChrisStratton ¿Qué hace que sus aportes sean extraños? Se ven estándar por lo que puedo decir. Los servos también son bastante estándar.

5 voltios a 3 amperios y el servo funciona al 100%, el problema es que aun con el voltaje correcto no tenia amperaje suficiente para empujar el servo.

También encontré esta guía que me ayudó mucho en términos de cálculo y comprensión de los límites de mis servos, ya que explica cada paso y todas las matemáticas detrás de él de una manera muy simple (leí bastantes y siempre estaba confundido acerca de todo). cosa)

No debería necesitar alimentar su servo desde 9V, y no debería hacerlo. Obtenga una fuente de alimentación que pueda entregar la corriente necesaria al voltaje especificado. Tengo un par de servos DS3218 como el tuyo. Funcionan bien con el voltaje especificado.
Hola JRE, gracias por responder una vez más, puedo ver en la descripción del servo que un voltaje recomendado es entre 4.8 ~ 6.8, con 9 está funcionando al 100% como esperaba, jugué con él durante horas ayer, pero entiendo que no es así. ideal, supongo que el problema es que mi fuente de alimentación no da suficiente amperaje a 6 voltios pero no puedo ver ninguna indicación de amperaje en la descripción del servo, solo voltios, ¿hay algo que deba buscar para saberlo de antemano? (Todavía estoy aprendiendo y me gustaría saber esas cosas)
Lo puse en un 5v con 3 amperios y también funciona perfectamente bien, edité la respuesta, gracias por el consejo JRE (¡aunque todavía no estoy seguro de si eso es demasiado amperio!)
El servo solo tomará la corriente que necesita. Su fuente de alimentación puede entregar hasta 3A, pero no obligará al servo a tomar todos los 3A.
Ya veo, no sabía eso, cuando estaba estudiando sobre esto, básicamente me metí en la cabeza que cada dispositivo recibía W, que es básicamente V x A, así que asumí que no había diferencia en cuál es más grande siempre que la W es correcta, investigaré, gracias nuevamente por su tiempo