Teach Remote lab lessons

Teach lesson

STM32 com a API do Arduino (4/4): minicontrolador

Os estudantes combinam entrada de potenciômetro, decisões, saída RGB e evidências do Serial para construir um minicontrolador STM32 Arduino compacto.

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

Learning Outcomes

  • Projetar um minicontrolador com entrada, decisão, saída e modo manual.

  • Escolher e justificar um limite com base em leituras reais.

  • Testar os três ramos de uma decisão e comunicar o resultado.

Student activity preview

Activity Content

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

1

Entenda o desafio e projete testes

10 min

Seu minicontrolador terá três estados:

- Potenciômetro abaixo do limite: cor verde.
- Potenciômetro acima do limite: cor vermelha.
- Botão pressionado: cor azul, mesmo que o potenciômetro diga outra coisa.

O desafio não é apenas copiar o programa. No final, você deverá ter um
minicontrolador testado que lê uma entrada, decide um estado, altera o LED RGB,
registra evidências por meio do Serial e incorpora uma pequena melhoria que você
consegue defender.

Antes de programar, pense como se estivesse testando um pequeno produto. Um bom teste
deve dizer o que você moverá, qual cor espera ver e quais dados do Serial
confirmariam que o controlador tomou a decisão correta.

O programa inicial imprimirá linhas exatamente neste formato:
state=<green/red/manual> pot1=<leitura ADC> button=<released/pressed>.

Escreva três linhas separadas, uma para cada caso. Utilize este formato:
Caso N | RGB esperado: ... | Serial: state=... button=...

Complete uma linha para cada situação:

1. B1 solto e potenciômetro abaixo do limite.
2. B1 solto e potenciômetro no limite ou acima dele.
3. B1 mantido pressionado e potenciômetro no limite ou acima dele.

2

Construa e verifique o minicontrolador

27 min

A função setRgb(red, green, blue) evita repetir três linhas toda vez que
você muda a cor. Cada argumento representa um brilho PWM entre 0 e 255. O
limite inicial é de 600 contagens ADC, mas você deverá compará-lo com leituras reais.

bool armazena true ou false. Como o botão 1 é ativo em LOW, o valor booleano
buttonPressed se torna verdadeiro quando a leitura é LOW. if / else if / else
verifica os ramos de cima para baixo e executa apenas o primeiro ramo verdadeiro; por isso,
a condição manual deve vir primeiro. const char* state armazena um rótulo de texto curto
para Serial; você não precisa alterar essa sintaxe.

Você copiará um programa inicial, testará e ajustará. O resultado final deverá ser
um controlador pequeno mas completo: lê POT_1, decide com THRESHOLD,
permite o modo manual com BUTTON_1, altera o LED RGB e registra pelo
Serial qual estado foi escolhido.

Entradas e saídas usadas pelo minicontrolador

Mapa de entradas e saídas: potenciômetro pot1 lido em PC0 e botão B1 lido em PC5 entram em main.ino, que aciona as saídas RGB em PA8, PA9 e PA10.

A montagem remota já está conectada. Este mapa mostra apenas as duas entradas e os
três canais RGB usados neste desafio; não é necessário alterar a fiação.

  1. Inicie o laboratório STM32 Arduino por este bloco. No CodeIDE, abra main.ino e cole o programa inicial abaixo.

  2. Substitua TODO 1 por uma expressão booleana verdadeira somente quando o modo manual for solicitado. Substitua TODO 2 por uma comparação verdadeira quando a leitura de ADC estiver no limite ou acima dele. Procure por TODO; nenhum pode permanecer.

  3. Salve, selecione Compile e aguarde a confirmação de sucesso. Depois, selecione Upload e aguarde até a placa real receber o programa inicial.

  4. Abra o console Serial do CodeIDE em 115200 baud. Aguarde as linhas state=... pot1=... button=... se repetirem.

  5. Teste 1 — estado automático inferior: solte B1 e coloque Pot. pot1 aproximadamente em um terço de seu percurso. Copie a leitura ADC e complete a linha posição inferior, B1 solto.

  6. Teste 2 — estado automático superior: mantenha B1 solto e coloque Pot. pot1 aproximadamente em dois terços de seu percurso. Copie a leitura ADC e complete a linha posição superior, B1 solto.

  7. Teste 3 — comando manual: mantenha o potenciômetro na posição superior, pressione B1 até o Serial informar o estado manual, depois solte-o e complete a linha posição superior, B1 pressionado. Este teste verifica se o botão tem prioridade.

  8. Preencha as três primeiras linhas da tabela. Na pergunta logo abaixo, calcule o ponto médio arredondado das duas leituras ADC com o botão solto; esse ponto médio será o limite calibrado para o centro da faixa de controle escolhida.

