Cómo controlar un servomotor con la Raspberry Pi
Comentariosⓘ Cet article peut avoir été partiellement ou totalement traduit à l'aide d'outils automatiques. Nous nous excusons des erreurs que cela pourrait engendrer.
Este tutorial es la tercera parte de un archivo dedicado a descubrir la electrónica con la Raspberry Pi. Si no lo has leído te aconsejo que consultes el primer tutorial para controlar un LED con la Raspberry Pi así como el segundo tutorial para usar un lector RFID con la Raspberry Pi.
Al iniciar la domótica, una necesidad clásica es controlar el movimiento físico en realidad desde un programa.
En este tutorial veremos cómo usar la Raspberry Pi para controlar un servomotor.
Accesorios para controlar un servomotor
Para poder seguir este tutorial y controlar un servomotor necesitaremos el siguiente material:
- Una frambuesa pi
- Su dieta
- Tarjeta micro SD
- Un servomotor (usaremos un SG90)
- Cables y resistencias Dupont
¿Cuál es la diferencia entre motor, servomotor y motor paso a paso?
Antes de empezar a conectar nuestro servomotor a nuestra Raspberry Pi, echemos un vistazo a los diferentes tipos de motores que se utilizan convencionalmente en electrónica.
Sin entrar en detalles, podemos dividir aproximadamente los motores utilizados en electrónica en tres categorías:
- El motor: Funciona mientras esté alimentado. Es adecuado cuando se desea realizar un movimiento continuo que no requiere una gran precisión.
- El motor paso a paso: gira en una especie de pequeños saltos sucesivos. Es decir que podrás pedirle que haga, por ejemplo, 50 saltos, o 112 saltos, que corresponderán a un determinado movimiento (por ejemplo un cuarto de vuelta). Es adecuado cuando se desea realizar un movimiento continuo con alta precisión (se utilizan por ejemplo en impresoras 3D).
- El servomotor: Gira en un ángulo determinado, definido según una señal de tipo PWM (Pulse Width Modulation). A menudo, los motores pequeños son limitados y no pueden hacer más de una revolución. Por tanto, se utilizan más bien para un movimiento corto de gran precisión.
Todavía habría muchas otras cosas que decir sobre estos diferentes motores, pero luego entraremos en cuestiones mecánicas que van mucho más allá del alcance de nuestro tutorial.
En nuestro caso vamos a utilizar un servomotor porque es el motor de precisión más fácil de controlar desde una Raspberry Pi.
Conecta un servomotor a la Raspberry Pi
Lo primero que debemos hacer para poder utilizar nuestro servomotor es conectarlo a la Raspberry Pi.
Los actuadores tienen 3 conectores eléctricos. Los colores pueden cambiar dependiendo del fabricante, pero generalmente encontrarás algo como:
- Un cable rojo, que sirve como fuente de alimentación.
- Un cable negro o marrón, que sirve como GDN.
- Otro cable, que se utiliza para transmitir la señal PWM controlando la posición del motor.
Por lo tanto, conectaremos estos diferentes cables a la Raspberry Pi, el cable rojo a un puerto GPIO de 5 voltios y el negro a un puerto GND.
Para el puerto PWM en cambio, necesariamente tendremos que conectarlo al pin GPIO 12 de la Raspberry Pi. De hecho, es el único pin GPIO que admite una señal PWM de forma predeterminada.
Entonces deberías tener un montaje como este.
Tenga en cuenta que aquí estamos alimentando nuestro servomotor directamente desde la Raspberry Pi. Esto funciona porque estamos usando un servomotor muy pequeño, pero en un modelo más grande necesitaríamos una fuente de alimentación dedicada.
Controla el servomotor en las líneas de comando
Ahora que hemos conectado nuestro servomotor, podremos manejarlo directamente desde la línea de comandos de Raspberry Pi.
Para ello, comenzaremos activando el modo PWM en el puerto 12, es decir GPIO 18 según la numeración del procesador.
gpio -o mode 18 pwm
Y activaremos el modo Mark / Space de PWM, que permite tener una señal más adecuada a nuestro uso.
gpio pwm-ms
Finalmente configuraremos la duración de un ciclo, las frecuencias a utilizar, etc.
El servomotor está configurado para funcionar a una frecuencia de 50 Hz, es decir, 20 ms. La señal de Raspberry Pi funciona en otra frecuencia, 19,2 MHz. Usando estas dos cifras, podemos calcular un período y un rango (gracias a ramboise314.fr por la fórmula):
50 = 19.2 * 10^6 / 192 / 2000
Por lo tanto, configuraremos la Raspberry Pi para que use estos valores:
gpio pwmc 192 gpio pwmr 2000
¡Finalmente, podremos poner nuestro motor en movimiento! Tenga en cuenta que no pasamos un ángulo al servomotor, sino un número que se convertirá en un ángulo. Nuestro servomotor va de 0 ° a 180 °. Después de algunas pruebas, parecería que 0 ° corresponde a 230, 90 ° a 150 y 180 ° a 70.
Para enviar nuestro motor a 90 ° usaremos el comando:
gpio -g pwm 18 150
Y reemplazaremos 150 por 230 para ir a 0 °, 70 para ir a 180 ° o cualquier valor intermedio que necesitemos.
Tenga en cuenta que estos pequeños motores soportan un ángulo de 180 ° de forma precisa, pero tienen un pequeño margen que puede hacer que giren 190 ° o 200 ° e incluso que den un giro completo si pones un valor suficientemente bajo. Es específico para cada modelo de motor.
Conduce el servomotor con Python
Al igual que con los tutoriales anteriores de esta serie, el objetivo es más bien controlar nuestro motor con Python en lugar de hacerlo directamente desde las líneas de comando. Considero que ahora tienes los conceptos básicos de Python, si no ve a leer los tutoriales anteriores, los enlaces están disponibles al principio de este artículo.
Para controlar nuestro motor desde un script de Python usaremos nuevamente la biblioteca Rpi.GPIO
.
En Python y en Pi, el ángulo del motor se calcula como un porcentaje del ciclo. Este porcentaje se denomina "ciclo de trabajo".
Una señal de 0.5ms corresponde a 0 ° y una señal de 2.5ms a 180 °. Sabiendo que nuestro ciclo es de 50 Hz, es decir, 20 ms, esto nos permite calcular el ciclo de trabajo para 0 ° y 180 ° así:
x = 0.5 / 20 y = 2.5 / 20
Luego encontramos que el ciclo de trabajo correspondiente a 0 ° es 0.025, o 2.5% y que el correspondiente a 180 ° es 0.125, o 12.5%.
Sin embargo, un pequeño problema, si este valor es teóricamente bueno, de hecho tiende a activar una revolución completa del motor para 0 ° … Por lo tanto, le recomiendo que use 4% para 0 °. El valor del 12,5% para 180 es bueno.
Para controlar el motor, solo necesitamos configurar el pin 12 como nuestra señal PWM y usar las funciones start
y ChangeDutyCycle
.
Por tanto, puede crear un archivo servo.py
y ponga el siguiente código allí:
#!/usr/bin/env python3
#-- coding: utf-8 --
import RPi.GPIO as GPIO
import time
#Set function to calculate percent from angle
def angle_to_percent (angle) :
if angle > 180 or angle < 0 :
return False
start = 4
end = 12.5
ratio = (end - start)/180 #Calcul ratio from angle to percent
angle_as_percent = angle * ratio
return start + angle_as_percent
GPIO.setmode(GPIO.BOARD) #Use Board numerotation mode
GPIO.setwarnings(False) #Disable warnings
#Use pin 12 for PWM signal
pwm_gpio = 12
frequence = 50
GPIO.setup(pwm_gpio, GPIO.OUT)
pwm = GPIO.PWM(pwm_gpio, frequence)
#Init at 0°
pwm.start(angle_to_percent(0))
time.sleep(1)
#Go at 90°
pwm.ChangeDutyCycle(angle_to_percent(90))
time.sleep(1)
#Finish at 180°
pwm.ChangeDutyCycle(angle_to_percent(180))
time.sleep(1)
#Close GPIO & cleanup
pwm.stop()
GPIO.cleanup()
Todo lo que tienes que hacer es ejecutar el script haciendo:
python3 ./servo.py
Luego, debería ver que el motor arranca a 0 °, luego cambia a 90 ° y finalmente se detiene a 180 °.
¡Todo lo que tiene que hacer es adaptar este script a sus propias necesidades!