.. note::

    こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ！Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。

    **参加する理由は？**

    - **エキスパートサポート**：コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。
    - **学び＆共有**：ヒントやチュートリアルを交換してスキルを向上させましょう。
    - **独占的なプレビュー**：新製品の発表や先行プレビューに早期アクセスしましょう。
    - **特別割引**：最新製品の独占割引をお楽しみください。
    - **祭りのプロモーションとギフト**：ギフトや祝日のプロモーションに参加しましょう。

    👉 私たちと一緒に探索し、創造する準備はできていますか？[|link_sf_facebook|]をクリックして今すぐ参加しましょう！

.. _1.3.2_c:

1.3.2 サーボ
=================

はじめに
--------------

このプロジェクトでは、サーボを回転させる方法を学びます。

必要な部品
------------------------------

このプロジェクトには、以下の部品が必要です。

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

全てのキットを購入するのが確かに便利です、こちらがリンクです：

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

    *   - 名前	
        - このキットのアイテム
        - リンク
    *   - Raphael Kit
        - 337
        - |link_Raphael_kit|

以下のリンクから個別に購入することもできます。

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

    *   - コンポーネントの紹介
        - 購入リンク

    *   - :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|

回路図
-----------------

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


実験手順
-----------------------

**ステップ1:** 回路を作成します。

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

**ステップ2**: コードのフォルダに移動します。

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/c/1.3.2

**ステップ3**: コードをコンパイルします。

.. raw:: html

   <run></run>

.. code-block::

    gcc 1.3.2_Servo.c -lwiringPi

**ステップ4**: 上記の実行ファイルを実行します。

.. raw:: html

   <run></run>

.. code-block::

    sudo ./a.out

プログラムを実行した後、サーボは0度から180度まで、そして180度から0度まで回転し、これを繰り返します。

.. note::

    実行後に動作しない、またはエラープロンプト「wiringPi.h: No such file or directory」が表示される場合は、 :ref:`install_wiringpi` を参照してください。

**コード**


.. 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-block:: c

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

次のコードでの値をマッピングする ``Map()`` 関数を作成します。

.. 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));   
    } 

サーボに角度を書き込む関数、 ``setAngle()`` を作成します。

.. code-block:: c

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

この関数はPWMのデューティサイクルを変更することができます。

サーボを0 ~ 180°に回転させるために、周期が20msの時にパルス幅を0.5ms ~ 2.5msの範囲内で変更する必要があります。関数 ``softPwmCreate()`` で、周期が200x100us=20msであることを設定しているので、0 ~ 180を5x100us ~ 25x100usにマッピングする必要があります。

この関数のプロトタイプは以下のとおりです。

.. code-block::

    int softPwmCreate（int pin，int initialValue，int pwmRange）;

* ``pin``: Raspberry Piの任意のGPIOピンをPWMピンとして設定できます。
* ``initialValue``: 初期のパルス幅は、initialValue倍の100usです。
* ``pwmRange``: PWMの周期は、pwmRange倍の100usです。

現象の画像
------------------


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

