.. note::
Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci le tue conoscenze di Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.
**Perché unirti a noi?**
- **Supporto esperto**: Risolvi problemi post-vendita e sfide tecniche con l'aiuto della nostra comunità e del nostro team.
- **Impara e condividi**: Scambia consigli e tutorial per migliorare le tue competenze.
- **Anteprime esclusive**: Ottieni accesso anticipato a nuovi annunci di prodotti e anteprime speciali.
- **Sconti speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
- **Promozioni festive e omaggi**: Partecipa a promozioni speciali e concorsi durante le festività.
👉 Pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso!
.. _4.1.8_py:
4.1.8 Benvenuto
=====================================
Introduzione
----------------
In questo progetto, utilizzeremo il PIR per rilevare il movimento dei pedoni e useremo
servomotori, LED e buzzer per simulare il funzionamento di una porta automatica di un
negozio. Quando un pedone entra nell'area di rilevamento del PIR, si accenderà la spia,
la porta si aprirà e il buzzer suonerà una melodia di benvenuto.
Componenti necessari
------------------------------
In questo progetto, avremo bisogno dei seguenti componenti.
.. image:: ../img/list_Welcome.png
:align: center
È sicuramente conveniente acquistare un kit completo, ecco il link:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Nome
- ELEMENTI IN QUESTO KIT
- LINK
* - Kit Raphael
- 337
- |link_Raphael_kit|
Puoi anche acquistarli separatamente dai link sottostanti.
.. list-table::
:widths: 30 20
:header-rows: 1
* - INTRODUZIONE AI COMPONENTI
- LINK PER L'ACQUISTO
* - :ref:`cpn_gpio_extension_board`
- |link_gpio_board_buy|
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_led`
- |link_led_buy|
* - :ref:`cpn_pir`
- \-
* - :ref:`cpn_servo`
- |link_servo_buy|
* - :ref:`cpn_buzzer`
- |link_passive_buzzer_buy|
* - :ref:`cpn_transistor`
- |link_transistor_buy|
Schema elettrico
-------------------
============ ======== ======== ===
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
============ ======== ======== ===
.. image:: ../img/Schematic_three_one2.png
:align: center
Procedure sperimentali
-------------------------
**Passo 1:** Costruisci il circuito.
.. image:: ../img/image239.png
:align: center
**Passo 2:** Cambia directory.
.. raw:: html
.. code-block::
cd ~/raphael-kit/python/
**Passo 3:** Esegui.
.. raw:: html
.. code-block::
sudo python3 4.1.8_Welcome.py
Dopo l'esecuzione del codice, se il sensore PIR rileva il passaggio di una persona,
la porta si aprirà automaticamente (simulata dal servomotore), si accenderà l'indicatore
e verrà riprodotta la melodia del campanello. Dopo che la melodia è terminata, il
sistema chiuderà automaticamente la porta e spegnerà la spia, in attesa del passaggio successivo.
Ci sono due potenziometri sul modulo PIR: uno regola la sensibilità e l'altro la
distanza di rilevamento. Per far funzionare meglio il modulo PIR, devi girarli
entrambi completamente in senso antiorario.
.. image:: ../img/PIR_TTE.png
:width: 400
:align: center
**Codice**
.. note::
Puoi **Modificare/Resettare/Copiare/Eseguire/Fermare** il codice qui sotto. Ma prima di farlo, devi accedere al percorso del codice sorgente come ``raphael-kit/python``. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l'effetto.
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import time
SERVO_MIN_PULSE = 500
SERVO_MAX_PULSE = 2500
ledPin = 18 # definire il ledPin
pirPin = 17 # definire il sensorPin
servoPin = 22 # definire il servoPin
buzPin = 27 # definire il buzzerpin
CL = [0, 131, 147, 165, 175, 196, 211, 248] # Frequenze delle note di Do basso
CM = [0, 262, 294, 330, 350, 393, 441, 495] # Frequenze delle note di Do medio
CH = [0, 525, 589, 661, 700, 786, 882, 990] # Frequenze delle note di Do alto
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 # Assegna una variabile globale per sostituire GPIO.PWM
GPIO.setmode(GPIO.BCM) # Numerazione dei GPIO in base alla posizione fisica
GPIO.setup(ledPin, GPIO.OUT) # Imposta il ledPin come uscita
GPIO.setup(pirPin, GPIO.IN) # Imposta il sensorPin come ingresso
GPIO.setup(servoPin, GPIO.OUT) # Imposta il servoPin come uscita
GPIO.output(servoPin, GPIO.LOW) # Imposta il servoPin su low
GPIO.setup(buzPin, GPIO.OUT) # Imposta i pin come uscite
Buzz = GPIO.PWM(buzPin, 440) # 440 è la frequenza iniziale.
Buzz.start(50) # Avvia il pin del buzzer con un duty cycle del 50%
p = GPIO.PWM(servoPin, 50) # Imposta la frequenza a 50Hz
p.start(0) # Duty Cycle = 0
def map(value, inMin, inMax, outMin, outMax):
return (outMax - outMin) * (value - inMin) / (inMax - inMin) + outMin
def setAngle(angle): # Fa ruotare il servo ad un angolo specifico (0-180 gradi)
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) # Mappa l'angolo al duty cycle e lo applica
def doorbell():
for i in range(1, len(song)): # Riproduci il brano 1
Buzz.ChangeFrequency(song[i]) # Cambia la frequenza in base alla nota della canzone
time.sleep(beat[i] * 0.25) # Ritarda una nota per beat * 0.25s
time.sleep(1) # Attendi un secondo per la prossima canzone.
def closedoor():
GPIO.output(ledPin, GPIO.LOW)
for i in range(180, -1, -1): # Fa ruotare il servo da 180 a 0 gradi
setAngle(i)
time.sleep(0.001)
time.sleep(1)
def opendoor():
GPIO.output(ledPin, GPIO.HIGH)
for i in range(0, 181, 1): # Fa ruotare il servo da 0 a 180 gradi
setAngle(i) # Scrivi sul servo
time.sleep(0.001)
time.sleep(1)
doorbell()
closedoor()
def loop():
while True:
if GPIO.input(pirPin)==GPIO.HIGH:
opendoor()
def destroy():
GPIO.cleanup() # Rilascia le risorse
p.stop()
Buzz.stop()
if __name__ == '__main__': # Il programma parte da qui
setup()
try:
loop()
except KeyboardInterrupt: # Quando viene premuto 'Ctrl+C', il programma eseguirà destroy()
destroy()
**Spiegazione del Codice**
.. code-block:: python
def setup():
global p
global Buzz # Assegna una variabile globale per sostituire GPIO.PWM
GPIO.setmode(GPIO.BCM) # Numerazione dei GPIO in base alla posizione fisica
GPIO.setup(ledPin, GPIO.OUT) # Imposta il ledPin come uscita
GPIO.setup(pirPin, GPIO.IN) # Imposta il sensorPin come ingresso
GPIO.setup(buzPin, GPIO.OUT) # Imposta i pin come uscite
Buzz = GPIO.PWM(buzPin, 440) # 440 è la frequenza iniziale.
Buzz.start(50) # Avvia il pin del buzzer con un duty cycle del 50%
GPIO.setup(servoPin, GPIO.OUT) # Imposta il servoPin come uscita
GPIO.output(servoPin, GPIO.LOW) # Imposta il servoPin su low
p = GPIO.PWM(servoPin, 50) # Imposta la frequenza a 50Hz
p.start(0) # Duty Cycle = 0
Queste istruzioni servono per inizializzare i pin di ciascun componente.
.. code-block:: python
def setAngle(angle): # Fa ruotare il servo ad un angolo specifico (0-180 gradi)
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) # Mappa l'angolo al duty cycle e lo applica
Crea una funzione, ``servowrite`` per impostare l'angolo del servo tra 0 e 180 gradi.
.. code-block:: python
def doorbell():
for i in range(1,len(song)): # Riproduci il brano1
Buzz.ChangeFrequency(song[i]) # Cambia la frequenza in base alla nota della canzone
time.sleep(beat[i] * 0.25) # Ritarda una nota per beat * 0.25s
Crea una funzione, ``doorbell`` per far suonare la musica al buzzer.
.. code-block:: python
def closedoor():
GPIO.output(ledPin, GPIO.LOW)
Buzz.ChangeFrequency(1)
for i in range(180, -1, -1): # Fa ruotare il servo da 180 a 0 gradi
setAngle(i)
time.sleep(0.001)
Chiude la porta e spegne la spia.
.. code-block:: python
def opendoor():
GPIO.output(ledPin, GPIO.HIGH)
for i in range(0, 181, 1): # Fa ruotare il servo da 0 a 180 gradi
setAngle(i) # Scrivi sul servo
time.sleep(0.001)
doorbell()
closedoor()
La funzione, ``opendoor()`` consiste in diverse parti: accende la spia, ruota
il servo (per simulare l'apertura della porta), suona la musica del campanello
del negozio e chiama la funzione ``closedoor()`` dopo la musica.
.. code-block:: python
def loop():
while True:
if GPIO.input(pirPin)==GPIO.HIGH:
opendoor()
Quando il PIR rileva il passaggio di qualcuno, chiama la funzione, ``opendoor()``.
Immagine del fenomeno
---------------------------
.. image:: ../img/image240.jpeg
:align: center