Abrir y cerrar la cerradura con dos pulsadores
Recorrido del nivel
Esa barra de arriba te dice en qué paso estás. Tocala para ver el índice completo y saltar a cualquier paso.
Montar el servomotor y los pulsadores en la protoboard
El proyecto arranca por el circuito que controla el movimiento de la cerradura. El corazón es un servomotorServomotorMotor que se ubica en un ángulo específico (los comunes, de 0° a 180°) y se mantiene ahí. Se programa indicando el ángulo deseado; tiene tres cables: alimentación (VCC, GND) y señal.: un motor con un sistema de control que le permite ubicarse en un ángulo preciso (entre 0° y 180°) y quedarse ahí. Ese giro es el que, más adelante, va a mover el mecanismo que traba y destraba la puerta.
Sumamos también los dos pulsadoresPulsadorInterruptor que normalmente está abierto y, mientras se lo mantiene presionado, cierra el circuito entre sus patas. Se usa como botón para que el usuario interactúe con el dispositivo, o como sensor de contacto (fin de carrera). —ABRIR y CERRAR— sobre la protoboardProtoboardPlaca experimental para el prototipado rápido de circuitos: sus orificios permiten insertar y conectar componentes sin soldadura. Las líneas superior e inferior recorren la placa de punta a punta y suelen usarse para la alimentación.. Un pulsador está normalmente abierto y, mientras se lo mantiene apretado, cierra el circuito entre sus patas: así la placa detecta que lo presionamos.
En el Arduino UNO seguimos el esquema unificado de este proyecto: la señal del servo va al pin 10, el pulsador ABRIR al pin 2 y el pulsador CERRAR al pin 3. La alimentación del servo se toma de 5V y GND. Estos pines son los mismos en los tres niveles: al avanzar, el circuito no se rehace, solo se le suman componentes.
En el ESP32 la señal del servo va al GPIO 13, el pulsador ABRIR al GPIO 32 y el
CERRAR al GPIO 33 (GPIO de entrada seguros). El ESP32 trabaja a 3,3 V, pero el servo
se alimenta con 5 V compartiendo GND con la placa. Además, el servo en el ESP32 se maneja
con la librería ESP32Servo (la Servo.h clásica del UNO no funciona en esta placa).
Programar el movimiento del servomotor
Ahora escribimos la lógica de apertura y cierre. La programación la hacemos directamente en el
lenguaje de Arduino (C++), con el Arduino IDE en su versión 2.x, que se descarga gratis de
arduino.cc/en/software. Un programa de Arduino se llama
sketch y tiene dos bloques: setup(), que se ejecuta una sola vez al encender, y loop(),
que se repite después. Todo lo que va después de // es un comentario: no afecta al programa,
sirve para leerlo mejor.
La idea es simple: en cada vuelta de loop() el programa mira los pulsadores. Si está presionado
ABRIR, lleva el servo a la posición abierta; si está presionado CERRAR, lo lleva a la
cerrada. Al servo se le ordena un ángulo con cerradura.write(...). En esta reedición
unificamos los ángulos para todos los niveles: abierta = 90° y cerrada = 0°.
Un detalle sobre cómo leemos los botones: los conectamos con la resistencia interna de
pull-up de la placa (INPUT_PULLUP). Con eso, el pin lee ALTO en reposo y BAJO cuando
el botón está presionado. Por eso en el código preguntamos if (digitalRead(...) == LOW). Es la
forma moderna y con menos componentes que el “leer al aire” del material original.
Subir el código a la placa
Para subir el programa a la placa, conectala a la computadora con el cable USB, elegí en el Arduino IDE 2.x la placa y el puertoPuerto COMPuerto de comunicaciones por el cual el sistema operativo se comunica con un dispositivo externo, como la placa. Se asigna automáticamente al conectarla por USB y puede cambiar de número; en el IDE hay que indicar cuál usar. (en el IDE 2.x se eligen juntos en el menú desplegable de la barra superior) y apretá el botón Subir (la flecha →). Al terminar, aparece el mensaje de carga completada en la barra inferior.
Para el Arduino UNO: usá el cable USB tipo B, elegí la placa Arduino UNO y el puerto que se
agregó al conectarla (en Windows es un puerto COM numerado; en Linux suele ser /dev/ttyACM0 o
similar). La librería Servo ya viene incluida con el IDE, no hay que instalar nada.
Para el ESP32 hay dos pasos previos que se hacen una sola vez: instalar el soporte de placas ESP32 desde el gestor de placas (buscá “esp32” e instalá el paquete de Espressif) y, desde el Gestor de bibliotecas, la librería ESP32Servo. Si el puerto no aparece, instalá el driver del conversor USB-serie de tu placa (CP210x o CH340). Después elegí la placa ESP32 Dev Module y el puerto. Si al subir el IDE queda en “Connecting…”, mantené apretado el botón BOOT.
Conectar los LED indicadores
Sumamos ahora los dos LEDLEDComponente electrónico tipo diodo que emite luz. Tiene polaridad: la pata larga es la positiva y la corta (o el lado plano del encapsulado) la negativa. Conectado al revés no se daña, pero no enciende. que muestran el estado de la cerradura: el verde para abierta y el rojo para cerrada. El LED tiene polaridad: la pata larga es la positiva y va al pin de la placa; la pata corta (negativa) va a masa a través de una resistenciaResistenciaComponente que se opone al paso de la corriente eléctrica. Su valor se mide en ohm (Ω). Se usa para determinar la cantidad de corriente de una rama del circuito, por ejemplo para evitar que un LED se queme por exceso de corriente. de 220 Ω, que limita la corriente para que no se dañe.
En el Arduino UNO, el LED verde va al pin 11 y el LED rojo al pin 13 (las
constantes PIN_LED_VERDE y PIN_LED_ROJO del código). El pin 13 tiene además el LED integrado
de la placa, útil para ver el estado aun sin el LED externo.
En el ESP32, el LED verde va al GPIO 25 y el LED rojo al GPIO 26. Como el ESP32 trabaja a 3,3 V, la resistencia de 220 Ω es más que suficiente.
Programar los LED indicadores
Completamos el programa para que, además de mover el servo, encienda el LED que corresponde a cada estado. La regla es: cuando la cerradura queda abierta, se enciende el verde y se apaga el rojo; cuando queda cerrada, se enciende el rojo y se apaga el verde. El sistema arranca cerrado (LED rojo), su estado seguro por defecto.
Fijate en el código cómo las dos acciones —“abrir” y “cerrar”— quedan agrupadas en funciones
(abrirPuerta() y cerrarPuerta()): cada una mueve el servo y actualiza los dos LED de una vez.
Así el programa se lee como lo que hace.
Ver el código completo · cerradura-pulsador.ino
// Cerradura automatizada — Nivel Inicial (Arduino UNO).
//
// Dos pulsadores controlan el servomotor que traba/destraba la cerradura:
// - Pulsador ABRIR -> el servo va a la posicion "abierta" + LED verde.
// - Pulsador CERRAR -> el servo va a la posicion "cerrada" + LED rojo.
// Los LED indican de un vistazo el estado de la puerta (verde = abierta,
// rojo = cerrada), tal como pide la situacion-problema del abuelo de Josefina.
//
// Plataforma: Arduino UNO. Proyecto de BAJA TENSION (servo 5 V, LED,
// pulsadores): no hay 220 V ni agua, no lleva advertencias electricas.
//
// Nivel inicial: se permite delay() (fiel a la progresion original); el
// antirrebote se resuelve con una espera corta. El nivel avanzado pasa a
// millis() sin bloquear.
//
// Basado en: Fragmentos de codigo del Nivel Inicial (Pasos 2 y 5) — Cerradura
// Automatica, Saberes Digitales (INET/EDUCAR 2019).
// Desvios respecto del original (ver README):
// (1) PINES UNIFICADOS: el original ataba el servo al pin 0 (rompe USB/serial)
// y usaba pines de LED distintos por nivel. Aca el servo va al pin 10 y
// los LED a 11/13 — el MISMO esquema en los tres niveles.
// (2) Angulos del servo unificados (ABIERTA=90, CERRADA=0) para que el mismo
// criterio valga en inicial, intermedio y avanzado.
// (3) Pulsadores con INPUT_PULLUP (activo en LOW): el original leia entradas
// "al aire"; el pull-up interno evita lecturas erraticas sin resistencias.
#if defined(ESP32)
#include <ESP32Servo.h>
#else
#include <Servo.h>
#endif
// --- Pines (esquema UNIFICADO del contrato) ---
const int PIN_SERVO = 10; // senal del servomotor de la cerradura
const int PIN_LED_VERDE = 11; // encendido = cerradura ABIERTA
const int PIN_LED_ROJO = 13; // encendido = cerradura CERRADA
// En el nivel inicial NO hay teclado, asi que los botones ocupan dos pines
// libres (2 y 3). En intermedio, el teclado matricial los reemplaza.
const int PIN_BOTON_ABRIR = 2;
const int PIN_BOTON_CERRAR = 3;
// Angulos del servo (unificados en los tres niveles).
const int ANGULO_ABIERTA = 90;
const int ANGULO_CERRADA = 0;
// Antirrebote simple del pulsador (ms).
const unsigned long ANTIRREBOTE_MS = 200;
Servo cerradura;
void abrirPuerta() {
cerradura.write(ANGULO_ABIERTA);
digitalWrite(PIN_LED_VERDE, HIGH);
digitalWrite(PIN_LED_ROJO, LOW);
}
void cerrarPuerta() {
cerradura.write(ANGULO_CERRADA);
digitalWrite(PIN_LED_VERDE, LOW);
digitalWrite(PIN_LED_ROJO, HIGH);
}
void setup() {
pinMode(PIN_LED_VERDE, OUTPUT);
pinMode(PIN_LED_ROJO, OUTPUT);
// Con INPUT_PULLUP el pulsador lee HIGH en reposo y LOW al presionarse.
pinMode(PIN_BOTON_ABRIR, INPUT_PULLUP);
pinMode(PIN_BOTON_CERRAR, INPUT_PULLUP);
cerradura.attach(PIN_SERVO);
// Estado inicial: CERRADA (LED rojo). Es el estado seguro por defecto de
// una cerradura.
cerrarPuerta();
}
void loop() {
// Pulsador presionado = LOW (por el pull-up interno).
if (digitalRead(PIN_BOTON_ABRIR) == LOW) {
abrirPuerta();
delay(ANTIRREBOTE_MS);
}
if (digitalRead(PIN_BOTON_CERRAR) == LOW) {
cerrarPuerta();
delay(ANTIRREBOTE_MS);
}
} // Cerradura automatizada — Nivel Inicial (ESP32 DevKit v1).
//
// Dos pulsadores controlan el servomotor que traba/destraba la cerradura:
// - Pulsador ABRIR -> el servo va a la posicion "abierta" + LED verde.
// - Pulsador CERRAR -> el servo va a la posicion "cerrada" + LED rojo.
// Los LED indican de un vistazo el estado (verde = abierta, rojo = cerrada).
//
// Plataforma: ESP32 (DevKit v1). El servo se maneja con la libreria
// ESP32Servo (la Servo.h clasica no funciona en ESP32). Nota electrica: el
// ESP32 trabaja a 3,3 V (el UNO a 5 V); alimentar el servo desde 5 V con GND
// comun. Proyecto de BAJA TENSION: sin 220 V ni agua.
//
// Nivel inicial: se permite delay() (fiel a la progresion original).
//
// Basado en: Fragmentos de codigo del Nivel Inicial (Pasos 2 y 5) — Cerradura
// Automatica, Saberes Digitales (INET/EDUCAR 2019).
// Desvios (ver README): pines GPIO seguros del contrato; angulos del servo
// unificados (ABIERTA=90, CERRADA=0); pulsadores con INPUT_PULLUP.
#if defined(ESP32)
#include <ESP32Servo.h>
#else
#include <Servo.h>
#endif
// --- Pines (GPIO seguros del contrato) ---
const int PIN_SERVO = 13; // ESP32Servo
const int PIN_LED_VERDE = 25; // encendido = cerradura ABIERTA
const int PIN_LED_ROJO = 26; // encendido = cerradura CERRADA
// En el nivel inicial no hay teclado: los botones ocupan dos GPIO libres de
// entrada (32 y 33). En intermedio los reemplaza el teclado matricial.
const int PIN_BOTON_ABRIR = 32;
const int PIN_BOTON_CERRAR = 33;
// Angulos del servo (unificados en los tres niveles).
const int ANGULO_ABIERTA = 90;
const int ANGULO_CERRADA = 0;
// Antirrebote simple del pulsador (ms).
const unsigned long ANTIRREBOTE_MS = 200;
Servo cerradura;
void abrirPuerta() {
cerradura.write(ANGULO_ABIERTA);
digitalWrite(PIN_LED_VERDE, HIGH);
digitalWrite(PIN_LED_ROJO, LOW);
}
void cerrarPuerta() {
cerradura.write(ANGULO_CERRADA);
digitalWrite(PIN_LED_VERDE, LOW);
digitalWrite(PIN_LED_ROJO, HIGH);
}
void setup() {
pinMode(PIN_LED_VERDE, OUTPUT);
pinMode(PIN_LED_ROJO, OUTPUT);
// Con INPUT_PULLUP el pulsador lee HIGH en reposo y LOW al presionarse.
pinMode(PIN_BOTON_ABRIR, INPUT_PULLUP);
pinMode(PIN_BOTON_CERRAR, INPUT_PULLUP);
cerradura.attach(PIN_SERVO);
// Estado inicial: CERRADA (LED rojo), estado seguro por defecto.
cerrarPuerta();
}
void loop() {
// Pulsador presionado = LOW (por el pull-up interno).
if (digitalRead(PIN_BOTON_ABRIR) == LOW) {
abrirPuerta();
delay(ANTIRREBOTE_MS);
}
if (digitalRead(PIN_BOTON_CERRAR) == LOW) {
cerrarPuerta();
delay(ANTIRREBOTE_MS);
}
} Podés ver el comportamiento —los botones moviendo el servo y los LED cambiando de estado— en el simulador, antes de armar el circuito real:
Simulación del comportamiento
La misma máquina de estados del firmware, portada a TypeScript, maneja el
comportamiento del dispositivo. No se ejecuta el binario real: la ejecución
del .hex con avr8js está en el roadmap.
Simulación lista. Presioná «Iniciar» para arrancar la secuencia.
Verificá
Con el programa cargado, presioná ABRIR: el servo tiene que girar a la posición abierta y el LED verde encenderse (el rojo se apaga). Presioná CERRAR: el servo vuelve a la posición cerrada y se enciende el LED rojo. Al encender el sistema, debería arrancar en cerrado (rojo). Si un pulsador no responde, revisá que esté conectado entre el pin y GND; si un LED no enciende, revisá su polaridad (pata larga al pin).
Comenzar a armar la maqueta
Con el circuito probado, decidimos si cerramos el proyecto en este nivel o si avanzamos al intermedio para sumarle el teclado. Si vamos a dejar la maqueta armada, conviene pasar de la protoboard a un montaje más firme: soldar los cables a los componentes para que las conexiones no se suelten cuando el mecanismo se mueva.
Para el aula
Aunque el grupo piense avanzar al nivel intermedio, no hace falta soldar todavía: el teclado y el buzzer se suman sobre el mismo circuito. Conviene soldar recién cuando el sistema completo esté probado en protoboard. Este paso es un buen momento para planificar la maqueta: dónde van el teclado, los LED y la manija respecto de la puerta.
Imprimir las piezas 3D
El mecanismo de la cerradura se fabrica con piezas impresas en 3D. La idea es un piñón-cremallera: el servo hace girar un piñón (un engranaje) que empuja una cremallera (una barra dentada), y esa barra es la que se corre para trabar o destrabar la puerta, como un pasador.
Estas piezas forman parte de los paquetes de fabricación del proyecto, que se descargan desde su ficha. Si querés modificar el modelo, sea cual sea el programa de diseño 3D que uses, tenés que exportar las piezas en formato STLFormato .stlFormato de archivo que contiene la forma de un objeto sólido 3D, sin color, texturas ni propiedades físicas. Es el más usado para intercambiar e imprimir modelos 3D; funciona como la 'exportación final' de un diseño, como un PDF de un documento de texto., el estándar para intercambiar e imprimir modelos sólidos.
Ensamblar el sistema mecánico con el servomotor
Con las piezas impresas, ensamblamos el mecanismo sobre el servomotor: el piñón se calza en el eje del servo y engrana con la cremallera, de modo que al girar el servo (a 90° o a 0°) la barra se corra y trabe o destrabe la cerradura.
Una vez armado, el sistema se fija a la puerta (o a una apertura similar) y allí se ubican los LED y los pulsadores, al alcance de quien la va a usar.
Un solo botón
Hoy hacen falta dos botones (abrir y cerrar). ¿Cómo harían para que un solo pulsador alterne el estado: si está cerrada la abre, y si está abierta la cierra? Pista: hace falta que el programa recuerde el estado actual en una variable. Es exactamente la idea que van a usar en el nivel intermedio, cuando la clave correcta alterne la cerradura.
Cierre del nivel
Al terminar este nivel, tu cerradura ya funciona: se abre y se cierra con dos pulsadores, el servo mueve el mecanismo impreso en 3D y los LED muestran el estado (verde = abierta, rojo = cerrada). En el camino armaste el circuito, subiste el programa desde el Arduino IDE 2.x y ensamblaste el mecanismo. Pero abrir con un botón es poco seguro: cualquiera que lo presione entra. En el nivel intermedio vamos a reemplazar los pulsadores por un teclado para exigir una clave, y sumaremos un buzzer que avise si el código es correcto o no.
Evidencia de cierre
Al terminar este nivel, esto tiene que estar funcionando:
- El mecanismo de la cerradura está impreso y montado sobre el servomotor, y el circuito armado en la protoboard: el servo, los dos pulsadores (ABRIR y CERRAR) y los dos LED (verde y rojo) con sus resistencias de 220 Ω.
- Sabés subir un programa desde el Arduino IDE 2.x: elegir la placa, elegir el puerto e instalar la librería del servo (Servo en el UNO, ESP32Servo en el ESP32).
- Al presionar ABRIR, el servo gira a 90° y se enciende el LED verde; al presionar CERRAR, gira a 0° y se enciende el LED rojo. El sistema arranca cerrado (LED rojo).
- Entendés que los pulsadores usan la resistencia interna de pull-up (presionado = BAJO) y que los pines y los ángulos del servo son los mismos en los tres niveles del proyecto.