.. 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_c_pi5:

1.3.2 Servo
=================

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

In diesem Projekt lernen wir, wie man den Servo zum Drehen bringt.

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

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

.. image:: ../img/list_1.3.2.png

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

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

    *   - Name	
        - ARTIKEL 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_servo`
        - |link_servo_buy|

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

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


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

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

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

**Schritt 2**: Wechseln Sie in das Verzeichnis mit dem Code.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/c/1.3.2

**Schritt 3**: Kompilieren Sie den Code.

.. raw:: html

   <run></run>

.. code-block::

    gcc 1.3.2_Servo.c -lwiringPi

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

.. raw:: html

   <run></run>

.. code-block::

    sudo ./a.out

Nachdem das Programm ausgeführt wurde, wird der Servo 
von 0 Grad auf 180 Grad und dann von 180 Grad auf 0 Grad zirkulär drehen.

.. note::

    Wenn es nach dem Starten nicht funktioniert oder eine Fehlermeldung erscheint: \"wiringPi.h: Datei oder Verzeichnis nicht gefunden\", beziehen Sie sich bitte auf :ref:`install_wiringpi`.

**Code**

.. code-block:: c

    #include <wiringPi.h>
    #include <softPwm.h>
    #include <stdio.h>

    #define ServoPin    1       //define the servo to GPIO1
    long Map(long value,long fromLow,long fromHigh,long toLow,long toHigh){
        return (toHigh-toLow)*(value-fromLow) / (fromHigh-fromLow) + toLow;
    }
    void setAngle(int pin, int angle){    //Create a funtion to control the angle of the servo.
        if(angle < 0)
            angle = 0;
        if(angle > 180)
            angle = 180;
        softPwmWrite(pin,Map(angle, 0, 180, 5, 25));   
    } 

    int main(void)
    {
        int i;
        if(wiringPiSetup() == -1){ //when initialize wiring failed,print message to screen
            printf("setup wiringPi failed !");
            return 1; 
        }
        softPwmCreate(ServoPin, 0, 200);       //initialize PMW pin of servo
        while(1){
            for(i=0;i<181;i++){     // Let servo rotate from 0 to 180.            	setAngle(ServoPin,i);
                delay(2);
            }
            delay(1000);
            for(i=181;i>-1;i--){        // Let servo rotate from 180 to 0.            	setAngle(ServoPin,i);
                delay(2);
            }
            delay(1000);
        }
        return 0;
    }

**Code-Erklärung**

.. code-block:: c

    long Map(long value,long fromLow,long fromHigh,long toLow,long toHigh){
        return (toHigh-toLow)*(value-fromLow) / (fromHigh-fromLow) + toLow;
    }

Erstellen Sie eine ``Map()``-Funktion, um Werte im folgenden Code zuzuordnen.

.. code-block:: c

    void setAngle(int pin, int angle){    //Create a funtion to control the angle of the servo.
        if(angle < 0)
            angle = 0;
        if(angle > 180)
            angle = 180;
        softPwmWrite(pin,Map(angle, 0, 180, 5, 25));   
    } 

Erstellen Sie eine Funktion namens ``setAngle()``, um dem Servo einen Winkel zuzuweisen.

.. code-block:: c

    softPwmWrite(pin,Map(angle,0,180,5,25));  

Diese Funktion kann den Tastgrad des PWM ändern.

Um den Servo auf 0 ~ 180 ° zu drehen, sollte die Impulsbreite
im Bereich von 0,5ms ~ 2,5ms variieren, wenn die Periode 20ms beträgt; in der
Funktion ``softPwmCreate()`` haben wir festgelegt, dass die Periode 
200x100us=20ms beträgt, daher müssen wir 0 ~ 180 auf 5x100us ~ 25x100us mappen.

Der Prototyp dieser Funktion ist unten dargestellt.

.. code-block::

    int softPwmCreate(int pin, int initialValue, int pwmRange);

* ``pin``: Jeder GPIO-Pin des Raspberry Pi kann als PWM-Pin festgelegt werden.
* ``initialValue``: Die anfängliche Impulsbreite beträgt initialValue mal 100us.
* ``pwmRange``: Die Periode des PWM beträgt pwmRange mal 100us.

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

.. image:: ../img/image126.jpeg

