.. 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.1_py:

1.3.1 Motor
=============

Einführung
-----------------

In diesem Projekt werden wir lernen, wie man mit L293D einen Gleichstrommotor steuert 
und ihn im Uhrzeigersinn und gegen den Uhrzeigersinn drehen lässt. Da der Gleichstrommotor 
einen größeren Strom benötigt, verwenden wir aus Sicherheitsgründen das Netzteilmodul 
zur Stromversorgung der Motoren.

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

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

.. image:: ../img/list_1.3.1.png

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

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

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

Sie können diese auch einzeln über die untenstehenden Links kaufen.

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

    *   - KOMPONENTENBESCHREIBUNG
        - KAUF-LINK

    *   - :ref:`cpn_gpio_board`
        - |link_gpio_board_buy|
    *   - :ref:`cpn_breadboard`
        - |link_breadboard_buy|
    *   - :ref:`cpn_wires`
        - |link_wires_buy|
    *   - :ref:`cpn_power_module`
        - \-
    *   - :ref:`cpn_l293d`
        - \-
    *   - :ref:`cpn_motor`
        - |link_motor_buy|


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

Stecken Sie das Netzteilmodul ins Steckbrett und setzen Sie die Jumperkappe 
auf den 5V-Pin, dann gibt es eine Ausgangsspannung von 5V. Verbinden Sie Pin 1 des L293D 
mit GPIO22 und setzen Sie es auf hohes Niveau. Verbinden Sie Pin2 mit GPIO27 und Pin7 
mit GPIO17, setzen Sie dann einen Pin hoch und den anderen niedrig. So können Sie die 
Drehrichtung des Motors ändern.

.. image:: ../img/image336.png

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

**Schritt 1:** Bauen Sie die Schaltung auf.

.. image:: ../img/image117.png

.. note::
    Das Netzteilmodul kann mit einer 9V-Batterie und dem 9V-Batteriehalter 
    aus dem Kit betrieben werden. Setzen Sie die Jumperkappe des Netzteilmoduls 
    in die 5V-Busstreifen des Steckbretts.

.. image:: ../img/image118.jpeg

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

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/python

**Schritt 3**: Ausführen.

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 1.3.1_Motor.py

Während der Code läuft, dreht sich der Motor zunächst 5 Sekunden lang im Uhrzeigersinn, 
hält dann für 5 Sekunden an, danach dreht er sich 5 Sekunden lang gegen den Uhrzeigersinn; 
anschließend hält der Motor erneut für 5 Sekunden an. Diese Reihe von Aktionen wird 
wiederholt durchgeführt.

**Code**

.. note::

    Sie können den untenstehenden Code **Ändern/Zurücksetzen/Kopieren/Ausführen/Stoppen**. 
    Bevor Sie dies tun, müssen Sie jedoch zum Quellcode-Pfad, wie z.B. ``raphael-kit/python``, 
    navigieren. Nachdem Sie den Code geändert haben, können Sie ihn direkt ausführen, 
    um den Effekt zu sehen.


.. raw:: html

    <run></run>

.. code-block:: python

    import RPi.GPIO as GPIO
    import time

    # Set up pins
    MotorPin1   = 17
    MotorPin2   = 27
    MotorEnable = 22

    def setup():
        # Set the GPIO modes to BCM Numbering
        GPIO.setmode(GPIO.BCM)
        # Set pins to output
        GPIO.setup(MotorPin1, GPIO.OUT)
        GPIO.setup(MotorPin2, GPIO.OUT)
        GPIO.setup(MotorEnable, GPIO.OUT, initial=GPIO.LOW)

    # Define a motor function to spin the motor
    # direction should be
    # 1(clockwise), 0(stop), -1(counterclockwise)
    def motor(direction):
        # Clockwise
        if direction == 1:
            # Set direction
            GPIO.output(MotorPin1, GPIO.HIGH)
            GPIO.output(MotorPin2, GPIO.LOW)
            # Enable the motor
            GPIO.output(MotorEnable, GPIO.HIGH)
            print ("Clockwise")
        # Counterclockwise
        if direction == -1:
            # Set direction
            GPIO.output(MotorPin1, GPIO.LOW)
            GPIO.output(MotorPin2, GPIO.HIGH)
            # Enable the motor
            GPIO.output(MotorEnable, GPIO.HIGH)
            print ("Counterclockwise")
        # Stop
        if direction == 0:
            # Disable the motor
            GPIO.output(MotorEnable, GPIO.LOW)
            print ("Stop")

    def main():
        # Define a dictionary to make the script more readable
        # CW as clockwise, CCW as counterclockwise, STOP as stop
        directions = {'CW': 1, 'CCW': -1, 'STOP': 0}
        while True:
            # Clockwise
            motor(directions['CW'])
            time.sleep(5)
            # Stop
            motor(directions['STOP'])
            time.sleep(5)
            # Anticlockwise
            motor(directions['CCW'])
            time.sleep(5)
            # Stop
            motor(directions['STOP'])
            time.sleep(5)

    def destroy():
        # Stop the motor
        GPIO.output(MotorEnable, GPIO.LOW)
        # Release resource
        GPIO.cleanup()   

    # If run this script directly, do:
    if __name__ == '__main__':
        setup()
        try:
            main()
        # When 'Ctrl+C' is pressed, the program
        # destroy() will be executed.
        except KeyboardInterrupt:
            destroy()

**Code-Erklärung**

.. code-block:: python

    def motor(direction):
        # Clockwise
        if direction == 1:
            # Set direction
            GPIO.output(MotorPin1, GPIO.HIGH)
            GPIO.output(MotorPin2, GPIO.LOW)
            # Enable the motor
            GPIO.output(MotorEnable, GPIO.HIGH)
            print ("Clockwise")
    ...

Erstellen Sie eine Funktion, ``motor()``, deren Variable "direction" ist. Wenn
die Bedingung direction=1 erfüllt ist, dreht sich der Motor im Uhrzeigersinn; wenn
direction=-1 ist, dreht sich der Motor gegen den Uhrzeigersinn; und unter der Bedingung
direction=0, hört er auf sich zu drehen.

.. code-block:: python

    def main():
        # Define a dictionary to make the script more readable
        # CW as clockwise, CCW as counterclockwise, STOP as stop
        directions = {'CW': 1, 'CCW': -1, 'STOP': 0}
        while True:
            # Clockwise
            motor(directions['CW'])
            time.sleep(5)
            # Stop
            motor(directions['STOP'])
            time.sleep(5)
            # Anticlockwise
            motor(directions['CCW'])
            time.sleep(5)
            # Stop
            motor(directions['STOP'])
            time.sleep(5)
        
In der main() Funktion wird ein Array, directions[], erstellt, in dem CW gleich 1 ist,
CCW den Wert -1 hat und die Nummer 0 für Stopp steht.

Während der Code ausgeführt wird, dreht sich der Motor zunächst 5 Sekunden lang im Uhrzeigersinn,
hält dann für 5 Sekunden an, danach dreht er sich 5 Sekunden lang gegen den Uhrzeigersinn; 
anschließend hält der Motor erneut für 5 Sekunden an. Diese Reihe von Aktionen wird 
wiederholt durchgeführt.

Nun sollten Sie sehen, wie das Motorblatt sich dreht.

Phänomen-Bild
------------------

.. image:: ../img/image119.jpeg