.. note::

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

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

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

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

.. _play_sc:

9. @SunFounder コントローラーで遊ぶ
====================================

このプロジェクトでは、SunFounder Controller APPを使用してリモートプロジェクトを構築する方法を学びます。
ローカルエリアネットワーク（LAN）環境で、スマートフォンやタブレットを使ってPico W回路を制御できます。
Pico Wでシンプルなロボットを作成したい場合、このアプリは非常に便利です。

ここでは、APPのスライダーバーでサーボの角度を制御し、APPのゲージで超音波によって検出された距離を表示します。

**1. 必要なコンポーネント**

このプロジェクトで必要なコンポーネントは以下の通りです。

一式を購入することは確かに便利です、リンクはこちらです：

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

    *   - 名前
        - このキットのアイテム
        - リンク
    *   - ケプラーキット
        - 450以上
        - |link_kepler_kit|

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

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

    *   - 番号
        - コンポーネント
        - 数量
        - リンク

    *   - 1
        - :ref:`cpn_pico_w`
        - 1
        - |link_picow_buy|
    *   - 2
        - マイクロUSBケーブル
        - 1
        - 
    *   - 3
        - :ref:`cpn_breadboard`
        - 1
        - |link_breadboard_buy|
    *   - 4
        - :ref:`cpn_wire`
        - 数本
        - |link_wires_buy|
    *   - 5
        - :ref:`cpn_servo`
        - 1
        - |link_servo_buy|
    *   - 6
        - :ref:`cpn_ultrasonic`
        - 1
        - |link_ultrasonic_buy|
    *   - 7
        - :ref:`cpn_lipo_charger`
        - 1
        - 
    *   - 8
        - 18650バッテリー
        - 1
        - 
    *   - 9
        - バッテリーホルダー
        - 1
        - 

**2. 回路の構築**

.. warning:: 

    ダイヤグラムに示されているように、Li-poチャージャーモジュールが接続されていることを確認してください。そうでない場合、ショートが起きてバッテリーや回路が損傷する可能性があります。

.. image:: img/wiring/9.sc_bb.png
    :width: 800


**3. SunFounderコントローラーのセットアップ**

1. `SunFounder Controller APP <https://docs.sunfounder.com/projects/sf-controller/en/latest/>`_ を **APP Store(iOS)** または **Google Play(Android)** からインストールします。

    .. image:: img/sc-a-2.jpg
        :width: 800

2. APPを開いて、ホームページの **+** ボタンをクリックしてコントローラーを作成します。

    .. image:: img/sc-a-3.jpg
        :width: 800

3. ここでは **Blank** と **Dual Stick** を選びます。

    .. image:: img/sc-a-4.jpg
        :width: 800

4. 空のコントローラーが表示されます。

    .. image:: img/sc-a-5.jpg
        :width: 800

5. **H** エリアをクリックして、 **Slider** ウィジェットを追加します。

    .. image:: img/sc-a-6.png
        :width: 300

6. コントロールの歯車をクリックして設定ウィンドウを開きます。

    .. image:: img/sc-a-7.jpg
        :width: 800

7. 最大値を180、最小値を0に設定し、 **Confirm** をクリックします。

    .. image:: img/sc-a-8.jpg
        :width: 800

8. Lエリアをクリックして、ゲージウィジェットを追加します。

    .. image:: img/sc-a-9.jpg
        :width: 800

9. ゲージの歯車をクリックして設定ウィンドウを開き、最大値を100、最小値を0、単位をcmに設定します。

    .. image:: img/sc-a-10.png
        :width: 300

10. ウィジェットの設定が完了したら、保存をクリックします。

**4. コードの実行**

.. note:: 
    Pico Wが現在Anvilファームウェアを使用している場合、 :ref:`install_micropython_on_pico` が必要です。

1. ``kepler-kit-main/libs`` のパスから ``ws.py`` と ``websocket_helper.py`` をRaspberry Pi Pico Wにアップロードします。

    .. image:: img/9_sc3.png

