Uso básico de servos con Raspberry Pi y GpioZero

Un servo es un motor que utiliza un conjunto de engranajes para crear un movimiento giratorio. Los vehículos controlados por radio y los proyectos de animación suelen utilizarlos para generar movimiento. Varían en tamaño y capacidad, pero los servos pequeños son baratos y una excelente manera de introducir movimiento en sus proyectos de Raspberry Pi.

Esta publicación explicará cómo conectar un pequeño servo a su Pi de la manera más fácil posible con el mínimo de hardware.

Partes

Necesitará :

  • una raspberry pi
  • Tarjeta SD con el último sistema operativo Raspbian
  • Servo pequeño (TowerPro 9g o equivalente)

Códigos de color de los servos

Los servos generalmente tienen tres cables. Dos son para alimentación y uno para la señal de datos. La coloración de estos cables varía según el fabricante, pero normalmente siguen uno de los siguientes esquemas:

El mío sigue el esquema Rojo/Naranja/Marrón.

Servos y PWM

Hay muchos recursos que explican cómo funcionan los servos. Lo importante es que toman una señal de datos PWM (Pulse Width Modulation). Esta es una secuencia de pulsos altos y bajos donde el tiempo entre cada pulso determina la posición rotatoria.

En este ejemplo básico, usaremos software para generar la señal PWM. Esto no es tan preciso como una señal PWM generada por hardware adecuada, pero lo suficientemente bueno para lo básico.

configuración de hardware

La configuración más fácil es conectar el servo directamente al Pi. Esto es adecuado para servos pequeños que no se espera que realicen tareas exigentes. La energía se extraerá a través del pin de 5 V de Pi y está sujeta a ciertas limitaciones. Si su servo consume demasiada corriente, puede afectar el funcionamiento de los dispositivos USB o el propio Pi.

Se puede usar cualquier pin GPIO

Cable ServoColorRaspberry Pi GPIOComentarios
Potencia (+) rojo Clavija 2 (5V)
Señal/Datos Blanco/Amarillo/Naranja/Azul Clavija 11 (GPIO17)
Terrestre Marrón oscuro Alfiler 9 Se puede usar cualquier pin de tierra

Se puede usar cualquiera de los pines de tierra del Pi. Consulte la imagen del encabezado GPIO de Raspberry Pi para ubicar los pines de tierra adicionales.

En este ejemplo, he usado el pin 9 (negro) para conexión a tierra. El cable de alimentación (rojo) está conectado al pin 2. El cable de señal (naranja) se puede conectar a cualquier pin GPIO, pero prefiero usar el pin 11 (GPIO17) porque está al lado del pin 9 y facilita un poco el cableado. Si usa un GPIO diferente, asegúrese de actualizar los scripts de ejemplo con el número correcto.

Ejemplo de Python Servo Script #1

Una vez conectado, la forma más fácil de hacer que su servo se mueva es usar la biblioteca Gpiozero en un script de Python. Se instala por defecto en la última imagen de Raspbian.

Puedes usar este script de Python:

 from gpiozero import Servo from time import sleep  myGPIO=17  servo = Servo(myGPIO)  while True:     servo.mid()     print("mid")     sleep(0.5)     servo.min()     print("min")     sleep(1)     servo.mid()     print("mid")     sleep(0.5)     servo.max()     print("max")     sleep(1) 

Copie el código anterior en un nuevo archivo de texto llamado «servo1.py» o descárguelo directamente a su Pi desde mi repositorio de Bitbucket usando:

wget https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/servo1.py

Recomiendo usar wget en lugar de copiar y pegar para no perder la sangría correcta.

Para ejecutar el script, use el siguiente comando:

python servo1.py

El servo ahora debería moverse entre sus posiciones mínima, media y máxima con un pequeño retraso en el medio.

Ejemplo de Python Servo Script n.º 2: rango de calibración

El primer script utiliza los valores predeterminados de Gpiozero. Asume que el servo usa un ancho de cuadro de señal de 20ms. Se supone que el ancho de pulso para la rotación mínima y máxima es de 1 ms y 2 ms. Esta información debería estar disponible en la especificación del servo y evitaría a los vendedores que no proporcionan esta información.

Descubrí que con la configuración predeterminada, mi servo solo se movía +45/-45 grados. Cambié los parámetros de ancho de pulso para obtener 90 grados completos de rotación en cualquier dirección. El siguiente script demuestra esto:

 from gpiozero import Servo from time import sleep  myGPIO=17  myCorrection=0.45 maxPW=(2.0+myCorrection)/1000 minPW=(1.0-myCorrection)/1000  servo = Servo(myGPIO,min_pulse_width=minPW,max_pulse_width=maxPW)  while True:     servo.mid()     print("mid")     sleep(0.5)     servo.min()     print("min")     sleep(1)     servo.mid()     print("mid")     sleep(0.5)     servo.max()     print("max")     sleep(1) 

