Motores Servo con CircuitPython

Para poder utilizar motores tipo servo, vamos a utilizar pulseio. En teoría uno puede realizar llamadas directas a pulseio para definir una frecuencia de 50 Hz y con eso definir el ancho de los pulsos. ¡Pero preferimos hacerlo un poco más elegante y sencillo!

Así que en cambio, ¡vamos a utilizar adafruit_motor la cual te maneja los motores tipo servo de buena manera! adafruit_motor es una librería, ¡así que asegúrate de obtenerla del compilado de liberías si no lo has hecho! Si necesitas ayuda con la instalación puedes revisar la página de Librerías de CircuitPython.

Los servos vienen en dos tipos: 

  • Un servo estándar para hobbies - el puntero se mueve 180 grados (90 grados en cada dirección desde cero grados).
  • Un servo de rotación continua - el puntero se mueve una rotación completa como un motor DC. En lugar de indicarse un ángulo, se define una velocidad de movimiento donde 1.0 es toda velocidad hacia adelante, 0.5 la mitad de la velocidad hacia adelante, 0 detenido, -1 es toda velovidad en reversa con sus valores intermedios.

Cableando los Servos

¡Los servos solo funcionan en pines con capacidad de PWM! Revisar los detalles de tu tarjeta para verificar cuales pines tienen salida de PWM.

Las conecciones para un servo son igual para cualquiera de los dos tipos.

Conecte el cable de tierra café o negro hacia la tierra de la tarjeta CircuitPython.

Conecte el cable rojo del servo hacia alimentación de 5V, donde un alimentado por USB es suficiente para uno o dos servos. Para más de eso, necesitas baterías externas. ¡No utilice 3.3V para alimentar un servo!

Conecte el cable amarillo o blanco del servo hacia el pin de control/datos, en este caso A1 o A2, pero puedes usar cualquier pin con capacidades de PWM.

Por ejemplo, para cablear un servo a una Trinket, conecte el cable de tira a GND y el de poder a USB, y el de señal a 0.

Recuerde, en las Trinket, A2 está etiquetado como "0".

Para las Gemma, utilice cables de lagarto para conectar el cable de tierra a GND, el de alimentación a VOUT, y el de señal a A2.

Para las Circuit Playground Express y Circuit Playground Bluefruit, utilice cables de lagarto para conectar el cable de tierra a GND, el de alimentación a VOUT y el de señal hacia A2.

Para tarjetas como las Feather M0 Express, ItsyBitsy M0 Express y Metro M0 Express, conecte el cable de tierra a GND, el de alimentación hacia USB o 5V, y el de señal hacia A2.

Para las  Metro M4 Express, ItsyBitsy M4 Express y las Feather M4 Express, conecte el cable de tierra hacia cualquier  G o GND, el de alimentación hacia USB or 5V, y el cable de señal hacia A1.

Código para Servos Estándar

Con este ejemplo el servo va a mover el puntero conectado al pin A2 desde 0 grados hasta 180 grados (-90 a 90 grados) y de regreso:

import time
import board
import pulseio
from adafruit_motor import servo

# create a PWMOut object on Pin A2.
pwm = pulseio.PWMOut(board.A2, duty_cycle=2 ** 15, frequency=50)

# Create a servo object, my_servo.
my_servo = servo.Servo(pwm)

while True:
    for angle in range(0, 180, 5):  # 0 - 180 degrees, 5 degrees at a time.
        my_servo.angle = angle
        time.sleep(0.05)
    for angle in range(180, 0, -5): # 180 - 0 degrees, 5 degrees at a time.
        my_servo.angle = angle
        time.sleep(0.05)

Servo de Rotación Continua

Hay dos diferencias entre los servos de Rotación Continua y los servos Estándar:

  1. El objeto servo se crea de forma my_servo = servo.ContinuousServo(pwm) en lugar de my_servo = servo.Servo(pwm)
  2. En lugar de usar myservo.angle, se usa my_servo.throttle con un valor de velocidad de 1.0 (toda velocidad) a 0.0 (detenido) y hasta  -1.0 (toda velocidad en reversa). Cualquier número intermedio sería la velocidad parcial hacia adelante (valor positivo) o en reversa (valor negativo). Esto es muy similar al uso típico de un motor DC controlado con la librería de adafruit_motor.

Este ejemplo se mueve con toda velocidad hacia adelante durante dos segundos, se detiene por dos segundos, luego en toda velocidad en reversa por dos segundos, y luego se detiene por 4 segundos.

# Continuous Servo Test Program for CircuitPython
import time
import board
import pulseio
from adafruit_motor import servo

# create a PWMOut object on Pin A2.
pwm = pulseio.PWMOut(board.A2, frequency=50)

# Create a servo object, my_servo.
my_servo = servo.ContinuousServo(pwm)

while True:
    print("forward")
    my_servo.throttle = 1.0
    time.sleep(2.0)
    print("stop")
    my_servo.throttle = 0.0
    time.sleep(2.0)
    print("reverse")
    my_servo.throttle = -1.0
    time.sleep(2.0)
    print("stop")
    my_servo.throttle = 0.0
    time.sleep(4.0)

¡Muy sencillo!

Ahora asumamos que 0 grados es 0.5ms y 180 es un multo de 2.5ms. Esto es más amplio que el valor oficial de 1ms a 2ms de ancho de pulsos. Si tienes un servo que utilice un rango diferente, puedes inicializar el valor en el objeto servo con un diferente mínimo (min_pulse) y máximo (max_pulse). Por ejemplo:

servo = adafruit_motor.servo.Servo(pwm, min_pulse = 500, max_pulse = 2500) 

Para información más detallada sobre utilizar servos con CircuitPython, ¡puedes visitar la sección de CircuitPython en la guía de Servos!

This guide was first published on Jun 24, 2020. It was last updated on Jun 24, 2020.
This page (Motores Servo con CircuitPython) was last updated on Jun 24, 2020.