Lección Teach
STM32 Mbed CodeIDE (7/8): control de posición de servo
El alumnado controla un servo con pulsos PWM de Mbed, prueba posiciones con seguridad y registra evidencia aproximada de movimiento en el montaje remoto STM32.
¿Primera vez en LabsLand? Crea tu cuenta de docente
Resultados de aprendizaje
Controlar una salida de servo con
PwmOutde Mbed.Mapear una lectura de potenciómetro a un ángulo aproximado.
Usar evidencia serie para apoyar una observación que puede ser difícil de juzgar visualmente.
Vista previa de la actividad del estudiante
Contenido de la actividad
Solo vista previa. En una sesión de clase, los estudiantes pueden completar respuestas y entregar su trabajo al docente.
Conceptos básicos de ancho de pulso de servo
10 min
Algunas salidas deben moverse, no solo iluminarse. Los servos se usan cuando un controlador necesita apuntar, abrir, dirigir, bloquear o posicionar algo de forma repetible. En esta lección, conectarás la orden de posición del servo con una lectura de potenciómetro.
PWM para un LED cambia el brillo medio. Un servo también usa pulsos repetidos, pero el valor importante es el ancho del pulso:
- unos 700 microsegundos: un lado amplio del recorrido
- unos 1500 microsegundos: centro
- unos 2300 microsegundos: el otro lado amplio del recorrido
En Mbed, la señal de servo se produce con PwmOut. servo.period_ms(20) fija el periodo de repetición habitual de 20 ms, y servo.pulsewidth_us(...) cambia el ancho del pulso alto que el servo interpreta como posición.
El ángulo mecánico exacto puede variar. Esta lección se mantiene deliberadamente dentro del rango conservador 700-2300 us, incluido en el rango más amplio ya ejercitado en este montaje remoto. No ordenes valores fuera de 700-2300 us. Si el brazo vibra de forma continua, parece presionar un tope o no se estabiliza, termina la ejecución y avisa al docente en vez de ampliar el rango.
Tu tarea es mostrar una relación controlada: un valor bajo del potenciómetro da una posición amplia, un valor alto da otra y la salida serie coincide con tu mapeo.
La cámara puede mostrar el servo solo como un brazo pequeño en la placa de entrenamiento. Trata angle como una estimación calculada por tu código. La evidencia más fuerte es la combinación de pulse_us serie, estimación de ángulo serie y un cambio visible amplio en la posición del servo.
Lista de pines y evidencias para esta lección:
- Salida de señal de servo: PA_15
- Potenciómetro usado después: Pot. pot2 -> PC_1
- Evidencia serie requerida: pulse_us
- Evidencia de cámara: cambio amplio de posición del servo, no una medición precisa de ángulo
Del potenciómetro al pulso del servo
Usa la cámara para evidencia de posición amplia y la consola para evidencia
exacta de pulse_us. El diagrama muestra el recorrido de la orden, no un ángulo preciso.
Si tu código mapea un valor bajo del potenciómetro a 700 microsegundos y un valor alto a 2300 microsegundos, ¿qué debería ocurrir al mover el potenciómetro de bajo a alto?
Ejecutar una prueba de tres posiciones
20 min
Abre el laboratorio STM32 Mbed CodeIDE.
Abre
main.cpp.Reemplaza el archivo con el programa siguiente.
Guarda, compila y carga.
Observa la cámara y la consola a la vez.
Busca tres posiciones amplias del servo.
Registra los anchos de pulso serie y lo que observaste.
#include "mbed.h"
PwmOut servo(PA_15);
void set_servo_us(int pulse_us) {
servo.pulsewidth_us(pulse_us);
}
int main() {
servo.period_ms(20);
printf("Servo three-position test start\n");
while (true) {
set_servo_us(700);
printf("pulse_us=700 position=low\n");
ThisThread::sleep_for(2000ms);
set_servo_us(1500);
printf("pulse_us=1500 position=middle\n");
ThisThread::sleep_for(2000ms);
set_servo_us(2300);
printf("pulse_us=2300 position=high\n");
ThisThread::sleep_for(2000ms);
}
}
Rellena tres filas, una por cada ancho de pulso fijo: 700 us, 1500 us y 2300 us. Ancho de pulso es un número en microsegundos (us); Posición impresa es la etiqueta exacta de consola; y Movimiento o posición observado es solo una descripción amplia de cámara. Si no se ve bien, elige poco clara y describe lo visible sin inventar un ángulo. Deja totalmente vacías las filas adicionales no usadas.
Tabla de anchos de pulso fijos de servo
Completa las filas de 700 us, 1500 us y 2300 us. Deja vacías las filas adicionales no usadas.
| Ancho de pulso us | Posición impresa | Movimiento o posición observado | Confianza |
|---|---|---|---|
Mapear potenciómetro a ángulo de servo
22 min
Ahora mapea AnalogIn PC_1 a un ángulo y un ancho de pulso aproximados. Usa el deslizador Pot. pot2 para PC_1.
Reemplaza
main.cppcon el programa siguiente.Completa TODO 1 para mapear una lectura 0.0-1.0 a 700-2300 microsegundos.
Completa TODO 2 para escribir el ancho de pulso mapeado en el servo.
Guarda, compila y carga. Es la compilación prevista 2 de 2.
Mueve el deslizador
Pot. pot2a posiciones baja, media y alta.Registra porcentaje, ángulo estimado, ancho de pulso y movimiento observado.
#include "mbed.h"
AnalogIn pot(PC_1);
PwmOut servo(PA_15);
int main() {
servo.period_ms(20);
printf("Potentiometer servo control start\n");
while (true) {
float reading = pot.read();
int percent = (int)(reading * 100.0f);
int angle = (int)(reading * 180.0f);
// TODO 1: sustituye 700 por el mapeo completo de 700-2300 us.
int pulse_us = 700;
// TODO 2: sustituye 700 por la variable pulse_us mapeada.
servo.pulsewidth_us(700);
printf("percent=%d angle=%d pulse_us=%d\n",
percent,
angle,
pulse_us);
ThisThread::sleep_for(500ms);
}
}
Completa los tres casos: posiciones baja, media y alta. Porcentaje serie usa %; Estimación de ángulo serie es un cálculo en grados, no una medida de cámara; Ancho de pulso serie usa microsegundos (us); y el campo de cámara solo registra posición amplia. Deja totalmente vacías las filas adicionales no usadas.
Tabla de evidencia de potenciómetro a servo
Completa filas baja, media y alta con valores de consola y evidencia amplia de cámara. Deja vacías las filas adicionales.
| Posición del potenciómetro | Porcentaje serie % | Estimación de ángulo serie grados | Ancho de pulso serie us | Posición de servo observada |
|---|---|---|---|---|
Usa tus filas baja, media y alta para explicar si el potenciómetro controló el servo como se esperaba. Incluye la tendencia serie de pulse_us y la observación amplia de la cámara.
Enviar tu código
8 min
Adjunta tu main.cpp final guardado
Pulsa Comprobar archivos guardados, confirma que main.cpp contiene la versión de servo controlado por potenciómetro y luego pulsa Adjuntar código guardado. Después de adjuntar el código, pulsa Enviar entrega al final de la actividad.