Teach lesson
STM32 Mbed CodeIDE (7/8): controle de posição do servo
Os alunos controlam um servo pelas larguras de pulso PWM do Mbed, testam posições com segurança e registram evidências de movimento aproximado na configuração remota STM32.
New to LabsLand? Create your teacher account
Learning Outcomes
Controlar a saída de um servo com
PwmOutdo Mbed.Mapear a leitura de um potenciômetro para um ângulo aproximado.
Usar evidências seriais para complementar uma observação que pode ser difícil de avaliar visualmente.
Student activity preview
Activity Content
Preview only. In a class session, students can fill in responses and submit their work to the teacher.
Noções básicas de largura de pulso de servo
10 min
Algumas saídas devem se mover, não apenas acender. Servos são usados quando um controlador precisa apontar, abrir, direcionar, travar ou posicionar algo de maneira repetível. Nesta lição, você conectará o comando de posição do servo a uma leitura do potenciômetro.
PWM para um LED altera o brilho médio. Um servo também usa pulsos repetidos, mas o valor importante é a largura do pulso: as lições
- cerca de 700 microssegundos: uma extremidade aproximada do deslocamento
- cerca de 1500 microssegundos: meio
- cerca de 2.300 microssegundos: a outra extremidade aproximada do deslocamento
Em Mbed, o sinal do servo é produzido com PwmOut. servo.period_ms(20) define o período de repetição usual de 20 ms e servo.pulsewidth_us(...) altera a largura do pulso alto que o servo interpreta como posição.
O ângulo mecânico exato pode variar. Esta lição permanece deliberadamente dentro da faixa conservadora de exercícios 700-2300 us, que está dentro da faixa mais ampla já exercida nesta configuração remota. Não comande valores fora de 700-2300 us. Se o braço vibrar continuamente, parecer forçar um batente ou não se estabilizar após um movimento, encerre a execução e avise o instrutor em vez de ampliar a faixa.
Seu trabalho é mostrar uma relação controlada: o valor baixo do potenciômetro fornece uma posição ampla, o valor alto fornece uma posição diferente e a saída serial corresponde ao seu mapeamento.
A câmera pode mostrar o servo apenas como um braço pequeno na placa de treinamento. Trate angle como uma estimativa calculada pelo seu código. A evidência mais forte é a combinação de pulse_us serial, estimativa de ângulo serial e uma mudança visível na posição ampla do servo.
Lista de verificação de pinos e evidências para esta lição:
- Saída de sinal de servo: PA_15
- Potenciômetro usado posteriormente: Pot. pot2 -> PC_1
- Evidência serial necessária: pulse_us
- Evidência da câmera: ampla mudança de posição do servo, não um ângulo medido preciso
Do potenciômetro a um servo pulso
Use a câmera para evidências de posição ampla e o console para
pulse_us. O diagrama mostra o caminho do comando, não um ângulo preciso.
Se o código mapear um valor baixo do potenciômetro para 700 microssegundos e um valor alto para 2.300 microssegundos, o que deverá acontecer ao mover o potenciômetro de baixo para alto?
Execute um teste de três posições
20 min
Abra o laboratório STM32 Mbed CodeIDE.
Abra
main.cpp.Substitua o arquivo pelo programa abaixo.
Salve, compile e faça o upload.
Observe a câmera e o console juntos.
Observe três posições distintas do servo.
Registre as larguras de pulso serial e o que você observou.
#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);
}
}
Preencha três linhas, uma para cada largura de pulso fixa: 700 us, 1.500 us e 2.300 us. Largura de pulso é um número em microssegundos (us); Posição impressa é o rótulo exato do console; e Movimento ou posição observada é apenas uma descrição geral do que aparece na câmera. Se o movimento não estiver nítido, escolha pouco claro e descreva o que conseguiu ver em vez de inventar um ângulo preciso. Deixe as linhas extras não utilizadas completamente em branco.
Tabela fixa de largura de pulso do servo
Complete linhas de 700 us, 1500 us e 2300 us. Deixe as linhas extras não utilizadas em branco.
| Largura de pulso us | Posição impressa | Movimento ou posição observado | Confiança |
|---|---|---|---|
Mapear o potenciômetro para o ângulo do servo
22 min
Agora mapeie a leitura de AnalogIn em PC_1 para um ângulo e uma largura de pulso aproximados. Use o controle deslizante Pot. pot2, associado a PC_1.
Substitua
main.cpppelo programa abaixo.Complete TODO 1 para mapear uma leitura de 0,0-1,0 para 700-2300 microssegundos.
Complete TODO 2 para que a largura de pulso mapeada seja gravada no servo.
Salve, compile e faça o upload. Esta é a compilação planejada 2 de 2.
Mova o controle deslizante
Pot. pot2para as posições baixa, média e alta.Registre a porcentagem impressa, o ângulo estimado, a largura do pulso e o movimento 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: substitua 700 pelo mapeamento completo de 700-2300 us.
int pulse_us = 700;
// TODO 2: substitua 700 pela variável pulse_us mapeada.
servo.pulsewidth_us(700);
printf("percent=%d angle=%d pulse_us=%d\n",
percent,
angle,
pulse_us);
ThisThread::sleep_for(500ms);
}
}
Preencha os três casos necessários: posições baixa, média e alta do potenciômetro. Porcentagem serial usa a unidade %; estimativa serial do ângulo é um valor calculado em graus, não uma medição da câmera; largura de pulso serial está em microssegundos (us); e o campo da câmera registra apenas a posição aproximada. Deixe todas as linhas extras não utilizadas completamente em branco.
Tabela de evidências do potenciômetro para servo
Complete as linhas baixa, média e alta com valores do console e evidências gerais da câmera. Deixe as linhas extras não utilizadas em branco.
| Posição do potenciômetro | Porcentagem serial % | Estimativa serial do ângulo graus | Largura de pulso serial us | Posição do servo observada |
|---|---|---|---|---|
Use as linhas baixa, média e alta para explicar se o potenciômetro controlou o servo conforme o esperado. Inclua a tendência serial de pulse_us e a observação geral da câmera.
Envie seu código
8 min
Anexe seu main.cpp final salvo
Clique em Verificar arquivos salvos, confirme se main.cpp contém a versão do servo controlado por potenciômetro e clique em Anexar código salvo. Depois que o código for anexado, clique em Enviar envio na parte inferior da atividade.