Programando um sistema de acesso automatizado.
Vamos criar um sistema de acesso inteligente! Nesta atividade, o desafio é projetar e construir um portão ou cancela que abre e fecha com o toque de um botão. Este projeto é uma introdução fantástica à lógica de programação de estados — ensinar o robô a “lembrar” se está aberto ou fechado — e uma forma prática de entender como funcionam os portões automáticos que vemos no dia a dia.
Roteiro para Professores (Foco no Aprofundamento Técnico)
- Objetivo da Atividade: Implementar um sistema de controle de estado (toggle) utilizando um input digital (botão) para alternar a posição de um Servo Motor entre dois ângulos definidos (aberto/fechado), introduzindo conceitos de detecção de borda e variáveis de estado.
- Conceitos Tecnológicos Fundamentais:
- Variável de Estado: Utilização de uma variável (geralmente booleana) para que o programa “lembre” o estado atual do sistema (ex:
bool portaoAberto = false;). - Detecção de Borda de Subida (Edge Detection): Técnica de programação para detectar o momento exato em que um botão é pressionado (transição de LOW para HIGH), evitando que o estado mude centenas de vezes enquanto o botão está pressionado.
- Input Digital com Resistor de Pull-down: Garantir uma leitura estável do estado
LOWdo botão quando ele não está pressionado.
- Variável de Estado: Utilização de uma variável (geralmente booleana) para que o programa “lembre” o estado atual do sistema (ex:
- Princípio Lógico: Para criar um efeito “toggle”, o código não pode simplesmente reagir ao estado
HIGHdo botão. Ele precisa de uma lógica mais refinada:- O programa lê o estado atual do botão.
- Ele compara o estado atual com o estado anterior (lido no ciclo passado).
- SE o estado anterior era
LOWE o estado atual éHIGH, significa que o botão ACABOU de ser pressionado. - Apenas nesse momento, a variável de estado (
portaoAberto) é invertida (truevirafalsee vice-versa). - O servo motor é então movido para a posição correspondente ao novo estado.
- Guia de Solução de Problemas (Troubleshooting):
- Portão abre e fecha muito rápido ao segurar o botão: O código não está implementando a detecção de borda corretamente. Verifique a lógica que compara o estado atual com o anterior do botão.
- Botão não responde ou funciona de forma intermitente: O pino de entrada pode estar “flutuando”. Certifique-se de que há um resistor de pull-down (10k Ohm) conectando o pino do botão ao GND.
- Servo treme (zumbido): Problema de alimentação. O servo pode exigir mais corrente do que a porta USB pode fornecer. Considere uma fonte de alimentação externa.
- Desafio Extra (Nível Avançado):
- Adicionar dois LEDs de status: um LED vermelho que acende quando o portão está fechado e um LED verde que acende quando está aberto.
- Implementar um “fechamento automático”: após o portão ser aberto, programe-o para fechar sozinho depois de um determinado tempo (ex: 10 segundos), utilizando a função
millis()para um controle de tempo não bloqueante.
- Materiais Necessários:
- Hardware: SmartMotor com Servo Motor (Placa B) OU (Kit Arduino, Protoboord, Servo Motor, Botão, Resistor 10k Ohm); materiais para a estrutura.
- Software: Arduino IDE e/ou conta na plataforma TinkerCAD.
- Possibilidades de Aplicação e Expansão:
- Trava Eletrônica: Adaptar o mecanismo para controlar uma pequena trava ou ferrolho.
- Controle de Estado de Sistemas: Usar a lógica “toggle” para ligar e desligar qualquer dispositivo, como luzes, ventiladores ou bombas de água.
- Cancela de Estacionamento: Construir uma maquete funcional de um estacionamento com cancelas na entrada e na saída.
Programação Sugerida
// Inclui a biblioteca Servo.
include
// Cria o objeto para controlar o servo.
Servo servoPortao;
// Pinos dos componentes
const int pinoBotao = 2;
const int pinoServo = 9;
// Ângulos para as posições do portão
const int anguloFechado = 0;
const int anguloAberto = 90;
// Variáveis para a lógica Toggle
bool portaoAberto = false; // “Memória” do estado do portão (começa fechado)
int estadoBotaoAnterior = LOW; // “Memória” do estado do botão
void setup() {
servoPortao.attach(pinoServo);
pinMode(pinoBotao, INPUT);
// Inicia o portão na posição fechada.
servoPortao.write(anguloFechado);
}
void loop() {
// Lê o estado atual do botão.
int estadoBotaoAtual = digitalRead(pinoBotao);
// Verifica se o botão ACABOU de ser pressionado (detecção de borda).
if (estadoBotaoAnterior == LOW && estadoBotaoAtual == HIGH) {
// Inverte o estado do portão.
portaoAberto = !portaoAberto;
}
// Move o servo para a posição correta baseada no estado atual.
if (portaoAberto) {
servoPortao.write(anguloAberto);
} else {
servoPortao.write(anguloFechado);
}
// Atualiza o estado anterior do botão para o próximo ciclo.
estadoBotaoAnterior = estadoBotaoAtual;
// Pequeno delay para estabilidade.
delay(50);
}
Programação em Blocos

Esquemático Eletrônico

SmartMotors

