Tutorial #5 de Raspberry Pi Pico: el servomotor

En este tutorial te enseñaremos como programar tu Raspberry Pi Pico para usar un servomotor. Un servomotor es un motor DC con unos engranes y un circuito de control que te permite dar movimiento a tus proyectos fácilmente. Para utilizarlo necesitas enviar una señal PWM con una frecuencia especificada por el fabricante del servo, de modo que el servomotor pueda interpretar la señal y darle dirección al motor. Para desarrollar este tutorial necesitarás:

  • Raspberry Pi Pico
  • Cable micro USB
  • Protoboard
  • Micro servo SG90
  • Potenciómetro de 10 KOhms
  • Jumpers M-M

En este primer ejemplo trataremos de mover el servomotor a lo largo de todo su rango de movimiento. Para ello necesitamos cambiar poco a poco el ancho de pulso de la señal de salida, desde su valor mínimo hasta el máximo. La configuración empieza declarando el pin de salida y asignando la función PWM con PWM(). Después debemos declarar la frecuencia de la señal; la mayoría de los servos usan una señal de 50 Hz, lo que equivale a un periodo de 20ms. La señal que vamos a enviar tiene un pulso alto con una duración de entre 1 ms a 2 ms y el resto es bajo. Esto se traduce a un valor mínimo de PWM de 2000 y uno máximo de 9000.

Por último, con un ciclo for le decimos que vaya de ida y regreso diez veces a lo largo del rango. Dentro del ciclo for le indicamos que vaya incrementando poco a poco el ciclo de trabajo y luego, al llegar al máximo, lo decremente. El código que se muestra a continuación puede llamarse sweep.py en alusión a un barrido de movimiento.

Código

import machine
from utime import sleep

pin = machine.Pin(15)
pwm = machine.PWM(pin)
pwm.freq(50)

min = 2000
max = 9000

for _ in range(10):
    for duty in range(min, max):
        pwm.duty_u16(duty)
    
    sleep(0.5)

    for duty in range(max, min, -1):
        pwm.duty_u16(duty)
       
    sleep(0.5)

Para seguir leyendo…

Diagrama de conexiones

El cable blanco es la señal que va al servomotor. El rojo va al pin 40 de la Pico (5V) y el verde va a tierra. Vía: 330ohms

Controlando el servo con un potenciómetro

Cuando entendemos como funciona el control del servomotor podemos usar un potenciómetro para determinar el ancho de pulso que asignamos al servomotor. En este caso, necesitamos hacer una conversión para tomar el valor del convertidor analógico y el servo lo pueda leer. Para ello usamos un factor de conversión y lo sumamos al valor mínimo del ancho de pulso. Para que enviemos valores decimales, usamos la función round() y así obtendremos un valor entero.

Código para Thonny

import machine
from utime import sleep

pin = machine.Pin(15)
pwm = machine.PWM(pin)
pwm.freq(50)
potentiometer = machine.ADC(26)

min = 2000
max = 9000
conversion_factor = 0.10681

while True:
    pot = potentiometer.read_u16()
    duty = pot * conversion_factor + min
    duty = round(duty)
    #print(duty)
    pwm.duty_u16(duty)
    sleep(0.05)  
Añadimos un potenciómetro al pin 31 de la Pico, como en ejemplos anteriores. Vía: 330ohms

Conclusiones:

En esta entrada aprendimos un poco sobre los servomotores. Aprendimos a generar una señal de control de 50Hz para controlar la posición del servo, mandando una señal con un ancho de pulso de 1 a 2 ms. Por último, asociamos los aprendizajes obtenidos con la lectura de una señal analógica para controlar el servo.

Referencias:

Scripting electronic components with Raspberry Pi Pico and MicroPython