Teach Remote lab lessons

Teach lesson

STM32 Mbed CodeIDE (2/8): sequências de LED e temporização

Os estudantes programam sequências temporizadas de LEDs em uma placa STM32 real com Mbed DigitalOut, depois alteram o intervalo e explicam a ordem observada.

  • STM32 Nucleo (Mbed)
  • 55 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 vários pinos Mbed DigitalOut em uma sequência planejada.

  • Use alterações de tempo para tornar um padrão de saída mais fácil de observar.

  • Explicar a relação entre a ordem do código e a ordem física dos LEDs.

Student activity preview

Activity Content

Preview only. In a class session, students can fill in responses and submit their work to the teacher.

1

Planeje a sequência

8 min

Uma única piscada prova que a placa é programável; um padrão temporizado de LEDs pode transmitir informações, como uma varredura de inicialização, uma sequência de aviso ou um código de status. A ideia importante não é apenas “acender LEDs”: a ordem do código e os intervalos de espera se transformam em comportamento visível no hardware.

Um microcontrolador segue exatamente a ordem do seu código. O programa abaixo usará chamadas auxiliares como led_on(led1) para que o código seja parecido com a ação física que você deseja ver.

Se você escrever:

led_on(led1);
ThisThread::sleep_for(500ms);
led_on(led2);

então LED 1 deve ligar antes de LED 2.
LED 1 permanecerá ligado enquanto LED 2 estiver ligado, porque o código ainda não chamou led_off(led1).

Esta lição usa três pinos de saída Mbed disponíveis no laboratório STM32 WB55RG:

- PB_13
- PB_14
- PB_15

Essas são saídas para LEDs verdes na placa de treinamento. Nos exemplos locais do CodeIDE com Mbed, elas são ativas em nível baixo: escrever 0 acende o LED e escrever 1 o apaga. Por isso, o código inicial usa funções auxiliares em vez de exigir que você memorize a polaridade bruta de 0/1.

Em Mbed, cada linha DigitalOut cria um objeto de saída conectado a um pino STM32. O objeto mantém seu último valor enquanto o programa espera, então ThisThread::sleep_for(500ms) pausa o código sem apagar o estado LED que você acabou de definir.

Use este mapeamento ao comparar seu código com a câmera:

- led1 = PB_13 = LED verde mais à esquerda no grupo de três LEDs.
- led2 = PB_14 = LED verde central nesse grupo.
- led3 = PB_15 = LED verde mais à direita nesse grupo.

Três saídas LED verdes usadas nesta lição

Três símbolos LED verdes rotulados como led1 PB13, led2 PB14 e led3 PB15.

Use a câmera para verificar a ordem desse grupo de LEDs. Se for difícil distingui-los, reduza a velocidade do padrão para 1000ms, use o mapeamento acima e registre não foi possível distinguir na câmera apenas se ainda não conseguir confirmar a ordem.

No cabeçalho do auxiliar DigitalOut &led, o & significa que o auxiliar funciona no objeto LED real que você passa, não em uma cópia. Em 500ms, ms significa milissegundos.

Se LED 1 for ativado, então LED 2, depois LED 3, sem nenhuma chamada led_off() entre eles, o que aparece logo antes de all_off()?

2

Execute a sequência guiada

26 min

Planeje duas compilações e cerca de 20 minutos de laboratório ativo. A compilação 1 usa a ordem da esquerda para a direita e 500ms; a compilação 2 altera apenas step_delay para 250ms ou 1000ms. Enquanto estiver na fila, responda à pergunta sobre o padrão cumulativo, escolha o segundo intervalo e escreva a ordem esperada.

O código inicial contém exatamente quatro marcadores que impedem a compilação. Substitua os TODOs 1–4 antes de salvar ou compilar. Procure por TODO; um arquivo pronto não deve apresentar correspondências.

  1. Abra o laboratório STM32 Mbed CodeIDE.

  2. Abra main.cpp.

  3. Substitua o arquivo pelo código abaixo. Para a compilação 1, defina TODO 1 como 500ms e, em seguida, defina TODOs 2-4 como led1, led2 e led3 nessa ordem.

  4. Procure TODO. Quando não restar nenhum, salve, compile a compilação 1 e faça upload.

  5. Observe pelo menos três ciclos completos e registre a ordem e a temporização dos LEDs.

  6. Altere apenas step_delay de 500ms para 250ms ou 1000ms.

  7. Salve main.cpp, compile a compilação 2, carregue e compare se o novo tempo é mais fácil ou mais difícil de verificar.

  8. Somente após a conclusão da etapa 7, clique em Marcar prática como concluída.

#include "mbed.h"

DigitalOut led1(PB_13, 1);
DigitalOut led2(PB_14, 1);
DigitalOut led3(PB_15, 1);

void led_on(DigitalOut &led) {
    led = 0;
}

void led_off(DigitalOut &led) {
    led = 1;
}

void all_off() {
    led_off(led1);
    led_off(led2);
    led_off(led3);
}

int main() {
    // 1: substitua o espaço reservado de tempo por 500 ms para compilação 1.
    const auto step_delay = TODO_STEP_DELAY;
    const auto reset_delay = 1000ms;
    all_off();

    while (true) {
        // 2-4: escolha cada LED uma vez para fazer uma ordem da esquerda para a direita.
        led_on(TODO_FIRST_LED);
        ThisThread::sleep_for(step_delay);

        led_on(TODO_SECOND_LED);
        ThisThread::sleep_for(step_delay);

        led_on(TODO_THIRD_LED);
        ThisThread::sleep_for(reset_delay);

        all_off();
        ThisThread::sleep_for(reset_delay);
    }
}

Registre separadamente as duas versões testadas. Como o código inicial mantém os LEDs anteriores acesos até executar all_off(), a sequência visível esperada é cumulativa: LED 1 aceso → LEDs 1+2 acesos → LEDs 1+2+3 acesos → todos apagados.

Para a versão original 500ms, registre:

- ordem visível ou padrão cumulativo que você confirmou na câmera;
- se as posições LED correspondem ao mapeamento led1/led2/led3;
- o que tornou o padrão fácil ou difícil de verificar.

Para a versão de temporização alterada, registre:

- o valor delay que você testou;
- se a ordem visível ou o padrão cumulativo permaneceu o mesmo;
- se o novo tempo tornou o padrão mais fácil ou mais difícil de verificar;
- não foi possível distinguir na câmera somente se você reduziu a velocidade e ainda não conseguiu confirmar a ordem.

Escolha uma chamada auxiliar que altera um LED. Nomeie a linha, como led_on(led2);, e explique que mudança física essa linha causou e quando aconteceu na sequência.

3

Explique sua escolha final de tempo

13 min

Mantenha a ordem TODO da esquerda para a direita no arquivo final. Sua única alteração na segunda compilação é a escolha do tempo: 250ms fornece uma comparação mais rápida; 1000ms oferece uma comparação mais lenta e fácil de usar. Ambos são válidos se as evidências corresponderem.

Indique seu step_delay final em milissegundos. Explique por que você escolheu 250ms ou 1000ms e se a evidência da câmera apoiou essa escolha.

4

Envie seu código

8 min

Anexe seu main.cpp final salvo

Clique em Verificar arquivos salvos, confirme que main.cpp contém a ordem testada da esquerda para a direita, o intervalo final escolhido e nenhum TODO. Em seguida, clique em Anexar código salvo e Enviar atividade.