Controla el Acceso a tu Hogar con Raspberry Pi: Cerradura Inteligente y Sensor de Apertura
Este tutorial te guiará paso a paso en la creación de una cerradura inteligente y un sistema de monitoreo de acceso para tu hogar utilizando una Raspberry Pi. Aprenderás a integrar un servomotor para controlar el mecanismo de la cerradura y un sensor magnético para detectar aperturas, todo ello programado en Python.
🔒 Control de Acceso Inteligente con Raspberry Pi: Tu Hogar Más Seguro
¿Alguna vez has deseado tener una cerradura que puedas controlar desde tu teléfono, o recibir notificaciones cada vez que una puerta se abre? Con una Raspberry Pi, ¡es posible! En este tutorial, te embarcarás en un proyecto emocionante para transformar una cerradura tradicional en una cerradura inteligente y añadir un sistema de monitoreo de acceso con un sensor de puerta/ventana.
Este proyecto no solo te proporcionará una capa extra de seguridad y conveniencia, sino que también te ayudará a profundizar en el mundo de la electrónica y la programación con Raspberry Pi. ¡Prepárate para llevar la seguridad de tu hogar al siguiente nivel!
🎯 Objetivos del Proyecto
Al finalizar este tutorial, habrás logrado:
- Conectar un servomotor a tu Raspberry Pi para controlar el mecanismo de una cerradura.
- Integrar un sensor magnético de puerta/ventana para detectar su estado (abierta/cerrada).
- Programar en Python la lógica para abrir/cerrar la cerradura y monitorear el sensor.
- Configurar notificaciones básicas (por ejemplo, a través de la consola o un archivo de registro) para los eventos de apertura/cierre.
🛠️ Materiales Necesarios
Para llevar a cabo este proyecto, necesitarás los siguientes componentes:
| Componente | Cantidad | Descripción |
|---|---|---|
| --- | --- | --- |
| Raspberry Pi (cualquier modelo) | 1 | La placa central de nuestro sistema. |
| Tarjeta MicroSD | 1 | Con Raspberry Pi OS instalado. |
| --- | --- | --- |
| Servomotor SG90 o MG996R | 1 | Pequeño servomotor para mover el mecanismo de la cerradura. El MG996R es más robusto. |
| Sensor Magnético Reed | 1 | Sensor de puerta/ventana. |
| --- | --- | --- |
| Cables Jumper (Macho-Hembra, Macho-Macho) | ~10-15 | Para las conexiones entre la Pi y los componentes. |
| Protoboard (opcional) | 1 | Para organizar mejor las conexiones. |
| --- | --- | --- |
| Resistencia 10kΩ | 1 | Para el sensor magnético (pull-up/pull-down, dependiendo de la configuración). |
| Fuente de alimentación 5V para Raspberry Pi | 1 | Recomendada una de al menos 2.5A. |
| --- | --- | --- |
| Cerradura mecánica (ej. de pestillo) | 1 | Para adaptar el servomotor. Puede ser una cerradura de juguete o una real. |
⚙️ Preparación del Entorno Raspberry Pi
Asegúrate de que tu Raspberry Pi esté configurada y lista para trabajar. Si ya tienes Raspberry Pi OS instalado y acceso SSH o de escritorio, puedes saltarte los primeros pasos.
1. Instalación de Raspberry Pi OS
Si aún no lo has hecho, instala la última versión de Raspberry Pi OS en tu tarjeta MicroSD. Puedes usar la herramienta Raspberry Pi Imager.
2. Actualización del Sistema
Conéctate a tu Raspberry Pi (vía SSH o directamente con teclado/monitor) y actualiza los paquetes del sistema:
sudo apt update
sudo apt upgrade -y
3. Habilitar la Interfaz I2C y SPI (Opcional, pero buena práctica)
Aunque para este proyecto solo usaremos GPIOs simples y PWM de software, es buena práctica tener estas interfaces habilitadas para futuros proyectos.
sudo raspi-config
Navega a 3 Interface Options > P3 I2C > Yes y P4 SPI > Yes.
4. Instalación de Librerías Python
Necesitaremos la librería RPi.GPIO para controlar los pines GPIO y gpiozero para una interacción más sencilla con el servomotor y el sensor.
sudo apt install python3-rpi.gpio -y
pip3 install gpiozero
🔌 Diagrama de Conexiones (Hardware)
Es crucial realizar las conexiones correctamente para evitar daños a los componentes. A continuación, se detalla cómo conectar el servomotor y el sensor magnético a la Raspberry Pi.
📌 Servomotor
Los servomotores suelen tener tres cables:
- Marrón/Negro: GND (Tierra)
- Rojo: VCC (Alimentación, 5V)
- Naranja/Amarillo/Blanco: Señal (GPIO)
Conexiones:
- Servomotor GND -> Raspberry Pi GND (Pin 6, 9, 14, 20, 25, 30, 34, 39)
- Servomotor VCC (Rojo) -> Raspberry Pi 5V (Pin 2 o Pin 4)
- Servomotor Señal -> Raspberry Pi GPIO 17 (Pin 11)
📌 Sensor Magnético Reed
Un sensor magnético reed básico tiene dos cables. Funcionan como un interruptor: se cierran cuando el imán está cerca y se abren cuando se aleja.
Vamos a configurarlo como un pull-up interno en la Raspberry Pi para simplificar las conexiones y evitar el rebote (bouncing) o lecturas erróneas.
Conexiones:
- Un cable del sensor -> Raspberry Pi GND (Pin 6, 9, 14, 20, 25, 30, 34, 39)
- El otro cable del sensor -> Raspberry Pi GPIO 27 (Pin 13)
✍️ Escribiendo el Código Python
Crearemos un script Python que maneje tanto el servomotor como el sensor magnético. Este script controlará la cerradura y registrará los eventos de apertura/cierre.
Crea un nuevo archivo llamado smart_lock.py en tu Raspberry Pi:
nano smart_lock.py
Inserta el siguiente código:
import time
from gpiozero import Servo, Button
from signal import pause
# --- Configuración de Pines ---
# GPIO del servomotor. Aquí usamos el pin GPIO 17 (físico pin 11)
# Ajusta los valores min_pulse_width y max_pulse_width según tu servomotor.
# Estos valores definen los límites del movimiento del servomotor.
# Experimenta para encontrar los valores correctos para 'abierto' y 'cerrado'.
# servo = Servo(17, min_pulse_width=0.5/1000, max_pulse_width=2.5/1000) # Ejemplo de configuración avanzada
servo = Servo(17) # Configuración básica, usa valores por defecto que suelen funcionar bien
# GPIO del sensor magnético. Usamos el pin GPIO 27 (físico pin 13)
# pull_up=True significa que el pin está HIGH por defecto y LOW cuando el sensor se activa (cierra el circuito a GND).
# Cuando la puerta está cerrada (imán cerca), el sensor cierra el circuito y el pin se lee como LOW (activo).
# Cuando la puerta está abierta (imán lejos), el sensor abre el circuito y el pin se lee como HIGH (inactivo).
button_sensor = Button(27, pull_up=True)
# --- Estados de la Cerradura y el Sensor ---
# Define los valores de 'ángulo' para el servomotor para abrir y cerrar.
# 1 es la posición 'extrema' en un sentido, -1 en el otro.
# 0 es la posición central.
# Necesitarás calibrar estos valores para tu cerradura específica.
LOCK_POSITION = 0.5 # Posición para 'cerrar' la cerradura
UNLOCK_POSITION = -0.5 # Posición para 'abrir' la cerradura
# Estado inicial de la cerradura
is_locked = True
# --- Funciones de Control ---
def lock_door():
global is_locked
servo.value = LOCK_POSITION
is_locked = True
log_event(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Cerradura: CERRADA")
print("Cerradura: CERRADA")
def unlock_door():
global is_locked
servo.value = UNLOCK_POSITION
is_locked = False
log_event(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Cerradura: ABIERTA")
print("Cerradura: ABIERTA")
def toggle_lock():
if is_locked:
unlock_door()
else:
lock_door()
def door_opened_callback():
# Esta función se llama cuando el botón del sensor se 'presiona' (circuito cerrado, pin LOW).
# En nuestro caso, con pull_up=True, LOW significa que el imán está CERRADO (puerta cerrada).
# Por lo tanto, si el botón está 'presionado' (circuito cerrado), la puerta está cerrada.
# Si el botón no está 'presionado' (circuito abierto), la puerta está abierta.
# La lógica de gpiozero Button.when_pressed() es que se activa cuando el botón se presiona (circuito cerrado).
# Si la puerta está cerrada, el sensor se activa.
log_event(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Sensor: Puerta CERRADA")
print("Sensor: Puerta CERRADA")
def door_closed_callback():
# Esta función se llama cuando el botón del sensor se 'libera' (circuito abierto, pin HIGH).
# Si el botón está 'liberado', la puerta está ABIERTA.
log_event(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Sensor: Puerta ABIERTA")
print("Sensor: Puerta ABIERTA")
def log_event(message):
with open("smart_lock_events.log", "a") as log_file:
log_file.write(message + "\n")
# --- Configuración de Eventos del Sensor ---
# Asignar funciones a los eventos del sensor
# cuando el sensor está 'presionado' (imán cerca, puerta cerrada)
button_sensor.when_pressed = door_opened_callback
# cuando el sensor está 'liberado' (imán lejos, puerta abierta)
button_sensor.when_released = door_closed_callback
# --- Bucle Principal / Interacción ---
if __name__ == '__main__':
print("\n--- Sistema de Cerradura Inteligente Iniciado ---")
print(f"Cerradura inicial: {'CERRADA' if is_locked else 'ABIERTA'}")
log_event(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Sistema Iniciado")
# Asegurarse de que la cerradura esté en su posición inicial
lock_door()
time.sleep(1) # Pequeña pausa para que el servo se mueva
print("Introduce 'cerrar' para cerrar, 'abrir' para abrir, 'alternar' para cambiar estado, 'estado' para ver, 'salir' para terminar.")
try:
while True:
command = input("> ").lower()
if command == 'cerrar':
if not is_locked:
lock_door()
else:
print("La cerradura ya está cerrada.")
elif command == 'abrir':
if is_locked:
unlock_door()
else:
print("La cerradura ya está abierta.")
elif command == 'alternar':
toggle_lock()
elif command == 'estado':
print(f"Estado actual de la cerradura: {'CERRADA' if is_locked else 'ABIERTA'}")
print(f"Estado actual del sensor (puerta): {'CERRADA' if button_sensor.is_pressed else 'ABIERTA'}")
elif command == 'salir':
print("Saliendo del sistema.")
servo.close() # Libera el recurso del servomotor
button_sensor.close() # Libera el recurso del botón
break
else:
print("Comando no reconocido. Usa 'cerrar', 'abrir', 'alternar', 'estado' o 'salir'.")
time.sleep(0.1) # Pequeño retardo para evitar uso excesivo de CPU
except KeyboardInterrupt:
print("\nPrograma terminado por el usuario.")
finally:
servo.close()
button_sensor.close()
print("Recursos GPIO liberados.")
📖 Explicación del Código
- Importaciones:
gpiozerosimplifica el control de GPIOs.timepara pausas ysignalpara manejar interrupciones. Servo(17): Inicializa el servomotor en el pin GPIO 17. Puedes ajustarmin_pulse_widthymax_pulse_widthsi tu servomotor no se mueve en todo su rango. El valor por defecto suele ser 0.5ms a 2.5ms, que cubre el rango típico de 0° a 180°.Button(27, pull_up=True): Configura el pin GPIO 27 como entrada para el sensor.pull_up=Truesignifica que el pin estará en estadoHIGH(3.3V) por defecto. Cuando el imán está cerca, el sensor cierra el circuito aGND, llevando el pin aLOW. La lógica del sensor se invierte aquí para quewhen_pressedse active cuando la puerta está cerrada.LOCK_POSITIONyUNLOCK_POSITION: Estos valores (entre -1 y 1) controlan la posición del servomotor.-1es un extremo,1es el otro, y0es el centro. Debes calibrar estos valores empíricamente para tu cerradura específica. Conecta el servomotor y ejecuta el script, luego ajusta estos valores hasta que la cerradura se abra y cierre correctamente.lock_door()/unlock_door()/toggle_lock(): Funciones para controlar el servomotor y actualizar el estado de la cerradura.door_opened_callback()/door_closed_callback(): Estas funciones se ejecutan automáticamente cuando el estado del sensor cambia.when_pressedse activa cuando el circuito del sensor se cierra (puerta cerrada), ywhen_releasedcuando se abre (puerta abierta).log_event(message): Guarda un registro de los eventos en un archivosmart_lock_events.log. Esto es útil para auditar el acceso.- Bucle principal (
if __name__ == '__main__':):- Inicializa la cerradura a un estado cerrado.
- Entra en un bucle infinito que espera comandos del usuario para abrir, cerrar o alternar la cerradura.
- Muestra el estado actual de la cerradura y el sensor cuando se solicita.
- Maneja la salida limpia del programa con
KeyboardInterrupt.
🧪 Prueba y Calibración
Una vez que tengas todo conectado y el código guardado, es hora de probarlo y calibrar el servomotor.
1. Ejecutar el Script
Desde la terminal de tu Raspberry Pi, ejecuta el script Python:
python3 smart_lock.py
2. Calibración del Servomotor
Cuando el script se inicie, la cerradura intentará ir a la LOCK_POSITION. Observa el movimiento del servomotor. Experimenta con los valores de LOCK_POSITION y UNLOCK_POSITION en el código. Edita el archivo smart_lock.py, guarda y vuelve a ejecutar para probar los cambios.
- Ejemplo de calibración: Si
LOCK_POSITION = 0.5mueve la cerradura a una posición "casi cerrada" pero no del todo, prueba con0.6o0.7. SiUNLOCK_POSITION = -0.5no la abre lo suficiente, prueba con-0.6o-0.7. - El rango del
valuedegpiozero.Servova de-1(un extremo) a1(el otro extremo).0es el punto central.
3. Prueba del Sensor Magnético
Mientras el script está ejecutándose, acerca y aleja el imán del sensor magnético. Deberías ver mensajes en la consola (Sensor: Puerta CERRADA o Sensor: Puerta ABIERTA) y también se registrarán en el archivo smart_lock_events.log.
cat smart_lock_events.log
Este comando te permitirá ver el contenido del archivo de registro.
🔩 Adaptación Mecánica de la Cerradura
Esta es la parte más creativa y dependiente de la cerradura que elijas. El objetivo es que el servomotor pueda mover el pestillo o el mecanismo de la cerradura.
Ideas para la Adaptación:
- Cerraduras de pestillo simple: Puedes crear una pequeña palanca que se conecte al brazo del servomotor y empuje/tire del pestillo.
- Impresión 3D: Diseñar e imprimir piezas a medida es una excelente opción para integrar el servomotor de forma limpia y efectiva.
- Soportes universales: Existen soportes para servomotores que puedes atornillar a una superficie y luego conectar una varilla o un brazo al mecanismo de la cerradura.
🚀 Ejecución en Segundo Plano y Arranque Automático
Para que tu sistema de cerradura inteligente sea práctico, querrás que el script se ejecute automáticamente al iniciar la Raspberry Pi y en segundo plano.
Ejecutar en Segundo Plano (temporal)
Puedes usar nohup y & para ejecutar el script en segundo plano sin que se detenga al cerrar la terminal:
nohup python3 smart_lock.py &
Para detenerlo, necesitarás encontrar el ID del proceso (ps aux | grep smart_lock.py) y luego matarlo (kill <PID>).
Servicio Systemd (Recomendado para Producción)
Crear un servicio Systemd es la forma más robusta de gestionar scripts que deben ejecutarse al inicio y en segundo plano.
- Crea el archivo de servicio:
sudo nano /etc/systemd/system/smartlock.service
- Pega el siguiente contenido (ajusta la ruta si es necesario):
[Unit]
Description=Servicio de Cerradura Inteligente con Raspberry Pi
After=network.target
[Service]
ExecStart=/usr/bin/python3 /home/pi/smart_lock.py
WorkingDirectory=/home/pi/
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
* `ExecStart`: La ruta completa al intérprete de Python y a tu script.
* `WorkingDirectory`: El directorio donde se encuentra tu script.
* `User`: El usuario bajo el cual se ejecutará el script (normalmente `pi`).
3. Habilita y arranca el servicio:
sudo systemctl daemon-reload
sudo systemctl enable smartlock.service
sudo systemctl start smartlock.service
- Verifica el estado del servicio:
sudo systemctl status smartlock.service
Ahora, tu cerradura inteligente se iniciará automáticamente cada vez que arranques tu Raspberry Pi.
📈 Posibles Mejoras y Expansiones
Este proyecto es una base sólida. Aquí tienes algunas ideas para llevarlo más allá:
- Interfaz de Usuario Web: Crea una página web sencilla con Flask o Node.js para controlar la cerradura desde cualquier dispositivo en tu red local.
- Notificaciones Avanzadas: Integra servicios como Pushbullet, Telegram o Home Assistant para recibir notificaciones en tu teléfono cuando la puerta se abre o cierra.
- Autenticación: Añade métodos de autenticación como lectores RFID, teclados numéricos, o incluso reconocimiento facial con una cámara Raspberry Pi.
- Registro en Base de Datos: Guarda los eventos en una base de datos (SQLite, MySQL) en lugar de un archivo de texto para un análisis más profundo.
- Energía de Respaldo: Un pequeño UPS o una batería de respaldo para asegurar que la cerradura funcione incluso durante cortes de energía.
- Modo "Vacaciones": Un modo que genere una alerta especial si la puerta se abre inesperadamente mientras no estás en casa.
¿Por qué no usar el PIN de un servomotor para alimentación?
No es recomendable alimentar el servomotor directamente desde los pines GPIO de la Raspberry Pi (los pines de 3.3V o incluso de 5V que no sean los dedicados de alimentación). Los servomotores pueden consumir picos de corriente significativos, especialmente al arrancar o bajo carga. Esto puede sobrecargar los pines GPIO o incluso dañar la Raspberry Pi. Es preferible usar los pines dedicados de 5V de la Raspberry Pi, o incluso una fuente de alimentación externa si el servomotor es muy potente (por ejemplo, los de modelismo grande).¿Puedo usar un tipo diferente de cerradura?
Sí, el principio es el mismo: adaptar un mecanismo que el servomotor pueda mover. Desde cerraduras de pestillo simple hasta cerrojos más complejos, la clave es encontrar el punto donde el servomotor puede aplicar fuerza para abrir o cerrar. La impresión 3D es tu aliada aquí.✅ Conclusión
¡Felicidades! Has construido tu propio sistema de cerradura inteligente y monitoreo de acceso con Raspberry Pi. Este proyecto te ha permitido combinar hardware y software para resolver un problema práctico de seguridad y comodidad en el hogar. La Raspberry Pi es una plataforma increíblemente versátil, y este es solo el comienzo de lo que puedes lograr con ella. Sigue experimentando y expandiendo las funcionalidades. ¡El límite es tu imaginación!
Tutoriales relacionados
- Crea tu Propio Servidor de Almacenamiento NAS con Raspberry Pi y OpenMediaVaultintermediate20 min
- Automatiza tu Hogar: Control de Luces Inteligentes con Raspberry Pi y Pythonintermediate25 min
- Crea tu Propio Servidor VPN WireGuard con Raspberry Pi: Accede de Forma Segura a tu Red Domésticaintermediate20 min
- Controla LEDs RGB Direccionables con Raspberry Pi: ¡Iluminación Dinámica y Creativa!intermediate20 min
- Controla el Entorno de tu Hogar: Sistema de Monitorización y Control de Temperatura/Humedad con Raspberry Piintermediate20 min
Comentarios (0)
Aún no hay comentarios. ¡Sé el primero!