.. 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!

.. _1.3.2_py_pi5:

1.3.2 Servomotor
============================

Einleitung
----------------

In diesem Projekt lernen wir, wie man einen Servomotor rotieren lässt.

Benötigte Komponenten
------------------------------

Für dieses Projekt benötigen wir die folgenden Komponenten.

.. image:: ../python_pi5/img/1.3.2_servo_list.png

Es ist definitiv praktisch, ein ganzes Kit zu kaufen, hier ist der Link:

.. list-table::
    :widths: 20 20 20
    :header-rows: 1

    *   - Name	
        - IN DIESEM KIT ENTHALTENE TEILE
        - LINK
    *   - Raphael Kit
        - 337
        - |link_Raphael_kit|

Sie können sie auch separat über die unten stehenden Links kaufen.

.. list-table::
    :widths: 30 20
    :header-rows: 1

    *   - KOMPONENTENVORSTELLUNG
        - KAUF-LINK

    *   - :ref:`cpn_gpio_board`
        - |link_gpio_board_buy|
    *   - :ref:`cpn_breadboard`
        - |link_breadboard_buy|
    *   - :ref:`cpn_wires`
        - |link_wires_buy|
    *   - :ref:`cpn_servo`
        - |link_servo_buy|

Schaltplan
--------------------

.. image:: ../img/image337.png


Experimentelle Verfahren
------------------------------------

**Schritt 1:** Bauen Sie den Schaltkreis auf.

.. image:: ../img/image125.png

**Schritt 2**: Wechseln Sie in den Ordner des Codes.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/python-pi5

**Schritt 3**: Führen Sie die ausführbare Datei aus.

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 1.3.2_Servo_zero.py

Nachdem das Programm ausgeführt wurde, wird der Servomotor von 0 Grad über 90 Grad zu 180 Grad rotieren und dann von 180 Grad über 90 Grad zurück zu 0 Grad, in einem Kreis.

.. 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 unten stehenden Code **modifizieren/zurücksetzen/kopieren/ausführen/stoppen**. Aber zuvor müssen Sie zum Quellcodepfad wie ``raphael-kit/python-pi5`` gehen. Nachdem Sie den Code modifiziert haben, können Sie ihn direkt ausführen, um den Effekt zu sehen.


.. raw:: html

    <run></run>

.. code-block:: python

   #!/usr/bin/env python3
   from gpiozero import Servo
   from time import sleep

   # Set the GPIO pin number where the servo motor is connected
   myGPIO = 18

   # Define a correction factor to fine-tune servo pulse width
   myCorrection = 0.45
   maxPW = (2.0 + myCorrection) / 1000  # Calculate maximum pulse width
   minPW = (1.0 - myCorrection) / 1000  # Calculate minimum pulse width

   # Initialize the Servo object with custom pulse widths
   servo = Servo(myGPIO, min_pulse_width=minPW, max_pulse_width=maxPW)

   try:
       while True:
           # Position the servo at the middle and wait
           servo.mid()
           print("mid")  # Indicate current position
           sleep(0.5)    # Brief pause for 0.5 seconds

           # Move the servo to its minimum position and wait
           servo.min()
           print("min")  # Indicate current position
           sleep(1)      # Hold position for 1 second

           # Return the servo to the middle position and wait
           servo.mid()
           print("mid")  # Indicate current position
           sleep(0.5)    # Brief pause for 0.5 seconds

           # Move the servo to its maximum position and wait
           servo.max()
           print("max")  # Indicate current position
           sleep(1)      # Hold position for 1 second

   except KeyboardInterrupt:
       # Gracefully terminate the script on a keyboard interrupt (Ctrl+C)
       pass
    

**Code-Erklärung**

#. Diese Importanweisungen holen die Klasse ``Servo`` für die Servosteuerung und die Funktion ``sleep`` für die Zeitsteuerung.

   .. code-block:: python

       #!/usr/bin/env python3
       from gpiozero import Servo
       from time import sleep

#. Legt die GPIO-Pin-Nummer 18 für den Anschluss des Servomotors fest.

   .. code-block:: python

       # Set the GPIO pin number where the servo motor is connected
       myGPIO = 18

#. Diese Zeilen definieren einen Korrekturfaktor und verwenden ihn, um die maximale und minimale Impulsbreite für den Servo zu berechnen und damit seinen Bewegungsbereich fein abzustimmen.

   .. code-block:: python

       # Define a correction factor to fine-tune servo pulse width
       myCorrection = 0.45
       maxPW = (2.0 + myCorrection) / 1000  # Calculate maximum pulse width
       minPW = (1.0 - myCorrection) / 1000  # Calculate minimum pulse width

#. Initialisiert das Servo-Objekt mit der angegebenen GPIO-Pin-Nummer und benutzerdefinierten Impulsbreiten.

   .. code-block:: python

       # Initialize the Servo object with custom pulse widths
       servo = Servo(myGPIO, min_pulse_width=minPW, max_pulse_width=maxPW)

#. Der `try`-Block enthält eine `while True`-Schleife, um den Servo kontinuierlich zu bewegen. Der Servo wird an den Mittel-, Min- und Max-Punkten positioniert, mit jeder Position, die ausgedruckt und für eine bestimmte Dauer gehalten wird.

   .. code-block:: python

       try:
           while True:
               # Position the servo at the middle and wait
               servo.mid()
               print("mid")  # Indicate current position
               sleep(0.5)    # Brief pause for 0.5 seconds

               # Move the servo to its minimum position and wait
               servo.min()
               print("min")  # Indicate current position
               sleep(1)      # Hold position for 1 second

               # Return the servo to the middle position and wait
               servo.mid()
               print("mid")  # Indicate current position
               sleep(0.5)    # Brief pause for 0.5 seconds

               # Move the servo to its maximum position and wait
               servo.max()
               print("max")  # Indicate current position
               sleep(1)      # Hold position for 1 second

       except KeyboardInterrupt:
           # Gracefully terminate the script on a keyboard interrupt (Ctrl+C)
           pass