2. ``ws.py`` スクリプトをダブルクリックして、WiFiの ``SSID`` と ``PASSWORD`` を入力します。

    .. image:: img/9_sc1.png

3. ``kepler-kit-main/iot`` のパス下の ``9_sunfounder_controller.py`` を開きます。 **Run current script** ボタンをクリックするか、F5を押して実行します。接続に成功すると、Pico WのIPが表示されます。

    .. image:: img/9_sc2.png

    .. note::
        このスクリプトを起動できるようにするには、それをRaspberry Pi Pico Wに ``main.py`` として保存できます。

4. SunFounder Controller APPに戻り、 **Connect** ボタンをクリックします。

    .. image:: img/sc-c-4.jpg
        :width: 300

5. PicoWが検出された場合、それを直接タップして接続します。

    .. image:: img/sc-c-5.jpg
        :width: 300

6. 自動的に検索しない場合、IPを手動で入力して接続することもできます。

    .. image:: img/sc-c-6.png
        :width: 800

7. Runボタンをクリックした後、Hエリアのスライダーバーをスライドすると、サーボが角度を調整します。Lエリアのゲージは、手が超音波センサーから100cm以内であれば距離を表示します。

    .. image:: img/sc-c-8.jpg
        :width: 300

**どのように動作するか？**

``ws.py`` ライブラリの ``WS_Server`` クラスは、APPとの通信を実装しています。以下は、その基本機能を実装するためのフレームワークです。

.. code-block:: python

    from ws import WS_Server
    import json
    import time

    ws = WS_Server(8765)  # WebSocketの初期化

    def main():
        ws.start()
        while True:
            status, result = ws.transfer()
            time.sleep_ms(100)

    try:
        main()
    finally:
        ws.stop()

まず、 ``WS_Server`` オブジェクトを作成する必要があります。

.. code-block:: python

    ws = WS_Server(8765)

それを開始します。

.. code-block:: python

    ws.start()

次に、 ``while True`` ループを使用して、Pico WとSunFounder Controller APP間でのデータ転送を実行します。

.. code-block:: python

    while True:
        # WebSocketでデータを転送
        status, result = ws.transfer()

        # 転送データの状態
        print(status)

        # 受信したデータ
        print(result)

        # 送信するデータ
        print(ws.send_dict)
        
        time.sleep_ms(100)

``status`` は、SunFounder Controller APPからデータを取得できなかった場合に ``False`` です。

そして、 ``result`` は、Pico WがSunFounder Controller APPからフェッチしたデータです。
それを出力すると、以下のようなものが表示されます。これは、すべてのウィジェットエリアの値です。

.. code-block:: 

    {'C': None, 'B': None, 'M': None,,,,, 'A': None, 'R': None}

このケースでは、Hエリアの値を別々に出力し、それを使用して回路を操作します。

.. code-block:: python

        status, result = ws.transfer()
        #print(result)
        if status == True:
            print(result['H'])

そして、 ``ws.send_dict`` 辞書は、Pico WがSunFounder Controller APPに送信するデータです。これは ``WS_Server`` クラスで作成されています。 ``ws.transfer()`` が実行されたときに送信されます。

そのメッセージは以下の通りです。

.. code-block:: python

    {'Check': 'SunFounder Controller', 'Name': 'PicoW', 'Type': 'Blank'}

これは空のメッセージであり、SunFounder Controller APPのウィジェットにそれをコピーするには、辞書内の対応するエリアに値を割り当てる必要があります。例えば、Lエリアに値 ``50`` を割り当てます。

.. code-block:: python

        ws.send_dict['L'] = 50

表示されるデータは以下の通りです。

.. code-block:: python

    {'L': 50, 'Type': 'Blank', 'Name': 'PicoW', 'Check': 'SunFounder Controller'}

SunFounder Controllerの詳しい使い方については、 `SunFounder Controller APP <https://docs.sunfounder.com/projects/sf-controller/en/latest/>`_ をご参照ください。
