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.
Es muy conveniente comprar un kit completo, aquí está el enlace:
Nombre |
ELEMENTOS EN ESTE KIT |
ENLACE |
|---|---|---|
Kit Raphael |
337 |
También puedes comprarlos por separado en los enlaces a continuación.
INTRODUCCIÓN DEL COMPONENTE |
ENLACE DE COMPRA |
|---|---|
Diagrama Esquemático
Nombre T-Board |
cableado físico |
wiringPi |
BCM |
GPIO17 |
Pin 11 |
0 |
17 |
GPIO18 |
Pin 12 |
1 |
18 |
Procedimientos Experimentales
Paso 1: Construye el circuito.
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+Cen 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
Verifica si el botón conectado a
BUTTON_PINestá 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 aLOWy se activa el proceso de captura de la foto.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.
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.
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.
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.