.. note::

    Bonjour, bienvenue dans la communauté SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts sur Facebook ! Plongez plus profondément dans le monde du Raspberry Pi, de l'Arduino et de l'ESP32 avec d'autres passionnés.

    **Pourquoi nous rejoindre ?**

    - **Support d'experts** : Résolvez les problèmes après-vente et les défis techniques avec l'aide de notre communauté et de notre équipe.
    - **Apprendre & Partager** : Échangez des astuces et des tutoriels pour améliorer vos compétences.
    - **Aperçus exclusifs** : Accédez en avant-première aux annonces de nouveaux produits et aux avant-goûts.
    - **Réductions spéciales** : Profitez de réductions exclusives sur nos nouveaux produits.
    - **Promotions festives et tirages au sort** : Participez à des promotions spéciales et à des concours.

    👉 Prêt à explorer et créer avec nous ? Cliquez sur [|link_sf_facebook|] et rejoignez-nous dès aujourd'hui !

.. _play_sc:

9. Jouer avec le contrôleur @SunFounder
===========================================

Dans ce projet, vous apprendrez à créer un projet à distance en utilisant l'application Sunfounder Controller.
Dans un environnement LAN, vous pouvez contrôler votre circuit Pico W avec votre téléphone ou votre tablette.
Vous trouverez cette application très utile si vous souhaitez construire un robot simple avec le Pico W.

Ici, nous utiliserons la barre de curseur de l'application pour contrôler l'angle du servo et le manomètre de l'application pour afficher la distance détectée par le capteur ultrasonique.

**1. Composants requis**

Dans ce projet, nous avons besoin des composants suivants.

Il est définitivement pratique d'acheter un kit complet, voici le lien :

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

    *   - Nom
        - ARTICLES DANS CE KIT
        - LIEN
    *   - Kepler Kit
        - 450+
        - |link_kepler_kit|

Vous pouvez également les acheter séparément à partir des liens ci-dessous.

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

    *   - SN
        - COMPOSANT
        - QUANTITÉ
        - LIEN

    *   - 1
        - :ref:`cpn_pico_w`
        - 1
        - |link_picow_buy|
    *   - 2
        - Câble Micro USB
        - 1
        - 
    *   - 3
        - :ref:`cpn_breadboard`
        - 1
        - |link_breadboard_buy|
    *   - 4
        - :ref:`cpn_wire`
        - Plusieurs
        - |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
        - Batterie 18650
        - 1
        -  
    *   - 9
        - Support de batterie
        - 1
        -  

**2. Construire le circuit**

.. warning::

    Assurez-vous que votre module de charge Li-po est connecté comme indiqué sur le schéma. Sinon, un court-circuit pourrait endommager votre batterie et votre circuit.

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


**3. Configurer le contrôleur SunFounder**

1. Installez `SunFounder Controller APP <https://docs.sunfounder.com/projects/sf-controller/en/latest/>`_ depuis l'**APP Store (iOS)** ou **Google Play (Android)**.

2. Ouvrez l'application et cliquez sur le bouton **+** sur la page d'accueil pour créer un contrôleur.

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

3. Ici, nous choisissons **Blank** et **Dual Stick**.

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

4. Vous obtenez maintenant un contrôleur vide.

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

5. Cliquez sur la zone **H** et ajoutez un widget **Slider**.

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

6. Cliquez sur l'engrenage du contrôle pour ouvrir la fenêtre des paramètres.

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

7. Réglez Maximum à 180 et Minimum à 0, puis cliquez sur **Confirmer**.

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

8. Cliquez sur la zone L et ajoutez un widget Gauge.

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

9. Cliquez sur l'engrenage du Gauge, ouvrez la fenêtre des paramètres, réglez Maximum à 100, Minimum à 0 et unité à cm.

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

10. Après avoir terminé les réglages des widgets, cliquez sur Sauvegarder.

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

**4. Exécuter le code**

.. note:: 
    Si votre Pico W utilise actuellement le firmware Anvil, vous devrez :ref:`install_micropython_on_pico`.

1. Téléchargez ``ws.py`` et ``websocket_helper.py`` depuis le chemin ``kepler-kit-main/libs`` vers le Raspberry Pi Pico W.

    .. image:: img/9_sc3.png

2. Double-cliquez sur le script ``ws.py`` et renseignez les ``SSID`` et ``PASSWORD`` de votre réseau Wi-Fi.

    .. image:: img/9_sc1.png

3. Ouvrez ``9_sunfounder_controller.py`` dans le chemin ``kepler-kit-main/iot``. Cliquez sur le bouton **Run current script** ou appuyez sur F5 pour l'exécuter. Après une connexion réussie, vous verrez l'adresse IP de Pico W.

    .. image:: img/9_sc2.png

    .. note::
        Si vous souhaitez que ce script se lance au démarrage, vous pouvez le sauvegarder sur le Raspberry Pi Pico W en tant que ``main.py``.

4. Retournez sur l'application SunFounder Controller et cliquez sur le bouton **Connect**.

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

5. Si Pico W est détecté, touchez-le directement pour vous connecter.

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

6. S'il ne se connecte pas automatiquement, vous pouvez aussi entrer manuellement l'adresse IP pour vous connecter.

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

7. Lorsque vous faites glisser la barre de curseur dans la zone H après avoir cliqué sur le bouton Run, le servo ajustera son angle. Le manomètre dans la zone L affichera la distance si votre main se trouve à moins de 100 cm du capteur ultrasonique.

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

**Comment ça marche ?**

La classe ``WS_Server`` dans la bibliothèque ``ws.py`` permet de communiquer avec l'application. Voici le cadre pour implémenter sa fonctionnalité de base.

.. code-block:: python

    from ws import WS_Server
    import json
    import time

    ws = WS_Server(8765) # init websocket 

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

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

Tout d'abord, nous devons créer un objet ``WS_Server``.

.. code-block:: python

    ws = WS_Server(8765) 

Lancer le serveur.

.. code-block:: python

    ws.start()

Ensuite, une boucle ``while True`` est utilisée pour effectuer le transfert de données entre Pico W et l'application SunFounder Controller.

.. code-block:: python

    while True:
        # transfert des données via websocket
        status, result = ws.transfer()

        # état du transfert de données
        print(status)

        # données reçues
        print(result)

        # données envoyées
        print(ws.send_dict)
        
        time.sleep_ms(100)

``status`` est ``False`` si la réception des données de l'application échoue.

Et ``result`` contient les données que Pico W a récupérées depuis l'application. 
En les affichant, vous verrez quelque chose comme ceci, qui représente les valeurs de toutes les zones des widgets.

.. code-block:: 

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

Dans cet exemple, nous imprimons les valeurs de la zone H séparément et les utilisons pour contrôler le circuit.

.. code-block:: python

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


Le dictionnaire ``ws.send_dict`` contient les données que Pico W envoie à l'application SunFounder Controller. Il est créé dans la classe ``WS_Server`` et est envoyé lorsque ``ws.transfer()`` est exécuté.

Le message est illustré ci-dessous.

.. code-block:: python

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

C'est un message vierge, pour copier les données sur le widget de l'application, nous devons attribuer une valeur à la zone correspondante du dictionnaire. Par exemple, attribuer la valeur ``50`` à la zone L.

.. code-block:: python

        ws.send_dict['L'] = 50

Les données apparaîtront ainsi :

.. code-block:: python

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


Pour plus de détails sur l'utilisation de SunFounder Controller, veuillez consulter `SunFounder Controller APP <https://docs.sunfounder.com/projects/sf-controller/en/latest/>`_.
