Nota

¡Hola! Bienvenido a la Comunidad de Entusiastas de SunFounder para Raspberry Pi, Arduino y ESP32 en Facebook. Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 junto a otros entusiastas.

¿Por qué unirte?

  • Soporte Experto: Resuelve problemas post-venta y desafíos técnicos con la ayuda de nuestra comunidad y equipo.

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

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

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

  • Promociones Festivas y Sorteos: Participa en sorteos y promociones especiales en días festivos.

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

3.1.2 Bienvenida

Introducción

En este proyecto, usaremos un sensor PIR para detectar el movimiento de peatones y utilizaremos servos, un LED y un zumbador para simular el funcionamiento de una puerta con sensor, como la de una tienda de conveniencia. Cuando el peatón esté dentro del rango de detección del PIR, la luz indicadora se encenderá, la puerta se abrirá y el zumbador tocará el timbre de bienvenida.

Componentes

_images/list_Welcome.png

Diagrama Esquemático

T-Board Name

physical

wiringPi

BCM

GPIO18

Pin 12

1

18

GPIO17

Pin 11

0

17

GPIO27

Pin 13

2

27

GPIO22

Pin 15

3

22

_images/Schematic_three_one2.png

Procedimientos Experimentales

Paso 1: Construye el circuito.

_images/image239.png

Para Usuarios de Lenguaje C

Paso 2: Cambia al directorio adecuado.

cd ~/davinci-kit-for-raspberry-pi/c/3.1.2/

Paso 3: Compila el código.

gcc 3.1.2_Welcome.c -lwiringPi

Paso 4: Ejecuta el archivo.

sudo ./a.out

Después de ejecutar el código, si el sensor PIR detecta a alguien pasando, la puerta se abrirá automáticamente (simulada por el servo), se encenderá el indicador y se reproducirá el sonido del timbre. Tras la melodía de bienvenida, el sistema cerrará la puerta y apagará la luz indicadora, esperando la próxima detección de movimiento.

El módulo PIR tiene dos potenciómetros: uno para ajustar la sensibilidad y otro para ajustar la distancia de detección. Para un mejor funcionamiento, gira ambos en sentido antihorario hasta el final.

Nota

Si el programa no funciona después de ejecutar el código, o aparece el mensaje de error: "wiringPi.h: No such file or directory", consulta ¿El código en C no funciona?.

Explicación del Código

void setAngle(int pin, int angle){    // Crea una función para controlar el ángulo del servo.
    if(angle < 0)
        angle = 0;
    if(angle > 180)
        angle = 180;
    softPwmWrite(pin,Map(angle, 0, 180, 5, 25));
}

Se crea una función, setAngle, para establecer el ángulo del servo entre 0 y 180 grados.

