Nota

Hola, ¡bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook! Sumérgete más profundamente en Raspberry Pi, Arduino y ESP32 junto a otros entusiastas.

¿Por qué unirse?

  • Soporte experto: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.

  • Aprender y compartir: Intercambia consejos y tutoriales para mejorar tus habilidades.

  • Avances exclusivos: Accede anticipadamente a nuevos anuncios de productos y adelantos exclusivos.

  • Descuentos especiales: Disfruta de descuentos exclusivos en nuestros productos más recientes.

  • Promociones y sorteos festivos: Participa en sorteos y promociones navideñas.

👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy mismo.

4.1.4 Cámara de Captura Automática

Introducción

Cuando estés fuera, las pequeñas ardillas del bosque podrían visitar tu alféizar. ¡Vamos a hacer una cámara de captura automática para dejar fotos de estas pequeñas adorables!

Componentes Necesarios

En este proyecto, necesitamos los siguientes componentes.

../_images/3.1.18components.png

Es muy conveniente comprar un kit completo, aquí está el enlace:

Nombre

ELEMENTOS EN ESTE KIT

ENLACE

Kit Raphael

337

Raphael Kit

También puedes comprarlos por separado en los enlaces a continuación.

INTRODUCCIÓN DEL COMPONENTE

ENLACE DE COMPRA

Placa de Extensión GPIO

COMPRAR

Protoboard

COMPRAR

Cables de Puente

COMPRAR

Resistor

COMPRAR

Módulo de Cámara

COMPRAR

Módulo Sensor de Movimiento PIR

-

Diagrama Esquemático

Nombre T-Board

cableado físico

wiringPi

BCM

GPIO17

Pin 11

0

17

../_images/1.1.18_schematic.png

Procedimientos Experimentales

Antes de este proyecto, debes asegurarte de haber completado 3.1.1 Módulo Fotográfico.

Paso 1: Construye el circuito.

../_images/3.1.18fritzing.png

Paso 2: Para conectar el módulo de la cámara y completar la configuración, consulta: Módulo de Cámara.

Paso 3: Ve al escritorio de Raspberry Pi. Puede que necesites una pantalla para una mejor experiencia, consulta: Connect your Raspberry Pi. O accede al escritorio de Raspberry Pi de forma remota, para un tutorial detallado consulta Escritorio Remoto.

Paso 4: Abre una terminal y accede a la carpeta del código.

cd ~/raphael-kit/python/

Paso 5: Ejecuta.

sudo python3 4.1.4_AutomaticCaptureCamera.py

Después de que el código se ejecute, el PIR detectará el entorno circundante, y si detecta que una ardilla pasa, la cámara tomará una foto. El intervalo de las fotos es de 3 segundos, y el número total de fotos tomadas se mostrará en la ventana de impresión.

Hay dos potenciómetros en el módulo PIR: uno es para ajustar la sensibilidad y el otro es para ajustar la distancia de detección. Para que el módulo PIR funcione mejor, necesitas girar ambos en sentido antihorario hasta el final.

../_images/PIR_TTE.png

Nota

También puedes abrir 4.1.4_AutomaticCaptureCamera.py en la ruta ~/raphael-kit/python/ con un IDE de Python, hacer clic en el botón Ejecutar para correrlo, y detener el código con el botón Detener.

Código

Nota

Puedes Modificar/Restablecer/Copiar/Ejecutar/Detener el código a continuación. Pero antes de eso, necesitas ir a la ruta del código fuente como raphael-kit/python. Después de modificar el código, puedes ejecutarlo directamente para ver el efecto.

#!/usr/bin/env python3
import time
import os
import RPi.GPIO as GPIO
from picamera2 import Picamera2

# ----------------------------
# USER DIRECTORY
# ----------------------------
user = os.getlogin()
user_home = os.path.expanduser(f'~{user}')

# ----------------------------
# GPIO SETUP
# ----------------------------
PIR_PIN = 17  # PIR motion sensor connected to GPIO17

GPIO.setmode(GPIO.BCM)
GPIO.setup(PIR_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

# ----------------------------
# CAMERA SETUP
# ----------------------------
camera = Picamera2()
camera.start()

print("Motion detection started. Press Ctrl+C to exit.")

# ----------------------------
# MAIN LOOP
# ----------------------------
try:
    i = 1
    while True:
        if GPIO.input(PIR_PIN) == GPIO.HIGH:
            filename = f"{user_home}/capture{i}.jpg"
            camera.capture_file(filename)
            print(f"Motion detected. Saved image #{i}: {filename}")
            time.sleep(3)
            i += 1
        else:
            print("waiting")
            time.sleep(0.5)

# ----------------------------
# KEYBOARD INTERRUPT
# ----------------------------
except KeyboardInterrupt:
    print("\nKeyboard interrupt received. Exiting program...")

# ----------------------------
# CLEANUP
# ----------------------------
finally:
    try:
        camera.close()
    except:
        pass

    GPIO.cleanup()
    print("Program exited cleanly.")

Explicación del código

  1. Lee el directorio personal del usuario actual para guardar las imágenes capturadas.

    user = os.getlogin()
    user_home = os.path.expanduser(f'~{user}')
    

    Esto obtiene el nombre del usuario activo y construye la ruta completa a su directorio personal.

  2. Configura GPIO y establece el sensor PIR en GPIO17 como entrada.

    PIR_PIN = 17
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(PIR_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    

    Usar una resistencia pull-down garantiza que el pin lea LOW cuando no se detecta movimiento.

  3. Inicializa la instancia de Picamera2 y enciende la cámara.

    camera = Picamera2()
    camera.start()
    

    La cámara se activa para poder capturar imágenes inmediatamente cuando se detecte movimiento.

  4. Detecta movimiento leyendo el estado de entrada del sensor PIR.

    if GPIO.input(PIR_PIN) == GPIO.HIGH:
    

    Cuando el PIR detecta movimiento, produce una señal HIGH, lo que activa el proceso de captura.

  5. Captura una imagen y la guarda usando un número de archivo secuencial.

    filename = f"{user_home}/capture{i}.jpg"
    camera.capture_file(filename)
    

    Cada detección guarda una nueva imagen como capture1.jpg, capture2.jpg, etc.

  6. Espera tres segundos después de una captura activada por movimiento.

    time.sleep(3)
    

    Esto evita que se tomen múltiples imágenes demasiado rápido tras un solo evento de movimiento.

  7. Imprime “waiting” cuando no se detecta movimiento y vuelve a verificar después de una breve pausa.

    else:
        print("waiting")
        time.sleep(0.5)
    

    Esto asegura una monitorización constante sin consumir demasiados recursos de CPU.

  8. Maneja la interrupción por teclado (Ctrl+C) para salir del programa de forma segura.

    except KeyboardInterrupt:
        print("\nKeyboard interrupt received. Exiting program...")
    

    Se muestra un mensaje de salida limpia cuando el usuario detiene el programa manualmente.

  9. Libera la cámara y los recursos GPIO antes de salir.

    finally:
        camera.close()
        GPIO.cleanup()
    

    Esto garantiza que la cámara se apague correctamente y que todos los pines GPIO vuelvan a un estado seguro.

Imagen del Fenómeno

../_images/4.1.4spycamera.JPG