Los motores de CC son geniales, pero es difícil hacer que controlen manos y dedos robóticos. Simplemente no puedes obtener el ángulo correcto. Pero con los servomotores, siempre puede estar seguro de que se detendrán en el ángulo correcto todo el tiempo.
¡Así que levante sus cables de puente y haremos girar un servomotor con la Raspberry Pi y haremos que se detenga en cualquier ángulo!
Contenido
¿Qué es un servomotor?
Un servomotor es un motor de CC que le permite controlar su ángulo. Puede configurarlo para que gire 90 grados, se detenga y luego retroceda 90 grados. Son útiles cuando necesita precisión en una pieza que se mueve automáticamente.

Dentro de un servomotor hay tres partes: motor de CC, potenciómetro y un circuito que controla el motor.
Los potenciómetros en los servomotores son resistencias, al igual que las resistencias que usa cuando enciende los LED. La excepción es que pueden cambiar los valores de resistencia cuando los gira.
En los servomotores, el potenciómetro está orientado al motor de CC para que gire cuando el motor de CC gira. Esto le permite conocer el ángulo del eje del motor. El circuito controlador le dice que se detenga cuando alcanza cierto ángulo.
Con eso en mente, usar servomotores con Raspberry Pi significa que le está diciendo al circuito del controlador que gire el motor de CC hasta que alcance un cierto ángulo.
¿Qué es la modulación de ancho de pulso?
La modulación de ancho de pulso (PWM) es el corazón de todo este asunto del servomovimiento. Es un método para controlar el tiempo entre las ondas de pulso en una señal PWM.
Como una explicación más sencilla, imagine que la Raspberry Pi emite 3,3 V desde el pin 7. En un oscilador que hace un gráfico de voltaje a lo largo del tiempo, eso haría un gráfico en el lado de 3,3 V, que se convierte en una línea larga a medida que pasa el tiempo. . Cuando de repente cae a 0V, el oscilador hace una línea vertical hacia el lado de 0V, luego hace una línea horizontal desde allí con el tiempo.

Eso se llama onda de pulso. PWM es cuando controla la distancia entre dos ondas de pulso (longitud de 0s) o la longitud del pulso en sí (longitud de 1s). Esto también se conoce como unciclo de trabajoy es lo que cambias mientras usas el ChangeDutyCycle()
función.
El control PWM es una función importante en muchos microcontroladores, no solo en Raspberry Pi. Le permite controlar y generar muchas otras cosas, todo mientras usa solo un poco de electricidad para funcionar.
Cosas que necesitas para hacer girar un servomotor
- Servo motor
- 3 cables puente
- Raspberry Pi (cualquier modelo excepto el Pico)
Pasos para usar un servomotor
- Con su editor de código favorito, pegue el siguiente código:
import RPi. GPIO as GPIO from time import sleep servoPin = 7 GPIO. setwarnings ( False ) GPIO. setmode ( GPIO. BOARD ) GPIO. setup ( servoPin , GPIO. OUT ) pin7 = GPIO. PWM ( servoPin , 50 ) pin7. start ( 0 ) def angleToDutyConvert ( angle ) : dutyCycle = angle / 18 + 2 GPIO. output ( servoPin , GPIO. HIGH ) pin7. ChangeDutyCycle ( dutyCycle ) sleep ( 0.15 ) GPIO. output ( servoPin , GPIO. LOW ) sleep ( 0.15 ) def sweep ( degrees ) : for pos in range ( 0 , degrees , + 5 ) : print ( pos ) angleToDutyConvert ( pos ) for pos in range ( degrees , 0 , - 5 ) : print ( pos ) angleToDutyConvert ( pos ) while True : sweep ( 45 ) sweep ( 90 )
- Guárdelo como "rpi-servo.py" o cualquier nombre de archivo de su elección, siempre que termine con la extensión de archivo ".py". Apague su Raspberry Pi después.
- ¡Es hora de construir el circuito! Los servos vienen con tres cables que generalmente se unen como un solo cable plano.
Los cables de servo pueden venir en diferentes colores, según el fabricante. Conéctelos a la Raspberry Pi de la siguiente manera:
- Blanco, rojo, negro: blanco = pin 7, rojo = 5V, negro = GND
- Amarillo, rojo, marrón: amarillo = pin 7, rojo = 5V, negro = GND
- Azul, rojo, negro: azul = pin 7, rojo = 5V, negro = GND
El cable que está conectando al pin 7 es el cable de "señal" del servo. Esto está conectado directamente al circuito del controlador.

