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
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_DUTY
o si debo cambiar los hercios cuando configuro el GPIO PWM también.
Este es el viejo servo :
este es el nuevo servo :
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) .
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.
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)
jsotola
elchambro
usuario_1818839
pau fer
usuario_1818839