Nota

¡Hola! Bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook. Profundiza en Raspberry Pi, Arduino y ESP32 junto a otros entusiastas.

¿Por qué unirte?

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

  • Aprende y comparte: Intercambia consejos y tutoriales para mejorar tus habilidades.

  • Avances exclusivos: Obtén acceso anticipado a anuncios de nuevos productos y adelantos exclusivos.

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

  • Promociones y sorteos festivos: Participa en sorteos y promociones durante las festividades.

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

4.1.5 Bienvenida

Introducción

En este proyecto, utilizaremos un sensor PIR para detectar el movimiento de los peatones y usaremos servos, LED y un zumbador para simular el funcionamiento de la puerta automática de una tienda de conveniencia. Cuando un peatón aparezca dentro del rango de detección del PIR, la luz indicadora se encenderá, la puerta se abrirá y el zumbador reproducirá un timbre de apertura.

Componentes necesarios

En este proyecto, necesitamos los siguientes componentes.

../_images/4.1.8_welcome_list.png

Es definitivamente conveniente comprar un kit completo, aquí tienes 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

Módulo Sensor de Movimiento PIR

-

Servo

COMPRAR

Zumbador

COMPRAR

Transistor

COMPRAR

Diagrama Esquemático

Nombre de la T-Board

física

wiringPi

BCM

GPIO18

Pin 12

1

18

GPIO17

Pin 11

0

17

GPIO27

Pin 13

2

27

GPIO22

Pin 15

3

22

../_images/4.1.8_welcome_schematic.png

Procedimientos Experimentales

Paso 1: Monta el circuito.

../_images/4.1.8_welcome_circuit.png

Paso 2: Cambia de directorio.

cd ~/raphael-kit/python-pi5

Paso 3: Ejecuta.

sudo python3 4.1.8_Welcome_zero.py

Después de ejecutar el código, si el sensor PIR detecta que alguien pasa, la puerta se abrirá automáticamente (simulada por el servo), se encenderá la luz indicadora y sonará el timbre de la puerta. Una vez que el timbre suene, el sistema cerrará automáticamente la puerta y apagará la luz indicadora, esperando a que alguien pase de nuevo.

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

../_images/4.1.8_PIR_TTE.png

Advertencia

Si recibe el mensaje de error RuntimeError: Cannot determine SOC peripheral base address, consulte Si «gpiozero» no funciona.

Código

Nota

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

#!/usr/bin/env python3

from gpiozero import LED, MotionSensor, Servo, TonalBuzzer
import time

# Configuración de pines GPIO para LED, sensor de movimiento (PIR) y zumbador
ledPin = LED(6)
pirPin = MotionSensor(21)
buzPin = TonalBuzzer(27)

# Factor de corrección de ancho de pulso del motor servo y cálculo
myCorrection = 0.45
maxPW = (2.0 + myCorrection) / 1000  # Ancho de pulso máximo
minPW = (1.0 - myCorrection) / 1000  # Ancho de pulso mínimo

# Inicializar servo con anchos de pulso personalizados
servoPin = Servo(25, min_pulse_width=minPW, max_pulse_width=maxPW)

# Melodía musical para el zumbador, con notas y duraciones
tune = [('C#4', 0.2), ('D4', 0.2), (None, 0.2),
        ('Eb4', 0.2), ('E4', 0.2), (None, 0.6),
        ('F#4', 0.2), ('G4', 0.2), (None, 0.6),
        ('Eb4', 0.2), ('E4', 0.2), (None, 0.2),
        ('F#4', 0.2), ('G4', 0.2), (None, 0.2),
        ('C4', 0.2), ('B4', 0.2), (None, 0.2),
        ('F#4', 0.2), ('G4', 0.2), (None, 0.2),
        ('B4', 0.2), ('Bb4', 0.5), (None, 0.6),
        ('A4', 0.2), ('G4', 0.2), ('E4', 0.2),
        ('D4', 0.2), ('E4', 0.2)]

def setAngle(angle):
    """
    Move the servo to a specified angle.
    :param angle: Angle in degrees (0-180).
    """
    value = float(angle / 180)  # Convertir ángulo a valor de servo
    servoPin.value = value      # Establecer posición del servo
    time.sleep(0.001)           # Breve pausa para el movimiento del servo

def doorbell():
    """
    Play a musical tune using the buzzer.
    """
    for note, duration in tune:
        buzPin.play(note)       # Reproducir la nota
        time.sleep(float(duration))  # Duración de la nota
    buzPin.stop()               # Detener el zumbador después de la melodía

def closedoor():
    # Apaga el LED y mueve el servo para cerrar la puerta
    ledPin.off()
    for i in range(180, -1, -1):
        setAngle(i)             # Mover servo de 180 a 0 grados
        time.sleep(0.001)       # Breve pausa para movimiento suave
    time.sleep(1)               # Esperar después de cerrar la puerta

def opendoor():
    # Encender LED, abrir puerta (mover servo), reproducir melodía, cerrar puerta
    ledPin.on()
    for i in range(0, 181):
        setAngle(i)             # Mover servo de 0 a 180 grados
        time.sleep(0.001)       # Breve pausa para movimiento suave
    time.sleep(1)               # Esperar antes de reproducir la melodía
    doorbell()                  # Reproducir la melodía del timbre
    closedoor()                 # Cerrar la puerta después de la melodía

