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.
New to LabsLand? Create your teacher account
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.
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.
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
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.
Inicie o laboratório STM32 Arduino por este bloco. No CodeIDE, abra
main.inoe cole o programa inicial abaixo.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.Salve, selecione Compile e aguarde a confirmação de sucesso. Depois, selecione Upload e aguarde até a placa real receber o programa inicial.
Abra o console Serial do CodeIDE em 115200 baud. Aguarde as linhas
state=... pot1=... button=...se repetirem.Teste 1 — estado automático inferior: solte B1 e coloque
Pot. pot1aproximadamente em um terço de seu percurso. Copie a leitura ADC e complete a linhaposição inferior, B1 solto.Teste 2 — estado automático superior: mantenha B1 solto e coloque
Pot. pot1aproximadamente em dois terços de seu percurso. Copie a leitura ADC e complete a linhaposição superior, B1 solto.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.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.
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.
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.