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.
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
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 500 microsegundos: un extremo del recorrido
- unos 1500 microsegundos: centro
- unos 2500 microsegundos: otro extremo 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. Tu tarea es mostrar una relación controlada: un valor bajo del potenciómetro da una posición, 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
Servo, Pot. pot2 y evidencia serie
Usa la cámara para evidencia de posición amplia y la consola para evidencia exacta de ancho de pulso. No afirmes ángulos mecánicos precisos solo a partir de la vista de cámara.
Si tu código mapea un valor bajo del potenciómetro a 500 microsegundos y un valor alto a 2500 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(500);
printf("pulse_us=500 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(2500);
printf("pulse_us=2500 position=high\n");
ThisThread::sleep_for(2000ms);
}
}
Rellena tres filas, una por cada ancho de pulso fijo: 500 us, 1500 us y 2500 us. Copia el ancho de pulso impreso y la posición impresa. En la columna Confianza, escribe clara, parcial o poco clara según si la cámara mostró un cambio visible de posición. Si el movimiento no se ve claro, escribe poco clara y describe lo que sí pudiste ver en vez de inventar un ángulo preciso.
Tabla de anchos de pulso fijos de servo
| Ancho de pulso | 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.Guarda, compila y carga.
Mueve el deslizador
Pot. pot2a posiciones baja, media y alta.Registra el porcentaje, ángulo, 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);
int pulse_us = 500 + (int)(reading * 2000.0f);
servo.pulsewidth_us(pulse_us);
printf("percent=%d angle=%d pulse_us=%d\n",
percent,
angle,
pulse_us);
ThisThread::sleep_for(500ms);
}
}
Rellena tres filas para posiciones baja, media y alta del potenciómetro. Copia el porcentaje, la estimación de ángulo y el ancho de pulso impresos antes de juzgar el movimiento. El valor serie pulse_us es evidencia obligatoria; la observación de cámara es solo una comprobación amplia de posición.
Tabla de evidencia de potenciómetro a servo
| Posición del potenciómetro | Porcentaje serie | Estimación de ángulo serie | pulse_us serie | 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.