def loop():
    # Bucle principal para verificar movimiento y operar la puerta
    while True:
        if pirPin.motion_detected:
            opendoor()               # Abrir puerta si se detecta movimiento
        time.sleep(0.1)              # Breve pausa en el bucle

try:
    loop()
except KeyboardInterrupt:
    # Limpiar GPIO al interrumpir el usuario (por ejemplo, Ctrl+C)
    buzPin.stop()
    ledPin.off()

Explicación del Código

  1. El script comienza importando los módulos necesarios. La biblioteca gpiozero se utiliza para interactuar con el LED, el sensor de movimiento, el motor servo y el zumbador tonal. El módulo time se utiliza para funciones relacionadas con el tiempo.

    #!/usr/bin/env python3
    from gpiozero import LED, MotionSensor, Servo, TonalBuzzer
    import time
    
  2. Inicializa el LED, el sensor de movimiento PIR y el zumbador tonal en sus respectivos pines GPIO.

    # Configuración de pines GPIO para LED, sensor de movimiento (PIR) y zumbador
    ledPin = LED(6)
    pirPin = MotionSensor(21)
    buzPin = TonalBuzzer(27)
    
  3. Calcula los anchos de pulso máximos y mínimos para el motor servo, incorporando un factor de corrección para un ajuste fino.

    # Factor de corrección de ancho de pulso del motor servo y cálculo
    myCorrection = 0.45
    maxPW = (2.0 + myCorrection) / 1000  # Ancho de pulso máximo
    minPW = (1.0 - myCorrection) / 1000  # Ancho de pulso mínimo
    
  4. Inicializa el motor servo en el pin GPIO 25 con los anchos de pulso personalizados para una posición precisa.

    # Inicializar servo con anchos de pulso personalizados
    servoPin = Servo(25, min_pulse_width=minPW, max_pulse_width=maxPW)
    
  5. La melodía se define como una secuencia de notas (frecuencia) y duraciones (segundos).

    # Melodía musical para el zumbador, con notas y duraciones
    tune = [('C#4', 0.2), ('D4', 0.2), (None, 0.2),
            ('Eb4', 0.2), ('E4', 0.2), (None, 0.6),
            ('F#4', 0.2), ('G4', 0.2), (None, 0.6),
            ('Eb4', 0.2), ('E4', 0.2), (None, 0.2),
            ('F#4', 0.2), ('G4', 0.2), (None, 0.2),
            ('C4', 0.2), ('B4', 0.2), (None, 0.2),
            ('F#4', 0.2), ('G4', 0.2), (None, 0.2),
            ('B4', 0.2), ('Bb4', 0.5), (None, 0.6),
            ('A4', 0.2), ('G4', 0.2), ('E4', 0.2),
            ('D4', 0.2), ('E4', 0.2)]
    
  6. Función para mover el servo a un ángulo especificado. Convierte el ángulo a un valor entre 0 y 1 para el servo.

    def setAngle(angle):
        """
        Move the servo to a specified angle.
        :param angle: Angle in degrees (0-180).
        """
        value = float(angle / 180)  # Convertir ángulo a valor de servo
        servoPin.value = value      # Establecer posición del servo
        time.sleep(0.001)           # Breve pausa para el movimiento del servo
    
  7. Función para reproducir una melodía musical utilizando el zumbador. Itera a través de la lista tune, reproduciendo cada nota por su duración especificada.

    def doorbell():
        """
        Play a musical tune using the buzzer.
        """
        for note, duration in tune:
            buzPin.play(note)       # Reproducir la nota
            time.sleep(float(duration))  # Duración de la nota
        buzPin.stop()               # Detener zumbador después de la melodía
    
  8. Funciones para abrir y cerrar la puerta utilizando el motor servo. La función opendoor enciende el LED, abre la puerta, reproduce la melodía y luego cierra la puerta.

    def closedoor():
        # Apaga el LED y mueve el servo para cerrar la puerta
        ledPin.off()
        for i in range(180, -1, -1):
            setAngle(i)             # Mover servo de 180 a 0 grados
            time.sleep(0.001)       # Breve pausa para movimiento suave
        time.sleep(1)               # Esperar después de cerrar la puerta
    
    def opendoor():
        # Encender LED, abrir puerta (mover servo), reproducir melodía, cerrar puerta
        ledPin.on()
        for i in range(0, 181):
            setAngle(i)             # Mover servo de 0 a 180 grados
            time.sleep(0.001)       # Breve pausa para movimiento suave
        time.sleep(1)               # Esperar antes de reproducir la melodía
        doorbell()                  # Reproducir la melodía del timbre
        closedoor()                 # Cerrar la puerta después de la melodía
    
  9. Bucle principal que verifica constantemente la detección de movimiento. Cuando se detecta movimiento, se activa la función opendoor.

    def loop():
        # Bucle principal para verificar movimiento y operar la puerta
        while True:
            if pirPin.motion_detected:
                opendoor()               # Abrir puerta si se detecta movimiento
            time.sleep(0.1)              # Breve pausa en el bucle
    
  10. Ejecuta el bucle principal y asegura que el script se pueda detener con un comando de teclado (Ctrl+C), apagando el zumbador y el LED para una salida limpia.

    try:
        loop()
    except KeyboardInterrupt:
        # Limpiar GPIO al interrumpir el usuario (por ejemplo, Ctrl+C)
        buzPin.stop()
        ledPin.off()