Uso básico del servo con el Raspberry Pi y el GpioZero

Rate this post

Un servo es un motor que utiliza un conjunto de engranajes para crear un movimiento rotativo. Los vehículos radiocontrolados y los proyectos de animación a menudo los utilizan para generar movimiento. Varían en tamaño y capacidad, pero los servos pequeños son baratos y una gran manera de introducir movimiento en sus proyectos de Raspberrys Pi.

Este post explicará cómo conectar un pequeño servo a tu Pi de la forma más fácil posible con el mínimo de hardware.

Piezas

Necesitará>

  • A 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 la potencia y una para la señal de datos. La coloración de estos alambres varía según los fabricantes, pero suelen seguir uno de los siguientes esquemas:

> Las mías siguen el esquema Rojo/Naranja/Castaño.

Servos y PWM

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

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

Configuración de hardware

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

Se puede usar cualquier pin GPIO

Servo WireColourRaspberry PiGPIOCommentsPower (+)RedPin 2 (5V)Signal/DataWhite/Yellow/Orange/BluePin 11 (GPIO17)GroundBlack/BrownPin 9Cualquier clavija de tierra puede usarse

Se puede usar cualquiera de los pines de tierra de la Pi. Por favor refiérase a la imagen del encabezado del Pi GPIO de Raspberry para localizar los pines de tierra adicionales.

> En este ejemplo he usado el Pin 9 (Negro) para tierra. El cable de alimentación (rojo) está conectado a la clavija 2. El cable de señal (naranja) puede conectarse a cualquier clavija GPIO, pero prefiero utilizar la clavija 11 (GPIO17) porque está al lado de la clavija 9 y facilita un poco el cableado. Si utiliza un GPIO diferente, asegúrese de actualizar los scripts de ejemplo con el número correcto.

Ejemplo de Servo Script #1 de Python

Una vez conectado, la forma más fácil de poner en marcha tu servo es usar la librería Gpiozero en un script Python. Se instala por defecto en la última imagen de Raspbian.

Puedes usar este script Python:

12345678910111213141415161718181920de gpiozero import Servo de import time import sleepmyGPIO=17servo = Servo(myGPIO)while True:servo.mid()print((“mid”)sleep(0.5)servo.min()print((“min”)sleep(1)servo.mid()print()sleep(“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 Bitbucket usando :

wgethttps://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 utilice el siguiente comando :

python servo1.py

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

Ejemplo del Script #2 del Servo Python – Calibrando el Rango

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

Descubrí que con los ajustes por defecto mi servo sólo se movía +45/-45 grados. Cambié los parámetros de ancho de pulso para obtener 90 grados de rotación en cualquier dirección. El siguiente guión lo demuestra:

1234567891011121314141516171718192021222324de gpiozero import Servofrom time import sleepmyGPIO=17myCorrection=0.45maxPW=(2.0+myCorrection)/1000minPW=(1.0-myCorrection)/1000servo = 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()sleep(“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 Bitbucket usando :

wgethttps://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 utilice el siguiente comando :

python servo2.py

El servo debería ahora moverse entre sus posiciones mínima, media y máxima con un pequeño retardo en 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 máximo de pulso se incrementa desde el valor predeterminado de 2 en 0,45 a 2,45 ms. Esto le dio a mi servo un giro de 90 grados en ambas direcciones. Los valores “0,55” y “2,45” se dividen por 1000 para convertirlos en milisegundos.

No hay nada mágico en “0.45”. Era sólo la corrección que mejor funcionaba para mi servo.

Para calcular estos números empecé 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 pude 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 Servo Script #3 – Posicionamiento preciso

Una vez que se han determinado los valores de ancho de pulso mínimo y máximo, se puede utilizar la función “value” para posicionar el brazo del servoaccionamiento en cualquier lugar entre sus límites.

Si se ajusta el parámetro “value” a un número entre -1 y +1, el brazo se mueve entre sus posiciones mínima y máxima. Algunos ejemplos son..:

# Posición mínima valor servo=-1 # Punto medio valor servo=0 # Posición máxima valor servo=1 # Posición entre el punto medio y el máximo valor 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 :

123456789101112131415161717181920212223242526desde gpiozero import Servodesde la importación a la hora de importar sleepmyGPIO=17myCorrection=0maxPW=(2.0+myCorrection)/1000minPW=(1.0-myCorrection)/000minPW=(1.0-myCorrection)/0000servo = Servo(myGPIO,min_pulse_width=minPW,max_pulse_width_w,max_pulse_width=maxPW),mientras que True:print(“Set value0 a +1,0”) para valor en rango(0,21):value2=(float(value)-10)/10servo.value=value2print(value2)sleep(0.5)print(“Set value range +1.0 to -1.0”) para valor en rango(20,-1,-1):value2=(float(value)-10)/10servo.value=value2print(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 Bitbucket usando :

wgethttps://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 utilice el siguiente comando :

python servo3.py

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

El primer bucle “For” genera un conjunto de enteros entre 0 y 20. El valor tiene 10 restado de él para dar un rango de -10 a 10. El valor se divide finalmente por 10 para dar un rango de -1 a +1. El conjunto original de valores contenía 20 números enteros y todavía tenemos 20 pasos en la secuencia. Para aumentar el número de pasos a 40, sustituiría 20 por 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, puede generar aleatoriamente un número entre -1 y +1 para posicionar el brazo entre sus límites máximo y mínimo. ¿O tal vez moverlo basándose en la entrada de un sensor o joystick? Mientras pueda convertir el rango de valores de su sensor a un rango de -1 a +1, puede indicar el resultado usando un servo.

Consulte 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, incluyendo[Amazon] y[eBay].

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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *