Teach Remote lab lessons

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.

  • STM32 Nucleo (Mbed)
  • 60 min
  • Ensino médio / formação técnica introdutória em eletrônica
  • Português (Brasil)
  • Embedded systems
STM32 Nucleo (Mbed)
STM32 Nucleo (Mbed)

Learning Outcomes

  • Controlar a saída de um servo com PwmOut do 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.

1

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

Caminho do sinal do potenciômetro pot2 em PC1 através dos valores AnalogIn de 0,0 a 1,0 e valores pulse_us de 700 a 2300 até a saída do servo em PA15.

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?

2

Execute um teste de três posições

20 min

  1. Abra o laboratório STM32 Mbed CodeIDE.

  2. Abra main.cpp.

  3. Substitua o arquivo pelo programa abaixo.

  4. Salve, compile e faça o upload.

  5. Observe a câmera e o console juntos.

  6. Observe três posições distintas do servo.

  7. 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
3

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.

  1. Substitua main.cpp pelo programa abaixo.

  2. Complete TODO 1 para mapear uma leitura de 0,0-1,0 para 700-2300 microssegundos.

  3. Complete TODO 2 para que a largura de pulso mapeada seja gravada no servo.

  4. Salve, compile e faça o upload. Esta é a compilação planejada 2 de 2.

  5. Mova o controle deslizante Pot. pot2 para as posições baixa, média e alta.

  6. 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.

4

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.