Saltar al contenido
Nivel inicial

Abrir y cerrar la cerradura con dos pulsadores

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 servomotor: 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 pulsadoresABRIR y CERRAR— sobre la protoboard. Un pulsador está normalmente abierto y, mientras se lo mantiene apretado, cierra el circuito entre sus patas: así la placa detecta que lo presionamos.

Esquema de conexión: una placa Arduino UNO a la izquierda y una protoboard a la derecha con dos pulsadores rotulados ABRIR y CERRAR, cada uno con una resistencia, y un servomotor. Cables llevan las señales de los pulsadores y del servo a la placa, y la alimentación a 5V y GND.
Montaje del servomotor y los dos pulsadores en la protoboard (figura original del proyecto). En esta reedición, los pulsadores se conectan entre el pin y GND usando la resistencia interna de pull-up de la placa, sin las resistencias externas del esquema.

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 puerto (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 LED 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 resistencia de 220 Ω, que limita la corriente para que no se dañe.

Esquema de conexión ampliado: Arduino UNO y protoboard con los dos pulsadores ABRIR y CERRAR, el servomotor y, a la derecha, un LED verde y un LED rojo, cada uno con su resistencia de 220 ohm hacia la línea negativa de la protoboard.
El circuito del nivel inicial con los dos LED indicadores agregados (figura original del proyecto): verde para cerradura abierta, rojo para cerrada, cada uno con su resistencia de 220 Ω.

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-pulsador.ino Arduino UNO
// 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-pulsador.ino ESP32
// 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);
  }
}
Cerradura con pulsadores: ABRIR lleva el servo a 90° y enciende el LED verde; CERRAR lo lleva a 0° y enciende el rojo. Arranca cerrada. Lo único que cambia entre plataformas son los pines y la librería del servo (Servo en el UNO, ESP32Servo en el ESP32).

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.

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.

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.

Render 3D de una cremallera: una barra alargada con dientes en la mitad superior de un extremo y una sección lisa hacia el otro.
La cremallera del mecanismo (figura original del proyecto): el servo mueve el piñón que engrana con estos dientes y desplaza la barra para trabar o destrabar la cerradura.

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 STL, 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.

Render 3D del mecanismo montado: una placa Arduino conectada por dos cables a un servomotor, que tiene acoplado un piñón dentado engranado con una cremallera dentro de una base impresa; en la punta de la cremallera hay un saliente que hace de pasador.
El mecanismo de la cerradura ensamblado con el servomotor (figura original del proyecto): el piñón en el eje del servo mueve la cremallera que traba y destraba la puerta. Aquí se muestra solo el servo; hay que conectar también la placa, los pulsadores y los LED.

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.

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.