Cómo funcionan los servomotores:
Los servomotores son ampliamente utilizados en juguetes controlados por radio (automóviles, aviones, etc.), pero también en aplicaciones industriales donde se necesita una posición de rotación precisa (por ejemplo, en robótica). Una alternativa (y una solución a menudo mejor) para lograr el control de la dirección es el motor paso a paso, pero hoy hablaremos de los Servos
Normalmente, un servomotor se construye a partir de un motor estándar de CC con un control interno de re-alimentación (un potenciómetro conectado a un engranaje reductor y algunos componentes electrónicos). Su uso principal es girar el eje del engranaje a una dirección predefinida.
El motor tiene 3 terminales de entrada, GND, POWER y SIGNAL.
El funcionamiento es el siguiente, aplicamos una señal modulada por ancho de pulso (PWM) a la entrada SIGNAL, y la dirección del eje se determina por la duración del pulso. Tenga en cuenta que la dirección no está determinada por el ciclo de trabajo (Duty Cicle) , sino por la longitud t del pulso de encendido (on-pulse).
Normalmente, un servomotor se construye a partir de un motor estándar de CC con un control interno de re-alimentación (un potenciómetro conectado a un engranaje reductor y algunos componentes electrónicos). Su uso principal es girar el eje del engranaje a una dirección predefinida.
El motor tiene 3 terminales de entrada, GND, POWER y SIGNAL.
![]() |
Figura 1 |
Muchos servomotores usan una frecuencia de PWM de fPWM = 50 Hz correspondiente a un período de PWM de T = 20 ms. La relación entre la duración del impulso t y la dirección es lineal y depende del motor y del engranaje:
Ejemplo: (degs = degrees = grados)
![]() |
Figura 2 |
Figura 3
Experimento 1: Motor directamente conectado a GPIO
Objetivo:
Conecte un pequeño servomotor directamente al suministro de 5 V de la Raspberry Pi y controle mediante un puerto de salida digital GPIO utilizando el software PWM.
Precaución:
Solo use micro servomotores (por ejemplo, TowerPro SG90) debido a la limitación actual del suministro de 5 V.
![]() |
Figura 4 |
Es una buena idea alimentar el servomotor con una fuente de voltaje externa, ya que los servos pueden causar 'ruido eléctrico' que podría causar que la Raspberry Pi actúe erráticamente o incluso la rompa por completo. Use el siguiente cableado:
![]() |
Figura 5 |
Esta practica la haremos por supuesto con nuestra querida RaspBerry. Por desgracia nuestra Raspi no esta diseñada para PWM, pero hay tenemos la libreria GPIO.PWM de Python que podemos "Simular PWM" por software.
Conecte el cable marrón (o negro) a GND (pin 6), el cable rojo a 5 V (pin 2) y el cable amarillo a cualquier salida GPIO. El servomotor está alimentado por 5 V, pero controlado por 3.3 V.
Este ejemplo ara mover el servo primero a 0º, luego 90º y 180º.
Programa Python:
# Servo1.py import RPi.GPIO as GPIO import time P_SERVO = 22 # adaptarse a su cableado fPWM = 50 # Hz (no más alto con el software PWM) a = 10 b = 2 def setup(): global pwm GPIO.setmode(GPIO.BOARD) GPIO.setup(P_SERVO, GPIO.OUT) pwm = GPIO.PWM(P_SERVO, fPWM) pwm.start(0) def setDirection(direction): duty = a / 180 * direction + b pwm.ChangeDutyCycle(duty) print ("Dirección =", direction, "-> Fuerza =", duty) time.sleep(1) # permitir que se establezcan print ("Comenzando") setup() for direction in range(0, 181, 10): setDirection(direction) direction = 0 setDirection(0) GPIO.cleanup() print ("Terminado")
Observaciones:
Debe esperar que el servomotor este en la nueva dirección antes de cambiar la dirección o finalizar el programa.
Otra cosa que voy a aclarar.... Yo la verdad, de esta manera, no logre que los servos funcionaran correctamente, he probados dos servos uno es el Power HD‑1160A y el conocido Tower Pro SG90, en los dos casos los resultados fueron nefactos 😥, el que mejor reacciono fue el Tower Pro SG90, pero fatal. He hecho varias pruebas probando frecuencias entre 50 y 60Hz y nada no vi mejoras, de la misma manera ponia valores manuales en el Duty y nada...
Por suerte tenemos varias placas PWM que podemos usar con nuestra Raspi y el Chipn PCA9685 es una de ellas con resultados profesionales 😁
Experimento 2: Servomotores impulsados por PCA9685
![]() |
Figura 6 |
Generar señales PWM estables por software es una pesada carga para un microprocesador que ejecuta Linux, porque hay otros procesos ejecutándose en el sistema que pueden interrumpir el código de generación de PWM. Es una mejor solución utilizar un chip externo de propósito especial que hace el trabajo, especialmente si necesita varias señales PWM.
La PCA9685 está diseñada para manejar hasta 16 señales PWM controladas por una interfaz I2C. Se llama 'controlador LED', pero también puede manejar los servomotores.
El chip solo está disponible en un paquete SMT de 28 pines, por lo que deberá soldarlo en un adaptador SMT o comprar un paquete pre-ensamblado como la Interfaz del servocontrolador de 16 canales Adafruit (consulte la imagen a la derecha).
Objetivo:
Conecte un servomotor al canal 0 del módulo basado en PCA9685 y realice la misma acción que en el ejemplo anterior.
Para simplificar su tarea de programación, use una pequeña biblioteca PCA9685.py inspirada en el Servodriver de Adafruit PWM.
Programa Python:
# Simple demo del PCA9685 PWM servo/LED controller library. # Esto moverá el servo en el canal 0 de la posición mínima a la máxima repetidamente. # Author: Tony DiCola # License: Public Domain import time # Import the PCA9685 module. import Adafruit_PCA9685 # Inicializa el PCA9685 usando la direcion por defecto (0x40). pwm = Adafruit_PCA9685.PCA9685() # Si tuvieramos otra direccion y/o bus haerlo asi: #pwm = Adafruit_PCA9685.PCA9685(address=0x41, busnum=2) # Configuro min y max ancho del pulso para el servo servo_min = 130 # 0 Grados Min pulse length out of 4096 servo_max = 560 # 180 Grados Max pulse length out of 4096 servo_med = 345 # 90 Grados # Seteamos la freuencia en 60hz, se reomiendo entre 50 y 60. pwm.set_pwm_freq(60) print('Moviendo el servo en el canal 0, press Ctrl-C to quit...') # pwm.set_pwm(channel, on-Pulso, off-Pulso) while True: # Move servo on channel O between extremes. print('Movemos a 0 Grados') pwm.set_pwm(0, 0, servo_min) time.sleep(1) print('Movemos a 90 Grados') pwm.set_pwm(0, 0, servo_med) time.sleep(1) print('Movemos a 180 Grados') pwm.set_pwm(0, 0, servo_max) time.sleep(1)
Observaciones:
Ahora si que va espectacular!!!! 😁😁
En el próximo articulo, explicare un poco mas profundamente el uso y/o funcionamiento de esta maravillosa placa..
Hasta la proxima
Comentarios
Publicar un comentario