void doorbell(){
for(int i=0;i<sizeof(song)/4;i++){
        softToneWrite(BuzPin, song[i]);
        delay(beat[i] * 250);
    }

Se crea una función, doorbell, que permite que el zumbador reproduzca música.

void closedoor(){
digitalWrite(ledPin, LOW);   // Apaga el LED
for(int i=180;i>-1;i--){  // Hace que el servo gire del ángulo máximo al mínimo
    setAngle(servoPin,i);
    delay(1);
    }
}

Se crea la función closedoor para simular el cierre de la puerta, apagar el LED y hacer que el servo gire de 180 grados a 0 grados.

void opendoor(){
    digitalWrite(ledPin, HIGH);   // Enciende el LED
    for(int i=0;i<181;i++){  // Hace que el servo gire del ángulo mínimo al máximo
        setAngle(servoPin,i);
        delay(1);
    }
    doorbell();
    closedoor();
}

La función opendoor() incluye varias partes: encender la luz indicadora, mover el servo (simulando la apertura de la puerta), reproducir la melodía de bienvenida y luego llamar a la función closedoor() después de la música.

    int main(void)
{
    if(wiringPiSetup() == -1){ // Si la inicialización de wiringPi falla, imprime un mensaje en pantalla.
        printf("setup wiringPi failed !");
        return 1;
    }
    if(softToneCreate(BuzPin) == -1){
        printf("setup softTone failed !");
        return 1;
......

En la función main(), se inicializa la biblioteca wiringPi y se configura softTone. Luego se establece ledPin como salida y pirPin como entrada. Si el sensor PIR detecta movimiento, se llama a la función opendoor para simular la apertura de la puerta.

Para Usuarios de Python

Paso 2: Cambia al directorio.

cd ~/davinci-kit-for-raspberry-pi/python/

Paso 3: Ejecuta el código.

sudo python3 3.1.2_Welcome.py

Después de ejecutar el código, si el sensor PIR detecta a alguien pasando, la puerta se abrirá automáticamente (simulada por el servo), se encenderá el indicador y se reproducirá el sonido del timbre. Luego de la música, el sistema cerrará la puerta y apagará la luz indicadora, esperando el siguiente paso de alguien.

El módulo PIR tiene dos potenciómetros: uno para ajustar la sensibilidad y otro para ajustar la distancia de detección. Para un funcionamiento óptimo, gira ambos en sentido antihorario hasta el final.

código

Nota

Puedes Modificar/Restablecer/Copiar/Ejecutar/Detener el código a continuación. Pero antes, debes ir a la ruta de origen del código, como davinci-kit-for-raspberry-pi/python.

import RPi.GPIO as GPIO
import time

SERVO_MIN_PULSE = 500
SERVO_MAX_PULSE = 2500

ledPin = 18    # define el ledPin
pirPin = 17    # define el sensorPin
servoPin = 22  # define el servoPin
buzPin = 27    # define el buzzerPin

CL = [0, 131, 147, 165, 175, 196, 211, 248]        # Frecuencia de notas de C Baja
CM = [0, 262, 294, 330, 350, 393, 441, 495]        # Frecuencia de notas de C Media
CH = [0, 525, 589, 661, 700, 786, 882, 990]        # Frecuencia de notas de C Alta

song = [CH[5],CH[2],CM[6],CH[2],CH[3],CH[6],CH[3],CH[5],CH[3],CM[6],CH[2]]
beat = [1,1,1,1,1,2,1,1,1,1,1]

def setup():
    global p
    global Buzz
    GPIO.setmode(GPIO.BCM)           # Define numeración BCM
    GPIO.setup(ledPin, GPIO.OUT)     # Configura ledPin como salida
    GPIO.setup(pirPin, GPIO.IN)      # Configura sensorPin como entrada
    GPIO.setup(servoPin, GPIO.OUT)   # Configura servoPin como salida
    GPIO.output(servoPin, GPIO.LOW)  # Configura servoPin en bajo
    GPIO.setup(buzPin, GPIO.OUT)     # Configura buzzerPin como salida

    Buzz = GPIO.PWM(buzPin, 440)     # 440 es la frecuencia inicial
    Buzz.start(50)                   # Inicia Buzz con ciclo de trabajo del 50%

    p = GPIO.PWM(servoPin, 50)       # Configura frecuencia del servo a 50Hz
    p.start(0)                       # Ciclo de trabajo inicial = 0

def map(value, inMin, inMax, outMin, outMax):
    return (outMax - outMin) * (value - inMin) / (inMax - inMin) + outMin


def setAngle(angle):      # make the servo rotate to specific angle (0-180 degrees)
    angle = max(0, min(180, angle))
    pulse_width = map(angle, 0, 180, SERVO_MIN_PULSE, SERVO_MAX_PULSE)
    pwm = map(pulse_width, 0, 20000, 0, 100)
    p.ChangeDutyCycle(pwm)           # Mapea el ángulo al ciclo de trabajo y lo envía

def doorbell():
    for i in range(1, len(song)):
        Buzz.ChangeFrequency(song[i])  # Cambia la frecuencia de acuerdo a la nota
        time.sleep(beat[i] * 0.25)     # Retraso en cada nota por beat * 0.25s
    time.sleep(1)

def closedoor():
    GPIO.output(ledPin, GPIO.LOW)
    for i in range(180, -1, -1):       # Gira el servo de 180 a 0 grados
        setAngle(i)
        time.sleep(0.001)
    time.sleep(1)
def opendoor():
    GPIO.output(ledPin, GPIO.HIGH)
    for i in range(0, 181, 1):         # Gira el servo de 0 a 180 grados
        setAngle(i)
        time.sleep(0.001)
    time.sleep(1)
    doorbell()
    closedoor()

def loop():
    while True:
        if GPIO.input(pirPin)==GPIO.HIGH:
            opendoor()

def destroy():
    GPIO.cleanup()                     # Libera los recursos
    p.stop()
    Buzz.stop()

if __name__ == '__main__':     # Program start from here
    setup()
    try:
        loop()
    except KeyboardInterrupt:  # When 'Ctrl+C' is pressed, the program destroy() will be  executed.
        destroy()

Explicación del Código

def setup():
    global p
    global Buzz                        # Asigna una variable global para reemplazar GPIO.PWM
    GPIO.setmode(GPIO.BCM)             # Numeración de pines en modo BCM
    GPIO.setup(ledPin, GPIO.OUT)       # Configura ledPin como salida
    GPIO.setup(pirPin, GPIO.IN)        # Configura sensorPin como entrada
    GPIO.setup(buzPin, GPIO.OUT)       # Configura buzzerPin como salida
    Buzz = GPIO.PWM(buzPin, 440)       # 440 es la frecuencia inicial.
    Buzz.start(50)                     # Inicia el pin del buzzer con un ciclo de trabajo del 50%
    GPIO.setup(servoPin, GPIO.OUT)     # Configura servoPin como salida
    GPIO.output(servoPin, GPIO.LOW)    # Configura servoPin en bajo
    p = GPIO.PWM(servoPin, 50)         # Establece la frecuencia en 50Hz
    p.start(0)                         # Ciclo de trabajo inicial = 0

Estas declaraciones se utilizan para inicializar los pines de cada componente.

def setAngle(angle):      # Hace que el servo gire a un ángulo específico (0-180 grados)
    angle = max(0, min(180, angle))
    pulse_width = map(angle, 0, 180, SERVO_MIN_PULSE, SERVO_MAX_PULSE)
    pwm = map(pulse_width, 0, 20000, 0, 100)
    p.ChangeDutyCycle(pwm) # Mapea el ángulo al ciclo de trabajo y lo emite

Crea una función, servowrite, para escribir el ángulo en el servo que va de 0 a 180.

def doorbell():
    for i in range(1,len(song)):       # Reproduce la canción
        Buzz.ChangeFrequency(song[i])  # Cambia la frecuencia de acuerdo a la nota de la canción
        time.sleep(beat[i] * 0.25)     # Retardo de una nota por beat * 0.25s

Crea una función, doorbell, para que el buzzer reproduzca música.

def closedoor():
    GPIO.output(ledPin, GPIO.LOW)
    Buzz.ChangeFrequency(1)
    for i in range(180, -1, -1):       # Hace que el servo gire de 180 a 0 grados
        setAngle(i)
        time.sleep(0.001)

Cierra la puerta y apaga la luz indicadora.

def opendoor():
    GPIO.output(ledPin, GPIO.LOW)
    for i in range(0, 181, 1):         # Hace que el servo gire de 0 a 180 grados
        setAngle(i)                     # Escribe el ángulo en el servo
        time.sleep(0.001)
    doorbell()
    closedoor()

La función opendoor() consta de varias partes: encender la luz indicadora, girar el servo (para simular la acción de abrir la puerta), reproducir la música de bienvenida de la tienda y llamar a la función closedoor() después de la música.

def loop():
while True:
    if GPIO.input(pirPin)==GPIO.HIGH:
        opendoor()

Cuando el sensor PIR detecta que alguien está pasando, llama a la función opendoor().

Imagen del Fenómeno

_images/image240.jpeg