.. note::
Ciao, benvenuto nella community di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.
**Perché unirsi?**
- **Supporto esperto**: Risolvi i problemi post-vendita e le sfide tecniche con l'aiuto della nostra community e del nostro team.
- **Impara e condividi**: Scambia suggerimenti e tutorial per migliorare le tue competenze.
- **Anteprime esclusive**: Ottieni accesso anticipato agli annunci di nuovi prodotti e anteprime esclusive.
- **Sconti speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
- **Promozioni festive e omaggi**: Partecipa a omaggi e promozioni durante le festività.
👉 Sei pronto per esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso!
.. _4.1.8_py_pi5:
4.1.5 Benvenuto
=====================================
Introduzione
-------------
In questo progetto, utilizzeremo il PIR per rilevare il movimento dei pedoni,
e useremo servocomandi, LED e un cicalino per simulare il funzionamento della
porta automatica di un negozio. Quando un pedone entra nel raggio di rilevamento
del PIR, la spia luminosa si accenderà, la porta si aprirà e il cicalino suonerà
il campanello di apertura.
Componenti necessari
------------------------------
In questo progetto, avremo bisogno dei seguenti componenti.
.. image:: ../python_pi5/img/4.1.8_welcome_list.png
:width: 800
:align: center
È sicuramente comodo acquistare un kit completo, ecco il link:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Nome
- ELEMENTI NEL 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|
Diagramma schematico
-------------------------
============ ======== ======== ===
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:: ../python_pi5/img/4.1.8_welcome_schematic.png
:align: center
Procedure Sperimentali
----------------------------
**Passo 1:** Monta il circuito.
.. image:: ../python_pi5/img/4.1.8_welcome_circuit.png
:align: center
**Passo 2:** Cambia la directory.
.. raw:: html
.. code-block::
cd ~/raphael-kit/python-pi5
**Passo 3:** Esegui.
.. raw:: html
.. code-block::
sudo python3 4.1.8_Welcome_zero.py
Dopo l'esecuzione del codice, se il sensore PIR rileva il passaggio di qualcuno,
la porta si aprirà automaticamente (simulata dal servo), si accenderà
l'indicatore e verrà riprodotta la melodia del campanello. Dopo che la melodia
sarà terminata, il sistema chiuderà automaticamente la porta e spegnerà
l'indicatore, aspettando il prossimo passaggio.
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, è necessario ruotarli entrambi in senso antiorario fino in fondo.
.. image:: ../python_pi5/img/4.1.8_PIR_TTE.png
:width: 400
:align: center
.. warning::
Se viene visualizzato l'errore ``RuntimeError: Cannot determine SOC peripheral base address``, fare riferimento a :ref:`faq_soc`.
**Code**
.. note::
Puoi **Modificare/Resettare/Copiare/Eseguire/Fermare** il codice qui sotto. Prima di farlo, devi andare nel percorso del codice sorgente, come ``raphael-kit/python-pi5``. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l'effetto.
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
from gpiozero import LED, MotionSensor, Servo, TonalBuzzer
import time
# Configurazione dei pin GPIO per LED, sensore di movimento (PIR) e cicalino
ledPin = LED(6)
pirPin = MotionSensor(21)
buzPin = TonalBuzzer(27)
# Fattore di correzione della larghezza d'impulso per il servo e calcolo
myCorrection = 0.45
maxPW = (2.0 + myCorrection) / 1000 # Larghezza d'impulso massima
minPW = (1.0 - myCorrection) / 1000 # Larghezza d'impulso minima
# Inizializzazione del servo con larghezze d'impulso personalizzate
servoPin = Servo(25, min_pulse_width=minPW, max_pulse_width=maxPW)
# Melodia musicale per il cicalino, con note e durate
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) # Converte l'angolo in valore per il servo
servoPin.value = value # Imposta la posizione del servo
time.sleep(0.001) # Breve ritardo per il movimento del servo
def doorbell():
"""
Play a musical tune using the buzzer.
"""
for note, duration in tune:
buzPin.play(note) # Riproduce la nota
time.sleep(float(duration)) # Durata della nota
buzPin.stop() # Ferma il cicalino dopo la melodia
def closedoor():
# Spegni il LED e muovi il servo per chiudere la porta
ledPin.off()
for i in range(180, -1, -1):
setAngle(i) # Muovi il servo da 180 a 0 gradi
time.sleep(0.001) # Breve ritardo per un movimento fluido
time.sleep(1) # Pausa dopo la chiusura della porta
def opendoor():
# Accendi il LED, apri la porta (muovi il servo), riproduci la melodia e chiudi la porta
ledPin.on()
for i in range(0, 181):
setAngle(i) # Muovi il servo da 0 a 180 gradi
time.sleep(0.001) # Breve ritardo per un movimento fluido
time.sleep(1) # Pausa prima della melodia
doorbell() # Riproduci la melodia
closedoor() # Chiudi la porta dopo la melodia
def loop():
# Ciclo principale per controllare il movimento e operare la porta
while True:
if pirPin.motion_detected:
opendoor() # Apri la porta se viene rilevato movimento
time.sleep(0.1) # Breve ritardo nel ciclo
try:
loop()
except KeyboardInterrupt:
# Pulizia dei GPIO in caso di interruzione dell'utente (ad es., Ctrl+C)
buzPin.stop()
ledPin.off()
**Spiegazione del Codice**
#. Lo script inizia importando i moduli necessari. La libreria ``gpiozero`` viene utilizzata per interfacciarsi con il LED, il sensore di movimento, il motore servo e il cicalino tonale. Il modulo ``time`` serve per gestire le funzioni legate al tempo.
.. code-block:: python
#!/usr/bin/env python3
from gpiozero import LED, MotionSensor, Servo, TonalBuzzer
import time
#. Inizializza il LED, il sensore di movimento PIR e il cicalino tonale sui rispettivi pin GPIO.
.. code-block:: python
# Configurazione dei pin GPIO per LED, sensore di movimento (PIR) e cicalino
ledPin = LED(6)
pirPin = MotionSensor(21)
buzPin = TonalBuzzer(27)
#. Calcola la larghezza d'impulso massima e minima per il motore servo, incorporando un fattore di correzione per la regolazione fine.
.. code-block:: python
# Fattore di correzione della larghezza d'impulso per il servo e calcolo
myCorrection = 0.45
maxPW = (2.0 + myCorrection) / 1000 # Larghezza d'impulso massima
minPW = (1.0 - myCorrection) / 1000 # Larghezza d'impulso minima
#. Inizializza il motore servo sul pin GPIO 25 con larghezze d'impulso personalizzate per un posizionamento preciso.
.. code-block:: python
# Inizializzazione del servo con larghezze d'impulso personalizzate
servoPin = Servo(25, min_pulse_width=minPW, max_pulse_width=maxPW)
#. La melodia è definita come una sequenza di note (frequenze) e durate (secondi).
.. code-block:: python
# Melodia musicale per il cicalino, con note e durate
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)]
#. Funzione per muovere il servo ad un angolo specificato. Converte l'angolo in un valore compreso tra 0 e 1 per il servo.
.. code-block:: python
def setAngle(angle):
"""
Move the servo to a specified angle.
:param angle: Angle in degrees (0-180).
"""
value = float(angle / 180) # Converte l'angolo in valore per il servo
servoPin.value = value # Imposta la posizione del servo
time.sleep(0.001) # Breve ritardo per il movimento del servo
#. Funzione per riprodurre una melodia utilizzando il cicalino. Scorre l'elenco ``tune``, riproducendo ogni nota per la sua durata specificata.
.. code-block:: python
def doorbell():
"""
Play a musical tune using the buzzer.
"""
for note, duration in tune:
buzPin.play(note) # Riproduce la nota
time.sleep(float(duration)) # Durata della nota
buzPin.stop() # Ferma il cicalino dopo la melodia
#. Funzioni per aprire e chiudere la porta utilizzando il motore servo. La funzione ``opendoor`` accende il LED, apre la porta, riproduce la melodia e poi chiude la porta.
.. code-block:: python
def closedoor():
# Spegni il LED e muovi il servo per chiudere la porta
ledPin.off()
for i in range(180, -1, -1):
setAngle(i) # Muovi il servo da 180 a 0 gradi
time.sleep(0.001) # Breve ritardo per un movimento fluido
time.sleep(1) # Pausa dopo la chiusura della porta
def opendoor():
# Accendi il LED, apri la porta (muovi il servo), riproduci la melodia e chiudi la porta
ledPin.on()
for i in range(0, 181):
setAngle(i) # Muovi il servo da 0 a 180 gradi
time.sleep(0.001) # Breve ritardo per un movimento fluido
time.sleep(1) # Pausa prima della melodia
doorbell() # Riproduci la melodia
closedoor() # Chiudi la porta dopo la melodia
#. Ciclo principale che controlla costantemente il rilevamento del movimento. Quando viene rilevato un movimento, attiva la funzione ``opendoor``.
.. code-block:: python
def loop():
# Ciclo principale per controllare il movimento e operare la porta
while True:
if pirPin.motion_detected:
opendoor() # Apri la porta se viene rilevato movimento
time.sleep(0.1) # Breve ritardo nel ciclo
#. Esegue il ciclo principale e garantisce che lo script possa essere interrotto con un comando da tastiera (Ctrl+C), spegnendo il cicalino e il LED per una chiusura pulita.
.. code-block:: python
try:
loop()
except KeyboardInterrupt:
# Pulizia dei GPIO in caso di interruzione dell'utente (ad es., Ctrl+C)
buzPin.stop()
ledPin.off()