Controlar un servo con Raspberry Pi Pico W y PWM

Un servo es una de las formas más fundamentales para aprender a utilizar la modulación por ancho de pulso (PWM) con la Raspberry Pi. En este artículo, voy a mostrar cómo hacerlo con una Raspberry Pi Pico W.

Objetivos del tutorial PWM

Un servo con un Pico W y PWM
  • Aprende a utilizar el PWM para controlar el ángulo del servo
  • Configurar un servidor con el Pico W
  • El servidor entrega una página web con un deslizador para controlar el servo

Piezas necesarias

  • Raspberry Pi Pico W con cabezales
  • Cable de puente
  • Servo (estamos usando el micro servo Tower Pro SG90)

¿Qué es la modulación por ancho de pulso?

A los niños les divierte encender y apagar las luces repetidamente.

Para ellos, es muy divertido ver cómo las luces se encienden y se apagan al pulsar el interruptor. Puede que a los padres no les parezca divertido, pero es un momento de aprendizaje para todos.

Si usted o sus hijos lo han hecho, entonces han experimentado una forma primitiva de modulación por ancho de pulso.

Con una Raspberry Pi, puedes hacer esto fácilmente de forma automatizada. En esencia, le dirías a la Raspberry Pi cuántas veces quieres que las cosas estén "encendidas" en un período específico.

Esto permite atenuar los LEDs:

control remoto gpio pwm de picockpit
Conmutación del brillo del LED con la función PWM de PiCockpit

Además, esto te permite controlar el ángulo del brazo del servo.

Un concepto importante de PWM: el ciclo de trabajo

Un ciclo de trabajo es básicamente el tiempo que el circuito permanece "alto", lo que significa que está encendido.

Por lo tanto, digamos que su circuito está encendido la mitad del tiempo. Por lo tanto, podemos decir que el ciclo de trabajo está en 50%.

Si lo tienes encendido todo el tiempo, su ciclo de trabajo estaría en 100%, y viceversa, apagado todo el tiempo significa un 0

Ilustración del ciclo de trabajo de Sparkfun (CC BY-SA 4.0)

Volviendo al ejemplo de un niño que enciende y apaga las luces a un ritmo regular, la razón por la que las luces no se encienden del todo o se atenúan del todo es porque sólo estamos entregando una salida de voltaje durante una porción específica de tiempo.

En el caso de un LED, esto significa que el LED se enciende durante un período de tiempo, luego se retira la energía, se vuelve a suministrar energía y se repite.

Por lo tanto, el LED nunca se ilumina lo suficiente como para alcanzar su máxima luminosidad, ni tiene tiempo suficiente para oscurecerse por completo.

Servocontrol SG90 con PWM

Aquí hay que ser cauteloso ya que no todos los servos funcionan de la misma manera. Este tutorial es específico para el micro servo Tower Pro SG90.

El SG90 tiene una rotación de 180 grados, pero algunos servos son de 120 grados. Los servos de radiocontrol para aficionados suelen ser servos de 120 grados, así que asegúrate de comprobar la hoja de datos del servo que quieres manipular, ya que es posible dañar los servos si le das una señal fuera de rango.

Esta es la hoja de datos del SG90, de Luxor Parts:

La hoja de datos le indica dos cosas importantes: qué color corresponde al positivo, a la masa y a la señal y la frecuencia de los impulsos/ciclo de trabajo.

  • Marrón = negativo
  • Rojo = positivo
  • Naranja = señal

Y para la frecuencia de impulsos/ciclo de trabajo

  • Deberá tener un ciclo de trabajo de 20ms o 50Hz.
  • Una señal de 1ms = cero grados
  • Una señal de 2ms = 180 grados de rotación
Con una señal de 1ms, el servo gira cero grados.

Esto significa que cada ms, el servo buscará una actualización. Si continúas enviándole una señal de 2ms, se mantendrá en la rotación completa (180 grados). Si lo cambias a 1,5ms, girará 90 grados, y a 1ms, girará cero grados.

Con una señal de 2ms, el servo gira 180 grados.

Conexión del servo al Pico W

Para utilizar nuestro código, hay que conectar el cable de señal a GPIO 0. El cable de señal es el cable naranja en el SG90.

A continuación, conecte el cable rojo a VBUS (que le da 5V). Como puedes ver en la hoja de datos, el voltaje de funcionamiento del SG50 es de 4,8V a 6V, por lo que el pin de 3,3V del Pico W no funcionará.

Codificación del servocontrol de Pico W

Puedes encuentre el código aquí en nuestro GitHub.

Repasemos el código.

En main.pyque es una convención de nombres para el archivo que queremos ejecutar en el arranque, creamos una clase para el servo y la instanciamos:


class Servo:
    def __init__(self, MIN_DUTY=300000, MAX_DUTY=2300000, pin=0, freq=50):
        self.pwm = machine.PWM(machine.Pin(pin))
        self.pwm.freq(freq)
        self.MIN_DUTY = MIN_DUTY
        self.MAX_DUTY = MAX_DUTY
        
    def rotateDeg(self, deg):
        if deg < 0:
            deg = 0
        elif deg > 180:
            deg = 180
        duty_ns = int(self.MAX_DUTY - deg * (self.MAX_DUTY-self.MIN_DUTY)/180)
        self.pwm.duty_ns(duty_ns)

servo = Servo()

La clase Servo utiliza la clase machine.PWM disponible en MicroPython. Consulte la documentación aquí.

En este ejemplo, estamos utilizando el Pico W como punto de acceso. Aquí está el código para hacer que eso suceda:

ssid = 'Servo-Control'
password = 'PicoW-Servo'

ap = network.WLAN(network.AP_IF)
ap.config(essid=ssid, password=password)
ap.active(True)

while ap.active() == False:
  pass

print('Connection successful')
print(ap.ifconfig())

Como puedes ver en las dos primeras líneas, el SSID que buscas es Servocontrol y la contraseña es PicoW-Servo.

Una vez que haya iniciado sesión en la red WiFi, puede ir a la dirección IP del Pico W, que por defecto es 192.168.4.1. Como alternativa, también puede comprobar el registro en Thonny para ver cuál es la dirección IP de su Pico.

¿Cómo se comunica la página web con el servo?

Control del servo deslizador

Cuando te conectas a la dirección IP de Pico W, se te envía el archivo index.html, que puedes encontrar en el repo de Github.

El archivo index.html tiene estas líneas importantes:

 <form id="form">
            <input type="range" class="slider" min="0" max="180" value="slider_value" name="servo" id="servo">
            <output></output>
        </form>

Como puedes ver, hay un objeto que es el deslizador.

También hay un que muestra el grado de rotación.

La parte JavaScript actualiza la así como actualiza la URL para que el Pico W pueda capturar los datos y girar el servo.

Los elementos y tienen un padre .

Aquí está el script en la parte delantera,