Copie el código anterior en un nuevo archivo de texto llamado «servo2.py» o descárguelo directamente a su Pi desde mi repositorio de Bitbucket usando:

wget https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/servo2.py

Recomiendo usar wget en lugar de copiar y pegar para no perder la sangría correcta.

Para ejecutar el script, use el siguiente comando:

python servo2.py

El servo ahora debería moverse entre sus posiciones mínima, media y máxima con un pequeño retraso en el medio.

En este ejemplo, el ancho de pulso mínimo se reduce desde el valor predeterminado de 1 mediante una corrección de 0,45 a 0,55 ms. El ancho de pulso máximo aumenta desde el valor predeterminado de 2 en 0,45 a 2,45 ms. Esto le dio a mi servo 90 grados completos de rotación en ambas direcciones. Los valores “0.55” y “2.45” se dividen por 1000 para convertirlos a milisegundos.

No hay nada mágico en «0.45». Fue solo la corrección que funcionó mejor para mi servo.

Para calcular estos números comencé con:

myCorrection=0 maxPW=(2.0+myCorrection)/1000 minPW=(1.0-myCorrection)/1000

y aumentó/disminuyó el número de corrección en incrementos de 0,05. Esto me permitió encontrar el cambio más grande que podía hacer antes de que el servo sonara infeliz.

“myCorrection” tiene que ser un número entre 0 y 1, ¡pero es poco probable que alguna vez necesite ser 1!

Ejemplo de secuencia de comandos de servo n.° 3: posicionamiento preciso

Una vez que haya determinado los valores de ancho de pulso mínimo y máximo, puede usar la función de «valor» para colocar el brazo del servo en cualquier lugar entre sus límites.

Establecer el parámetro «valor» en un número entre -1 y +1 mueve el brazo entre sus posiciones mínima y máxima. Ejemplos incluyen :

# Minimum position servo.value=-1  # Mid-point servo.value=0  # Maximum position servo.value=1  # Position between mid-point and maximum servo.value=0.5

El siguiente script genera un rango de números de «valor» para barrer el servo entre su posición máxima y mínima:

 from gpiozero import Servo from time import sleep  myGPIO=17  myCorrection=0 maxPW=(2.0+myCorrection)/1000 minPW=(1.0-myCorrection)/1000  servo = Servo(myGPIO,min_pulse_width=minPW,max_pulse_width=maxPW)  while True:    print("Set value range -1.0 to +1.0")   for value in range(0,21):     value2=(float(value)-10)/10     servo.value=value2     print(value2)     sleep(0.5)    print("Set value range +1.0 to -1.0")   for value in range(20,-1,-1):     value2=(float(value)-10)/10     servo.value=value2     print(value2)     sleep(0.5) 

Copie el código anterior en un nuevo archivo de texto llamado «servo3.py» o descárguelo directamente a su Pi desde mi repositorio de Bitbucket usando:

wget https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/servo3.py

Recomiendo usar wget en lugar de copiar y pegar para no perder la sangría correcta.

Para ejecutar el script, use el siguiente comando:

python servo3.py

El servo ahora debería moverse entre sus posiciones mínima, media y máxima con un pequeño retraso en el medio.

El primer ciclo «For» genera un conjunto de enteros entre 0 y 20. Al valor se le restan 10 para dar un rango de -10 a 10. El valor finalmente se divide por 10 para dar un rango de -1 a +1 . El conjunto original de valores contenía 20 enteros y todavía tenemos 20 pasos en la secuencia. Para aumentar el número de pasos a 40, reemplazaría 20 con 40 y restaría 20 en lugar de 10.

El segundo bucle «For» hace lo mismo pero genera una secuencia de +1 a -1.

Próximos pasos

Una vez que tenga estos scripts funcionando, puede modificarlos para que el brazo se mueva como desee. Por ejemplo, podría generar aleatoriamente un número entre -1 y +1 para colocar el brazo entre sus límites máximo y mínimo. ¿O tal vez moverlo en función de la entrada de un sensor o joystick? Siempre que pueda convertir el rango de valores de su sensor a un rango de -1 a +1, puede indicar el resultado usando un servo.

Eche un vistazo a la documentación oficial de Gpiozero para obtener información técnica adicional.

Aquí hay un video corto que muestra el movimiento del servo usando estos tres scripts de ejemplo:

Dónde comprar servos pequeños

Estos servos están disponibles en muchos puntos de venta, incluidos [Amazon] y [eBay].

Puede leer más sobre estos dispositivos en la página de Wikipedia.