Portão com Controle (A)

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 LOW do botão quando ele não está pressionado.
  • Princípio Lógico: Para criar um efeito “toggle”, o código não pode simplesmente reagir ao estado HIGH do botão. Ele precisa de uma lógica mais refinada:
    1. O programa lê o estado atual do botão.
    2. Ele compara o estado atual com o estado anterior (lido no ciclo passado).
    3. SE o estado anterior era LOW E o estado atual é HIGH, significa que o botão ACABOU de ser pressionado.
    4. Apenas nesse momento, a variável de estado (portaoAberto) é invertida (true vira false e vice-versa).
    5. 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