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.1 Cámara

Introducción

Aquí haremos una cámara con obturador. Cuando presiones el botón, la cámara tomará una foto mientras el LED parpadea.

Componentes Necesarios

En este proyecto, necesitamos los siguientes componentes.

../_images/3.1.15camera_list.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

LED

COMPRAR

Botón

COMPRAR

Módulo de Cámara

COMPRAR

Diagrama Esquemático

Nombre T-Board

cableado físico

wiringPi

BCM

GPIO17

Pin 11

0

17

GPIO18

Pin 12

1

18

../_images/4.1.1_camera_schematic.png

Procedimientos Experimentales

Paso 1: Construye el circuito.

../_images/4.1.1_camera_circuit.png

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

Paso 3: Entra en el 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.1_Camera.py

Después de ejecutar el código:

  • Se abre una ventana con la vista previa en vivo de la cámara.

  • El programa espera a que se presione el botón.

  • Cuando el botón es presionado:

    • El LED parpadea tres veces.

    • La cámara captura una foto.

    • El LED permanece encendido durante 0.5 segundos como confirmación.

    • La imagen se guarda con un nombre basado en una marca temporal en /home/<username>/.

  • Presiona Ctrl+C en cualquier momento para detener la vista previa, liberar los recursos de GPIO y salir del programa de forma segura.

Nota

También puedes abrir 4.1.1_Camera.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.

Si quieres descargar la foto a tu PC, por favor consulta Software FileZilla.

Código

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

# ----------------------------
# GPIO SETUP
# ----------------------------

BUTTON_PIN = 18  # The push button is connected to GPIO18
LED_PIN = 17     # The LED is connected to GPIO17

GPIO.setmode(GPIO.BCM)  # Use BCM GPIO numbering

# The button uses a 10K pull-up resistor externally.
# When released → HIGH, when pressed → LOW.
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)

# LED is an output (HIGH → ON, LOW → OFF)
GPIO.setup(LED_PIN, GPIO.OUT)
GPIO.output(LED_PIN, GPIO.LOW)  # Ensure LED is OFF at startup

# ----------------------------
# USER DIRECTORY SETUP
# ----------------------------

# Get the current logged-in username
user = os.getlogin()

# Build the path to the user's home directory (ex: /home/pi)
user_home = os.path.expanduser(f"~{user}")

# ----------------------------
# CAMERA SETUP
# ----------------------------

# Create a Picamera2 object
camera = Picamera2()

# Create a preview configuration:
# main → the main camera stream
# size → resolution 800x600
# format → display format used by the preview window
preview_config = camera.create_preview_configuration(
    main={"size": (800, 600), "format": "XRGB8888"}
)

# Apply the configuration to the camera
camera.configure(preview_config)

# Start the preview window using QTGL (GPU-accelerated)
camera.start_preview(Preview.QTGL)

# Start the camera hardware
camera.start()

print("Ready! Press the button to take a photo...")

# ----------------------------
# MAIN LOOP
# ----------------------------
try:
    while True:
        # Check if button is pressed (LOW means pressed)
        if GPIO.input(BUTTON_PIN) == GPIO.LOW:
            print("Button pressed! Taking photo...")

            # Flash LED 3 times to warn before taking the photo
            for _ in range(3):
                GPIO.output(LED_PIN, GPIO.HIGH)
                time.sleep(0.1)
                GPIO.output(LED_PIN, GPIO.LOW)
                time.sleep(0.1)

            # Build a unique filename using current date and time
            # Example: /home/pi/my_photo_20251201_143522.jpg
            timestamp = time.strftime("%Y%m%d_%H%M%S")
            filename = os.path.join(user_home, f"my_photo_{timestamp}.jpg")

            # Capture the image
            camera.capture_file(filename)

            print(f"Photo saved to: {filename}")

            # Turn LED ON briefly to confirm capture
            GPIO.output(LED_PIN, GPIO.HIGH)
            time.sleep(0.5)
            GPIO.output(LED_PIN, GPIO.LOW)

            # Debounce delay to prevent repeated triggers
            time.sleep(0.3)

        # Small delay to reduce CPU usage
        time.sleep(0.01)

# ----------------------------
# CLEAN EXIT WHEN CTRL+C IS PRESSED
# ----------------------------
except KeyboardInterrupt:
    print("\nCtrl+C received, exiting...")

# ----------------------------
# CLEANUP SECTION
# ----------------------------
finally:
    # Safely try to stop the camera preview
    try:
        camera.stop_preview()
    except:
        pass  # Ignore errors if preview wasn't running

    # Safely close the camera device
    try:
        camera.close()
    except:
        pass

    # Reset GPIO pins to a safe state
    GPIO.cleanup()

    print("Program exited cleanly.")

Explicación del código

  1. Verifica si el botón conectado a BUTTON_PIN está presionado.

    if GPIO.input(BUTTON_PIN) == GPIO.LOW:
    

    Como el botón usa una resistencia pull-up, su estado predeterminado es HIGH. Cuando el botón se presiona, la señal cambia a LOW y se activa el proceso de captura de la foto.

  2. Hace parpadear el LED tres veces como retroalimentación visual antes de tomar una foto.

    for _ in range(3):
        GPIO.output(LED_PIN, GPIO.HIGH)
        time.sleep(0.1)
        GPIO.output(LED_PIN, GPIO.LOW)
        time.sleep(0.1)
    

    Esto indica que la Raspberry Pi se está preparando para capturar una imagen.

  3. Genera un nombre de archivo único usando una marca temporal (timestamp) y captura una foto.

    timestamp = time.strftime("%Y%m%d_%H%M%S")
    filename = os.path.join(user_home, f"my_photo_{timestamp}.jpg")
    camera.capture_file(filename)
    

    La marca temporal garantiza que cada foto tenga un nombre diferente. La imagen se guarda en el directorio personal del usuario.

  4. Enciende el LED durante 0.5 segundos para confirmar que se tomó la foto.

    GPIO.output(LED_PIN, GPIO.HIGH)
    time.sleep(0.5)
    GPIO.output(LED_PIN, GPIO.LOW)
    

    Esta breve iluminación indica que la captura fue exitosa.

  5. Agrega una pequeña demora para evitar múltiples activaciones por una sola pulsación del botón.

    time.sleep(0.3)
    

    Este retardo de «debounce» asegura un funcionamiento confiable del botón.

Imagen del Fenómeno

../_images/4.1.1camera.JPG