.. note::
Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.
**Warum beitreten?**
- **Expertenunterstützung**: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.
- **Lernen & Teilen**: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.
- **Exklusive Vorschauen**: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.
- **Spezialrabatte**: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.
- **Festliche Aktionen und Gewinnspiele**: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.
👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [|link_sf_facebook|] und treten Sie heute bei!
.. _py_pi5_welcome:
3.1.2 Willkommen
=====================================
Einführung
-------------
In diesem Projekt werden wir PIR-Sensoren verwenden, um die Bewegung von Fußgängern zu erfassen. Dabei setzen wir Servomotoren, LEDs und einen Summer ein, um die Funktion der Sensortür eines Convenience-Stores zu simulieren. Erscheint ein Fußgänger im Erfassungsbereich des PIR-Sensors, wird das Anzeigelicht aktiviert, die Tür öffnet sich und der Summer spielt die Eingangsglocke.
Benötigte Komponenten
------------------------------
Für dieses Projekt benötigen wir folgende Komponenten.
.. image:: ../python_pi5/img/4.1.8_welcome_list.png
:width: 100%
:align: center
Schaltplan
-------------------
============ ======== ======== ===
T-Board Name physisch 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
Experimentelle Verfahren
-------------------------
**Schritt 1:** Bauen Sie den Schaltkreis.
.. image:: ../python_pi5/img/4.1.8_welcome_circuit.png
:align: center
**Schritt 2:** Wechseln Sie das Verzeichnis.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python-pi5
**Schritt 3:** Ausführen.
.. raw:: html
.. code-block::
sudo python3 3.1.2_Welcome_zero.py
Nachdem der Code ausgeführt wurde, öffnet sich automatisch die Tür (simuliert durch den Servo), das Anzeigelicht schaltet sich ein und die Türklingelmusik wird abgespielt, wenn der PIR-Sensor jemanden erfasst. Nachdem die Türklingelmusik abgespielt wurde, schließt das System automatisch die Tür und schaltet das Anzeigelicht aus, um auf das nächste Vorbeigehen zu warten.
Am PIR-Modul befinden sich zwei Potentiometer: eines zur Einstellung der Empfindlichkeit und das andere zur Einstellung der Erfassungsentfernung. Um das PIR-Modul optimal zu nutzen, sollten Sie beide gegen den Uhrzeigersinn bis zum Anschlag drehen.
.. image:: ../python_pi5/img/4.1.8_PIR_TTE.png
:width: 400
:align: center
.. warning::
Wenn die Fehlermeldung ``RuntimeError: Cannot determine SOC peripheral base address`` angezeigt wird, lesen Sie bitte :ref:`faq_soc`
**Code**
.. note::
Sie können den untenstehenden Code **modifizieren/zurücksetzen/kopieren/ausführen/stoppen**. Bevor Sie dies tun, sollten Sie jedoch zum Quellcodepfad wie ``davinci-kit-for-raspberry-pi/python-pi5`` wechseln. Nachdem Sie den Code geändert haben, können Sie ihn direkt ausführen, um das Ergebnis zu sehen.
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
from gpiozero import LED, MotionSensor, Servo, TonalBuzzer
import time
# GPIO-Pin-Setup für LED, Bewegungssensor (PIR) und Summer
ledPin = LED(6)
pirPin = MotionSensor(21)
buzPin = TonalBuzzer(27)
# Servomotor-Pulsbreitenkorrekturfaktor und -berechnung
myCorrection = 0.45
maxPW = (2.0 + myCorrection) / 1000 # Maximale Pulsbreite
minPW = (1.0 - myCorrection) / 1000 # Minimale Pulsbreite
# Initialisierung des Servos mit angepassten Pulsbreiten
servoPin = Servo(25, min_pulse_width=minPW, max_pulse_width=maxPW)
# Musikalische Melodie für den Summer, mit Noten und Dauern
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):
"""
Bewegt den Servo auf einen bestimmten Winkel.
:param angle: Winkel in Grad (0-180).
"""
value = float(angle / 180) # Winkel in Servo-Wert umrechnen
servoPin.value = value # Servoposition setzen
time.sleep(0.001) # Kurze Verzögerung für Servobewegung
def doorbell():
"""
Spielt eine musikalische Melodie mit dem Summer.
"""
for note, duration in tune:
buzPin.play(note) # Note abspielen
time.sleep(float(duration)) # Dauer der Note
buzPin.stop() # Summer nach dem Spielen der Melodie anhalten
def closedoor():
# LED ausschalten und Servo bewegen, um Tür zu schließen
ledPin.off()
for i in range(180, -1, -1):
setAngle(i) # Servo von 180 auf 0 Grad bewegen
time.sleep(0.001) # Kurze Verzögerung für gleichmäßige Bewegung
time.sleep(1) # Warten nach dem Schließen der Tür
def opendoor():
# LED einschalten, Tür öffnen (Servo bewegen), Melodie abspielen, Tür schließen
ledPin.on()
for i in range(0, 181):
setAngle(i) # Servo von 0 auf 180 Grad bewegen
time.sleep(0.001) # Kurze Verzögerung für gleichmäßige Bewegung
time.sleep(1) # Warten vor dem Spielen der Melodie
doorbell() # Türklingelmelodie abspielen
closedoor() # Tür nach der Melodie schließen
def loop():
# Hauptschleife zur Bewegungserkennung und Türbedienung
while True:
if pirPin.motion_detected:
opendoor() # Tür öffnen, wenn Bewegung erkannt wird
time.sleep(0.1) # Kurze Verzögerung in der Schleife
try:
loop()
except KeyboardInterrupt:
# GPIO bei Benutzerunterbrechung aufräumen (z. B. Strg+C)
buzPin.stop()
ledPin.off()
**Code-Erklärung**
#. Das Skript beginnt mit dem Import der notwendigen Module. Die Bibliothek ``gpiozero`` wird verwendet, um mit der LED, dem Bewegungssensor, dem Servomotor und dem tonalen Summer zu interagieren. Das Modul ``time`` wird für zeitbezogene Funktionen eingesetzt.
.. code-block:: python
#!/usr/bin/env python3
from gpiozero import LED, MotionSensor, Servo, TonalBuzzer
import time
#. Initialisiert die LED, den PIR-Bewegungssensor und den tonalen Summer an ihren jeweiligen GPIO-Pins.
.. code-block:: python
# GPIO-Pin-Setup für LED, Bewegungssensor (PIR) und Summer
ledPin = LED(6)
pirPin = MotionSensor(21)
buzPin = TonalBuzzer(27)
#. Berechnet die maximalen und minimalen Pulsbreiten für den Servomotor unter Berücksichtigung eines Korrekturfaktors zur Feinabstimmung.
.. code-block:: python
# Servomotor-Pulsbreitenkorrekturfaktor und -berechnung
myCorrection = 0.45
maxPW = (2.0 + myCorrection) / 1000 # Maximale Pulsbreite
minPW = (1.0 - myCorrection) / 1000 # Minimale Pulsbreite
#. Initialisiert den Servomotor am GPIO-Pin 25 mit den angepassten Pulsbreiten für eine genaue Positionierung.
.. code-block:: python
# Initialisierung des Servos mit angepassten Pulsbreiten
servoPin = Servo(25, min_pulse_width=minPW, max_pulse_width=maxPW)
#. Die Melodie wird als Abfolge von Noten (Frequenz) und Dauern (Sekunden) definiert.
.. code-block:: python
# Musikalische Melodie für den Summer, mit Noten und Dauern
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)]
#. Funktion zum Bewegen des Servos auf einen bestimmten Winkel. Wandelt den Winkel in einen Wert zwischen 0 und 1 für den Servo um.
.. code-block:: python
def setAngle(angle):
"""
Bewegt den Servo auf einen bestimmten Winkel.
:param angle: Winkel in Grad (0-180).
"""
value = float(angle / 180) # Winkel in Servo-Wert umrechnen
servoPin.value = value # Servoposition setzen
time.sleep(0.001) # Kurze Verzögerung für Servobewegung
#. Funktion zum Abspielen einer musikalischen Melodie mit dem Summer. Durchläuft die Liste ``tune`` und spielt jede Note für ihre angegebene Dauer ab.
.. code-block:: python
def doorbell():
"""
Spielt eine musikalische Melodie mit dem Summer.
"""
for note, duration in tune:
buzPin.play(note) # Note abspielen
time.sleep(float(duration)) # Dauer der Note
buzPin.stop() # Summer nach dem Spielen der Melodie anhalten
#. Funktionen zum Öffnen und Schließen der Tür mit dem Servomotor. Die Funktion ``opendoor`` schaltet die LED ein, öffnet die Tür, spielt die Melodie und schließt dann die Tür.
.. code-block:: python
def closedoor():
# LED ausschalten und Servo bewegen, um Tür zu schließen
ledPin.off()
for i in range(180, -1, -1):
setAngle(i) # Servo von 180 auf 0 Grad bewegen
time.sleep(0.001) # Kurze Verzögerung für gleichmäßige Bewegung
time.sleep(1) # Warten nach dem Schließen der Tür
def opendoor():
# LED einschalten, Tür öffnen (Servo bewegen), Melodie abspielen, Tür schließen
ledPin.on()
for i in range(0, 181):
setAngle(i) # Servo von 0 auf 180 Grad bewegen
time.sleep(0.001) # Kurze Verzögerung für gleichmäßige Bewegung
time.sleep(1) # Warten vor dem Spielen der Melodie
doorbell() # Türklingelmelodie abspielen
closedoor() # Tür nach der Melodie schließen
#. Hauptschleife, die ständig auf Bewegungserkennung prüft. Bei erkannter Bewegung wird die Funktion ``opendoor`` ausgelöst.
.. code-block:: python
def loop():
# Hauptschleife zur Bewegungserkennung und Türbedienung
while True:
if pirPin.motion_detected:
opendoor() # Tür öffnen, wenn Bewegung erkannt wird
time.sleep(0.1) # Kurze Verzögerung in der Schleife
#. Führt die Hauptschleife aus und stellt sicher, dass das Skript mit einem Tastaturbefehl (Strg+C) gestoppt werden kann, wobei der Summer und die LED für einen sauberen Ausstieg ausgeschaltet werden.
.. code-block:: python
try:
loop()
except KeyboardInterrupt:
# GPIO bei Benutzerunterbrechung aufräumen (z. B. Strg+C)
buzPin.stop()
ledPin.off()