Control Servo (PWM)#

Objetivo#

Utilizar la tarjeta DualMCU con el RP2040 para controlar un servo motor, logrando movimientos precisos a ángulos específicos. Esto incluye la capacidad de dirigir el servo en un rango definido o seguir una secuencia predefinida de movimientos.

Nota

En esta práctica, se utilizará el RP2040.

Descripción#

Esta sección proporciona recursos y código para el control de servomotores mediante MicroPython. Los servomotores, comunes en robótica y automatización, permiten gestionar la posición angular de un eje. Con MicroPython se dispone de una interfaz sencilla y eficiente para controlar los servomotores.

Requisitos#

Diagrama de conexión#

Conecta la UNIT DUALMCU al servomotor según el siguiente diagrama:

Block Diagram

Nota

Recuerda que en la DualMCU puedes intercambiar entre microcontroladores mediante un interruptor. Para esta práctica, usa el microcontrolador RP2040 cambiando el interruptor a la posición “A”.

Selector DualMCU

Código Fuente: PWM (unitRP2040_pwm.py)#

El siguiente código configura una salida para el servomotor en el GPIO 0:

 1'''
 2Unit Electronics 2023
 3             (o_
 4    (o_    //\
 5    (/)_   V_/_
 6tested code mark
 7    version: 0.0.1
 8    revision: 0.0.1
 9
10Código de prueba
11'''
12import machine
13import utime
14
15# Configuración del pin PWM
16pwm_pin = machine.Pin(0)  # Cambia a machine.Pin(1) si usas GPIO 1
17pwm = machine.PWM(pwm_pin)
18
19# Frecuencia del PWM en Hz (ajusta según tus necesidades)
20pwm.freq(1000)
21
22try:
23     while True:
24           # Ciclo de trabajo del PWM (0-65535: 0 apagado, 65535 encendido)
25           for duty_cycle in range(0, 65536, 5000):
26                pwm.duty_u16(duty_cycle)
27                utime.sleep(0.1)
28
29           # Efecto de atenuación inversa
30           for duty_cycle in range(65535, -1, -5000):
31                pwm.duty_u16(duty_cycle)
32                utime.sleep(0.1)
33
34except KeyboardInterrupt:
35     pwm.deinit()
36     print("\nPWM detenido. Recursos liberados.")
figura-gif

Código Fuente: Servo (unitRP2040_servo.py)#

El siguiente ejemplo controla un servomotor utilizando PWM a 50 Hz:

 1import machine
 2import utime
 3
 4# Configuración del pin de control del servomotor
 5servo_pin = machine.Pin(0)  # Cambia según tu conexión
 6
 7# Crea un objeto PWM para el servomotor
 8pwm_servo = machine.PWM(servo_pin)
 9pwm_servo.freq(50)  # Frecuencia para servomotores (~50 Hz)
10
11def set_servo_angle(angle):
12     # Convierte el ángulo (0-180°) a un ciclo de trabajo
13     duty_cycle = int(1024 + (angle / 180) * 3072)
14     pwm_servo.duty_u16(duty_cycle)
15
16try:
17     while True:
18           # Mueve el servomotor de 0 a 180°
19           for angle in range(0, 181, 10):
20                set_servo_angle(angle)
21                utime.sleep(0.1)
22
23           # Mueve el servomotor de 180 a 0°
24           for angle in range(180, -1, -10):
25                set_servo_angle(angle)
26                utime.sleep(0.1)
27
28except KeyboardInterrupt:
29     pwm_servo.deinit()
30     print("\nPWM detenido. Recursos liberados.")
figura-gif

Resultados#

El código demuestra la capacidad del RP2040 para controlar un servomotor mediante PWM, utilizando el pin GPIO 0 (ajustable) a 50 Hz, la frecuencia recomendada para servos.

Conclusiones#

La práctica con la tarjeta DualMCU - RP2040 y un servomotor introduce conceptos clave en el control de hardware a través de microcontroladores. Se cubren la configuración de pines, la generación de PWM y la conversión de ángulos a valores de ciclo de trabajo, proporcionando una base para proyectos avanzados de robótica y automatización.

Para profundizar en el control PWM, se sugiere experimentar con ejemplos del repositorio de la DualMCU.