.. note::

    Ciao, benvenuto nella Community di appassionati di SunFounder Raspberry Pi, Arduino e ESP32 su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino e ESP32 insieme ad altri appassionati.

    **Perché unirti?**

    - **Supporto Esperto**: Risolvi i problemi post-vendita e le sfide tecniche con l'aiuto della nostra community e del nostro team.
    - **Impara e Condividi**: Scambia consigli e tutorial per migliorare le tue competenze.
    - **Anteprime Esclusive**: Ottieni accesso anticipato agli annunci di nuovi prodotti e alle anteprime.
    - **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
    - **Promozioni Festive e Giveaway**: Partecipa a promozioni festive e concorsi a premi.

    👉 Sei pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso!

.. _play_sc:

9. Gioca con @SunFounder Controller
======================================

In questo progetto, imparerai a costruire un progetto remoto utilizzando l'APP SunFounder Controller.
In un ambiente LAN, puoi controllare il circuito del tuo Pico W con il tuo telefono o tablet.
Troverai questa app molto utile se vuoi costruire un semplice robot con Pico W.

Qui, utilizzeremo la barra di scorrimento sull'APP per controllare l'angolo del servo e il misuratore sull'APP per mostrare la distanza rilevata dall'ultrasuoni.

**1. Componenti necessari**

In questo progetto, abbiamo bisogno dei seguenti componenti. 

È sicuramente conveniente acquistare un kit completo, ecco il link: 

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

    *   - Nome	
        - ELEMENTI IN QUESTO KIT
        - LINK
    *   - Kit Kepler	
        - 450+
        - |link_kepler_kit|

Puoi anche acquistarli separatamente dai link qui sotto.

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

    *   - SN
        - COMPONENTE	
        - QUANTITÀ
        - LINK

    *   - 1
        - :ref:`cpn_pico_w`
        - 1
        - |link_picow_buy|
    *   - 2
        - Cavo Micro USB
        - 1
        - 
    *   - 3
        - :ref:`cpn_breadboard`
        - 1
        - |link_breadboard_buy|
    *   - 4
        - :ref:`cpn_wire`
        - Diverse
        - |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
        - Batteria 18650
        - 1
        -  
    *   - 9
        - Supporto Batteria
        - 1
        -  

**2. Costruisci il Circuito**

.. warning:: 
        
    Assicurati che il modulo caricabatterie Li-po sia collegato come mostrato nello schema. Altrimenti, un cortocircuito potrebbe danneggiare la batteria e il circuito.

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


**3. Configura SunFounder Controller**

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

2. Apri l'APP e clicca sul pulsante **+** nella home page per creare un controller.

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

3. Qui scegliamo **Blank** e **Dual Stick**.

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

4. Ora otteniamo un controller vuoto.

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

5. Clicca sull'area **H** e aggiungi un widget **Slider**.

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

6. Clicca sull'ingranaggio del controllo per aprire la finestra delle impostazioni.

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

7. Imposta il massimo a 180 e il minimo a 0, quindi clicca su **Conferma**.

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

8. Clicca sull'area L e aggiungi un widget Gauge.

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

9. Clicca sull'ingranaggio del Gauge, apri la finestra delle impostazioni, imposta il massimo a 100, il minimo a 0 e l'unità su cm.

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

10. Dopo aver terminato le impostazioni del widget, clicca su Salva.

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



**4. Esegui il Codice**

.. note:: 
    Se il tuo Pico W sta attualmente utilizzando il firmware Anvil, dovrai :ref:`install_micropython_on_pico`.


1. Carica ``ws.py`` e ``websocket_helper.py`` dal percorso ``kepler-kit-main/libs`` al Raspberry Pi Pico W.

    .. image:: img/9_sc3.png

2. Fai doppio clic sullo script ``ws.py`` e inserisci il ``SSID`` e la ``PASSWORD`` del tuo WiFi.

    .. image:: img/9_sc1.png

3. Apri ``9_sunfounder_controller.py`` nel percorso ``kepler-kit-main/iot``. Clicca sul pulsante **Esegui script corrente** o premi F5 per eseguirlo. Dopo una connessione riuscita, vedrai l'IP del Pico W.

    .. image:: img/9_sc2.png

    .. note::
        Se vuoi che questo script si avvii automaticamente, puoi salvarlo come ``main.py`` nel Raspberry Pi Pico W.

4. Torna all'APP SunFounder Controller, clicca sul pulsante **Connetti**.

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

5. Se PicoW viene rilevato, toccalo direttamente per connetterti.

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

6. Se non viene rilevato automaticamente, puoi anche inserire manualmente l'IP per connetterti.

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

7. Quando scorri la barra del cursore nell'area H dopo aver cliccato sul pulsante Esegui, il servo regolerà il suo angolo. Il misuratore nell'area L mostrerà la distanza se la tua mano è entro 100 cm dal sensore ad ultrasuoni.

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

**Come funziona?**


La classe ``WS_Server`` nella libreria ``ws.py`` implementa la comunicazione con l'APP. Di seguito è riportato il framework per implementare la sua funzionalità di base.

.. code-block:: python

    from ws import WS_Server
    import json
    import time

    ws = WS_Server(8765) # inizializza il websocket 

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

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


Innanzitutto, dobbiamo creare un oggetto ``WS_Server``.

.. code-block:: python

    ws = WS_Server(8765) 

Avvialo.

.. code-block:: python

    ws.start()


Successivamente, viene utilizzato un ciclo ``while True`` per eseguire il trasferimento dati tra Pico W e l'APP SunFounder Controller.

.. code-block:: python

    while True:
        #  websocket transfer data
        status,result = ws.transfer()

        # the status of transfer data
        print(status)

        # the data you recv
        print(result)

        # the data you send
        print(ws.send_dict)

        
        time.sleep_ms(100)

``status`` è ``False`` se non riesce a ottenere dati dall'APP SunFounder Controller.

E ``result`` sono i dati che Pico W ha recuperato dall'APP SunFounder Controller.
Stampali e vedrai qualcosa di simile a quanto segue. Questo è il valore di tutte le aree Widget.

.. code-block:: 

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

Come in questo caso, stampiamo i valori dell'area H separatamente e li usiamo per operare il circuito.

.. code-block:: python

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


E il dizionario ``ws.send_dict`` sono i dati che Pico W invia all'APP SunFounder Controller. Viene creato nella classe ``WS_Server``. Verrà inviato quando viene eseguito ``ws.transfer()``.

Il messaggio è mostrato di seguito.

.. code-block:: python

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

Questo è un messaggio vuoto, per copiarlo nel widget sull'APP SunFounder Controller, dobbiamo assegnare il valore all'area corrispondente nel dizionario. Ad esempio, assegnare il valore ``50`` all'area L.

.. code-block:: python

        ws.send_dict['L'] = 50

I dati sono mostrati di seguito:

.. code-block:: python

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


Per maggiori dettagli sull'utilizzo di SunFounder Controller, consulta `SunFounder Controller APP <https://docs.sunfounder.com/projects/sf-controller/en/latest/>`_.
