Proyecto 15:Servo

1. Descripción
Los coches inteligentes DIY suelen incluir la función de evitación automática de obstáculos. En el proceso de montaje, necesitamos un servo para controlar que el módulo ultrasónico gire a la izquierda y a la derecha, y luego detectar la distancia entre el coche y el obstáculo, para poder controlar el coche y evitar el obstáculo.
Si se utilizan otros microcontroladores para controlar la rotación del servo, es necesario establecer una cierta frecuencia y anchura de pulso para controlar el ángulo del servo. Pero si se utiliza la placa principal micro:bit para controlar el ángulo del servo, basta con fijar el ángulo de control en el entorno de desarrollo; el pulso correspondiente se generará automáticamente para controlar la rotación del servo. En este proyecto aprenderás a controlar el servo para que oscile entre 0° y 90°.
El servomotor es un actuador giratorio de control de posición, que consiste principalmente en la carcasa, la placa de circuito, el motor sin núcleo, los engranajes y el sensor de posición. Su principio de funcionamiento es que el servo recibe la señal enviada por el MCU o el receptor, genera una señal de referencia con un periodo de 20 ms y una anchura de 1,5 ms, luego compara la tensión continua adquirida con la tensión del potenciómetro y obtiene la diferencia de tensión de salida.
Para el servo usado en este proyecto, el cable marrón es tierra, el rojo es positivo y el naranja es el cable de señal.

2. Información del Servo
El ángulo de rotación del servomotor se controla regulando el ciclo de trabajo de la señal PWM (modulación por ancho de pulso). El ciclo estándar de la señal PWM es 20 ms (50 Hz). Teóricamente, la anchura se distribuye entre 1 ms y 2 ms, pero en la práctica está entre 0.5 ms y 2.5 ms. La anchura corresponde al ángulo de rotación de 0° a 180°. Tenga en cuenta que para motores de distintas marcas, la misma señal puede dar lugar a ángulos de rotación diferentes.

Tras mediciones, el rango de pulso del servo es de 0,65 ms a 2,5 ms. Para un servo de 180 grados, la relación de control correspondiente es la siguiente:
Time on High Level |
Angle of the Servo |
Reference Signal Cycle Time(20ms) |
|---|---|---|
0.65ms |
0 degree |
0.65ms high level+19.35ms low level |
1.5ms |
90 degrees |
1.5ms high level+18.5ms low level |
2.5ms |
180degrees |
2.5ms high level+17.5ms low level |
3. Parámetros
Voltaje de trabajo: DC 4.8V ~ 6V
Rango de ángulo operativo: aproximadamente 180 ° (a 500 → 2500 μsec)
Dimensiones: 22.9*12.2*30mm
Rango de ancho de pulso: 500 → 2500 μsec
Velocidad sin carga: 0.12 ± 0.01 s / 60 (DC 4.8V), 0.1 ± 0.01 s / 60 (DC 6V)
Corriente sin carga: 200 ± 20mA (DC 4.8V), 220 ± 20mA (DC 6V)
Par de retención: 1.3 ± 0.01kg · cm (DC 4.8V), 1.5 ± 0.1kg · cm (DC 6V)
Corriente en parada: ≦ 850mA (DC 4.8V) ≦ 1000mA (DC 6V)
Corriente de reposo: 3 ± 1mA (DC 4.8V), 4 ± 1mA (DC 6V)
Peso: 9±1g (sin cuerno del servo)
Temperatura de trabajo: -30℃~60℃
Debe tenerse en cuenta que no utilice la alimentación de un ordenador, porque si la demanda de corriente es superior a 500 mA, el servo puede quemarse. Se recomienda usar una batería externa para la alimentación.
4. Preparación
Inserte la placa micro:bit en la ranura del keyestudio 4WD Mecanum Robot Car V2.0
Coloque las pilas en el portapilas
Lleve el interruptor de alimentación a la posición ON
Conecte el micro:bit al ordenador mediante un cable USB
Abra la versión sin conexión de Mu.
5. Código de prueba
Abra el software Mu y abra el archivo “Servo.py” para importar el código. También puede introducir el código en la ventana del editor manualmente.
(Nota: Todas las palabras y símbolos en inglés deben escribirse en inglés.)
Haga clic en “Check” para comprobar errores en el código. El programa se considera erróneo si aparecen subrayados o cursores.
Si el código es correcto, conecte el micro:bit al ordenador y haga clic en “Flash” para descargar el código a la placa micro:bit.

from microbit import *
class Servo:
def __init__(self, pin, freq=50, min_us=600, max_us=2400, angle=180):
self.min_us = min_us
self.max_us = max_us
self.us = 0
self.freq = freq
self.angle = angle
self.analog_period = 0
self.pin = pin
analog_period = round((1/self.freq) * 1000) # hertz to miliseconds
self.pin.set_analog_period(analog_period)
def write_us(self, us):
us = min(self.max_us, max(self.min_us, us))
duty = round(us * 1024 * self.freq // 1000000)
self.pin.write_analog(duty)
sleep(100)
self.pin.write_analog(0)
def write_angle(self, degrees=None):
if degrees is None:
degrees = math.degrees(radians)
degrees = degrees % 360
total_range = self.max_us - self.min_us
us = self.min_us + total_range * degrees // self.angle
self.write_us(us)
Servo(pin14).write_angle(0)
display.show(Image.HAPPY)
while True:
Servo(pin14).write_angle(0)
sleep(1000)
Servo(pin14).write_angle(45)
sleep(1000)
Servo(pin14).write_angle(90)
sleep(1000)
Servo(pin14).write_angle(135)
sleep(1000)
Servo(pin14).write_angle(180)
sleep(1000)
4. Resultado de la prueba
Después de descargar el código a la placa con éxito, alimente externamente (mueva el interruptor DIP a ON) y presione el botón de reinicio en el micro:bit.

La matriz de LED muestra un patrón sonriente y el servo gira en el patrón 0°~45°~90°~135°~180°~0°.