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:

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”.

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.")

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.")

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.