Si no tiene suficientes cables de puente de macho a hembra, puede hacer los suyos propios con un cable de puente de macho a macho y uno de hembra a hembra conectados entre sí.

Consejo:Si tiene problemas para buscar el pin 7, sostenga su Raspberry Pi de manera que los pines GPIO estén colocados a la derecha. Comenzando desde el pin superior izquierdo, ese sería el pin 1. A la derecha está el pin 2. Debajo del pin 1 está el pin 3 y así sucesivamente.

El pinout es universal en todos los modelos Raspberry Pi de 40 pines.
- encienda su Raspberry Pi y abra la terminal. Usar
cd
para abrir la carpeta donde guardó el archivo. un ejemplo escd MTE/experiments
. También puede hacerlo de forma inalámbrica a través de SSH. - Es hora de ejecutar el script de Python. Ingresar
python3 rpi-servo.py
¡y mira cómo se mueve tu servo!
Consejo:es más fácil ver el movimiento de la Raspberry Pi cuando le colocas un trozo de cinta, pero lo ideal es que uses la "bocina" que viene con el servo directamente de la caja.

Cómo funciona
Como con la mayoría de las otras instrucciones que hacemos, estamos dividiendo este código en cuatro partes:
- Comandos de importación
- Comandos de configuración
- Declaraciones de funciones
- Comandos en bucle
Como siempre, estas no son divisiones "estándar". ¡Es una buena práctica dividir su código en partes más pequeñas al programar cosas para hacer que la edición y la depuración sean mucho más fáciles!
Comandos de importación
La sección de comandos de importación es donde se supone que debes cargar tus módulos. Aquí, estamos usando dos módulos: RPi.GPIO
y time
.
import RPi. GPIO as GPIO from time import sleep
import RPi.GPIO as GPIO
importa el módulo RPi.GPIO y le permite controlar los pines negros (GPIO) donde coloca los cables del código. La última parte de esta línea, as GPIO
, declara una nueva variable llamada GPIO
. Aquí, GPIO
siempre significará RPi.GPIO
, a menos que se cambie en la última parte del código. Puedes reemplazar GPIO
con cualquier otro nombre de variable que quieras!
from time import sleep
es otra forma de importar un módulo, pero en lugar de importar el módulo completo, solo está importando una parte. Aquí, simplemente tomamos el sleep
parte del módulo de tiempo, que le permite utilizar el sleep()
función, pausando el código durante una cantidad determinada de segundos.
Comandos de configuración
Los comandos de configuración le permiten configurar y definir cosas antes de ir a la parte en bucle.
servoPin = 7 GPIO. setwarnings ( False ) GPIO. setmode ( GPIO. BOARD ) GPIO. setup ( servoPin , GPIO. OUT ) pin7 = GPIO. PWM ( servoPin , 50 ) pin7. start ( 0 )
servoPin = 7
define la variable servoPin
y le da el valor 7
. Estamos usando esto para decir que el pin para controlar el servomotor será el pin 7.
¿Por qué definir un número pin? A veces, cuando cambia de opinión y piensa, quiere moverlo al pin 40, por ejemplo, entonces es más fácil cambiar solo un número de pin que tener que buscar el número 7 en todo su código.
GPIO.setwarnings(False)
detiene un mensaje de advertencia que verá cuando ejecute un script de Python que use los pines GPIO. Está configurado en "Verdadero" de forma predeterminada.
GPIO.setmode(GPIO.BOARD)
define qué pinout estás usando. Hay dos tipos: BOARD y BCM. En BOARD, estás definiendo pines en función de dónde están. El pin 1 está arriba a la izquierda, el pin 2 a la derecha y así sucesivamente.
BCM significa "Broadcom" y selecciona pines en función de su canal Broadcom SOC. Este es un número específico de pin. A diferencia de BOARD, es más fácil cometer errores con BCM, ya que el número de pin que va a usar cambia según el modelo de Raspberry Pi que esté usando.
GPIO.setup(servoPin, GPIO.OUT)
define el pin 7, ese pin que definimos anteriormente como servoPin
y lo asigna como un pin de salida.
pin7 = GPIO.PWM(servoPin, 50)
es otra variable que estamos definiendo. GPIO.PWM(servoPin, 50)
significa que estás haciendo el servoPin
El pin de salida libera una señal PWM. Hablaremos de PWM (modulación de ancho de pulso) más adelante. Pero para saciar un poco la curiosidad, PWM significa que está encendiendo y apagando el pin a intervalos regulares. La segunda parte, 50
, le dice al pin que se encienda al 50% del intervalo, luego se apaga.
Por último, pin7.start(0)
hace que el pin 7 comience a hacer lo de PWM, ¡preparándolo para funcionar!
Declaraciones de funciones
La programación de código complejo se puede hacer de dos maneras: escribir y volver a escribir lo mismo una y otra vez o escribirlo una vez en una variable y reducir diez líneas de código en una línea. La "función" lo hace más fácil, y ningún programador en su sano juicio favorecería la primera sobre una buena función.
def angleToDutyConvert ( angle ) : dutyCycle = angle / 18 + 2 GPIO. output ( servoPin , GPIO. HIGH ) pin7. ChangeDutyCycle ( dutyCycle ) sleep ( 0.15 ) GPIO. output ( servoPin , GPIO. LOW ) sleep ( 0.15 ) def sweep ( degrees ) : for pos in range ( 0 , degrees , + 5 ) : print ( pos ) angleToDutyConvert ( pos ) for pos in range ( degrees , 0 , - 5 ) : print ( pos ) angleToDutyConvert ( pos )
Las funciones en las declaraciones son solo una "función en una función" gigante. Estamos comenzando en la función inferior, sweep()
, primero, que usa la otra función, angleToDutyConvert()
, dentro de eso.
Función #1: barrido (grados)
def sweep(degrees):
define un nombre de función, sweep
, y le da un parámetro: degrees
. Queremos que esta función tome un ángulo en grados y barra lentamente hasta que alcance ese ángulo. Eso es mientras imprime el ángulo actual a medida que se mueve, por lo que ya sabrá qué tan lejos se ha ido.
def sweep ( degrees ) : for pos in range ( 0 , degrees , + 5 ) : print ( pos ) angleToDutyConvert ( pos ) for pos in range ( degrees , 0 , - 5 ) : print ( pos ) angleToDutyConvert ( pos )
Normalmente, los servomotores se moverán a un ángulo objetivo tan rápido como puedan. Para hacer que un servomotor "barra" lentamente, tendremos que hacer que se mueva y se detenga en un ángulo pequeño hasta que alcance el ángulo objetivo.
Para hacer eso, necesitamos un bucle "for". La línea for pos in range(0, degrees, +5):
es un bucle for que guarda la posición actual en grados en una variable, pos
, y bucles entre la parte inicial de la range()
función, 0, y el valor máximo en grados mientras se incrementa en 5.
Puede visualizarlo así: El valor de pos
comienza en 0, luego se mueve en +5. El bucle for comprueba si todavía está por debajo del valor máximo (el degrees
parte). Si no es así, comienza a hacer lo que está dentro del ciclo, luego regresa para agregar +5 a pos
. Como solía ser 0, el siguiente valor debería ser 0 + 5 = 5. Vuelve a comprobar y repite hasta que pos
se vuelve más grande o al mismo nivel que degrees
.
La siguiente parte hace las cosas al revés. A partir del valor de degrees
, el servo se moverá en -5 hasta que el valor de pos
baja a 0.
Puede notar que cada ciclo for tiene dos líneas: print(pos)
y angleToDutyConvert(pos)
. El primero, print(pos)
, imprime el valor de pos
en la consola, lo que hace que las cosas sean más fáciles de ver. angleToDutyConvert(pos)
, por otro lado, es esa función personalizada en nuestra función.
Función #2: angleToDutyConvert(pos)
Si bien esto se mencionó anteriormente, es más fácil de explicar después de explicar en qué se utilizará. angleToDutyConvert(angle)
es una función personalizada, como sweep(degrees)
. Entonces, ¿para qué es esto?
def angleToDutyConvert ( angle ) : dutyCycle = angle / 18 + 2 GPIO. output ( servoPin , GPIO. HIGH ) pin7. ChangeDutyCycle ( dutyCycle ) sleep ( 0.15 ) GPIO. output ( servoPin , GPIO. LOW ) sleep ( 0.15 )
Recuerda eso sweep(degrees)
toma un número en grados. Eso es genial, pero las computadoras (y el circuito controlador del servo) no saben qué es un "grado", pero sí conocen los ciclos de trabajo.
Para la mayoría de los servomotores, calculan el "ángulo" escuchando los ciclos de trabajo. Para convertir un número de grados a ciclos de trabajo, debe dividir el ángulo por 18 y agregar 2 al cociente. Eso es exactamente lo que la línea dutyCycle = angle / 18 + 2
es para.
La siguiente parte de la función hace la mayor parte del trabajo preliminar. GPIO.output(servoPin, GPIO.HIGH)
enciende el pin 7, enviando una señal al servomotor. pin7.ChangeDutyCycle(dutyCycle)
cambia el ciclo de trabajo con el valor de convertir grados a ciclos de trabajo, luego sleep(0.15)
detiene el código durante 0,15 segundos.
Las dos últimas partes, GPIO.output(servoPin, GPIO.LOW)
y un segundo sleep(0.15)
, apague temporalmente el pin 7. No son un gran código "vital", pero ayudan con la inestabilidad, especialmente cuando desea que el servo mantenga su posición.
Comandos en bucle
Es hora de hacer que las cosas funcionen. Usando un bucle while, gire el servomotor con la Raspberry Pi durante el tiempo que desee.
while True : sweep ( 45 ) sweep ( 90 )
while True:
es un ciclo while que nunca termina. Lo que sea que coloques dentro se repetirá para siempre, siempre y cuando lo alimente con electricidad.
Pero el verdadero MVP aquí es el sweep()
función, que es la función que hicimos antes. Puede agregar más de estos para hacer que el servomotor se mueva en diferentes ángulos. Solo recuerda que cualquier número que pongas entre paréntesis, ese será el ángulo en el que se moverá el servo.
Preguntas frecuentes
¿Por qué el indicador LED rojo de mi Raspberry Pi se apaga mientras uso un servomotor?
El indicador LED rojo le permite saber si su Raspberry Pi tiene suficiente electricidad. Si comienza a morir mientras ejecuta un servomotor, entonces probablemente esté funcionando con poca potencia. Los servomotores necesitan mucha electricidad para funcionar, por lo que es posible que desee utilizar una fuente de alimentación adecuada y algo más que un simple cargador de teléfono.
¿Por qué mi servomotor no puede girar 360°?
La mayoría de los servomotores para aficionados no pueden girar más de 180°. Pedirle que gire 360° completos sería una exageración. Pero hay otros servos que giran continuamente: "servos de rotación continua".
¿Por qué tiembla mi servomotor?
Las fluctuaciones en los servomotores pueden deberse a muchas razones. Bajo consumo, problemas de código o simplemente porque está usando uno barato hecho con piezas baratas. Los engranajes podrían haberse desalineado. Sin embargo, apagar la señal PWM cuando desea que permanezca en su lugar puede ayudar.
¡Suscríbete a nuestro boletín!
Nuestros últimos tutoriales enviados directamente a su bandeja de entrada
Regístrese para recibir todos los boletines.
Al registrarse, acepta nuestra Política de privacidad y los usuarios europeos aceptan la política de transferencia de datos. No compartiremos tus datos y puedes darte de baja en cualquier momento.
Suscribir