#include <Arduino.h>

const int POT_1 = PC0;
const int BUTTON_1 = PC5;  // Ativo LOW
const int RGB_RED = PA8;
const int RGB_GREEN = PA9;
const int RGB_BLUE = PA10;

const int THRESHOLD = 600;

void setRgb(int red, int green, int blue) {
  analogWrite(RGB_RED, red);
  analogWrite(RGB_GREEN, green);
  analogWrite(RGB_BLUE, blue);
}

void setup() {
  pinMode(BUTTON_1, INPUT);
  pinMode(RGB_RED, OUTPUT);
  pinMode(RGB_GREEN, OUTPUT);
  pinMode(RGB_BLUE, OUTPUT);
  Serial.begin(115200);
}

void loop() {
  int reading = analogRead(POT_1);
  bool buttonPressed = digitalRead(BUTTON_1) == LOW;
  const char* state;

  if (TODO_MANUAL_CONDITION) { // TODO 1: verdadeiro somente quando o modo manual é solicitado
    setRgb(0, 0, 255);
    state = "manual";
  } else if (TODO_HIGH_CONDITION) { // TODO 2: leitura no limite ou acima dele
    setRgb(255, 0, 0);
    state = "red";
  } else {
    setRgb(0, 180, 0);
    state = "green";
  }

  Serial.print("state=");
  Serial.print(state);
  Serial.print(" pot1=");
  Serial.print(reading);
  Serial.print(" button=");
  if (buttonPressed) {
    Serial.println("pressed");
  } else {
    Serial.println("released");
  }

  delay(100);
}

Use seis linhas na tabela. As linhas 1 a 3 documentam o programa inicial e devem ser
concluídas antes da modificação. As linhas 4 a 6 repetem os mesmos três casos após a
calibração e a melhoria do diagnóstico. Cada linha deve relacionar entrada, decisão e
evidência do hardware real:

- Linhas 1 e 4: B1 solto, potenciômetro na posição inferior de calibração.
- Linhas 2 e 5: B1 solto, potenciômetro na posição superior de calibração.
- Linhas 3 e 6: B1 mantido pressionado na posição superior de calibração.
- Em Valores vistos no Serial, copie aproximadamente state, pot1 e button.
- Nas linhas melhoradas, copie também o novo campo margin. Recrie cada posição dentro de cerca de 30 contagens ADC de sua leitura inicial.

Versão Teste Valores vistos no Serial (pot1 em contagens ADC) Limite contagens ADC Resultado esperado Saída observada Veredicto

Usando as duas linhas de calibração com o botão solto, calcule (leitura inferior + leitura superior) / 2 e arredonde para uma contagem ADC inteira. Informe as duas leituras, o cálculo e o limite final calibrado. Não edite THRESHOLD antes de registrar esse cálculo.

3

Calibrar e adicionar um diagnóstico

15 min

Substitua 600 em THRESHOLD pelo seu ponto médio arredondado. Em seguida, adicione um
diagnóstico Serial logo após o valor impresso de pot1: imprima margin= e depois
reading - THRESHOLD. Uma margem negativa significa abaixo do limite calibrado;
zero ou uma margem positiva significa igual ou superior a ela.

Salve, compile, faça upload e reabra Serial em 115200 baud. Repita os mesmos três
casos de teste e preencha as linhas aprimoradas 4 a 6. O diagnóstico só é útil se o
estado visível, state, e o sinal de margin concordarem; o modo manual ainda deve ter
prioridade, mesmo quando a margem for positiva.

Informe seu limite calibrado e cite as duas novas instruções Serial. Em seguida, use as linhas aprimoradas 4 a 6 para mostrar que as margens negativa e positiva corresponderam aos ramos automáticos e que o comando manual continuou tendo prioridade.

4

Apresente o controlador

8 min

Envie seu main.ino final

Salve main.ino antes de anexá-lo. A captura deve mostrar o minicontrolador
final, com o limite calibrado, a saída Serial margin e nenhum token TODO.

Apresente o minicontrolador em 4 a 6 frases: indique sua finalidade e entradas; resuma as três decisões e saídas; cite o resultado dos seis testes; explique o que o sinal de margin mostrou; e mencione uma limitação realista.