.. note::

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

    **Perché unirti a noi?**

    - **Supporto esperto**: Risolvi i problemi post-vendita e le sfide tecniche con l'aiuto della nostra comunità e del nostro team.
    - **Impara e condividi**: Scambia suggerimenti e tutorial per migliorare le tue competenze.
    - **Anteprime esclusive**: Ottieni accesso anticipato agli annunci di nuovi prodotti e anteprime speciali.
    - **Sconti esclusivi**: Approfitta di sconti riservati sui nostri prodotti più recenti.
    - **Promozioni festive e concorsi**: Partecipa a concorsi e promozioni durante le festività.

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

.. _2.2.6_py:

2.2.6 Modulo Sensore di Velocità
===================================

Introduzione
---------------

In questo progetto, impareremo l'uso del modulo sensore di velocità. Un modulo sensore di velocità è un tipo di tachimetro che viene utilizzato per misurare la velocità di un oggetto rotante, come un motore.

Componenti Necessari
-----------------------

In questo progetto, abbiamo bisogno dei seguenti componenti.

.. image:: ../img/2.2.6component.png
    :width: 700
    :align: center

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

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

    *   - Nome	
        - ARTICOLI IN QUESTO KIT
        - LINK
    *   - Kit Raphael
        - 337
        - |link_Raphael_kit|

Puoi anche acquistarli separatamente dai link qui sotto.

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

    *   - INTRODUZIONE AI COMPONENTI
        - LINK PER L'ACQUISTO

    *   - :ref:`cpn_gpio_extension_board`
        - |link_gpio_board_buy|
    *   - :ref:`cpn_breadboard`
        - |link_breadboard_buy|
    *   - :ref:`cpn_wires`
        - |link_wires_buy|
    *   - :ref:`cpn_resistor`
        - |link_resistor_buy|
    *   - :ref:`cpn_led`
        - |link_led_buy|
    *   - :ref:`cpn_speed_sensor`
        - \-

Schema Elettrico
-------------------

.. image:: ../img/2.2.6circuit.png
    :width: 400
    :align: center

Procedure Sperimentali
-------------------------

**Passo 1:** Costruisci il circuito.

.. image:: ../img/2.2.6fritzing.png
    :width: 700
    :align: center

**Passo 2:** Cambia directory.

.. raw:: html

   <run></run>

.. code-block::
    
    cd ~/raphael-kit/python

**Passo 3:** Esegui.

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 2.2.6_speed_sensor_module.py

Dopo che il codice è stato eseguito, il LED verde si accenderà. Se metti un ostacolo nella fessura del modulo sensore di velocità, verrà stampato sullo schermo "light blocked" e il LED rosso si accenderà. Rimuovi l'ostacolo e il LED verde si accenderà di nuovo.

**Codice**

.. note::

    Puoi **Modificare/Reimpostare/Copiare/Eseguire/Interrompere** il codice qui sotto. Ma prima devi accedere al percorso del codice come ``raphael-kit/python``. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l'effetto.

.. raw:: html

    <run></run>

.. code-block:: python

    #!/usr/bin/env python3
    import RPi.GPIO as GPIO

    speedPin  = 17
    Gpin   = 27
    Rpin   = 22

    def setup():
        GPIO.setmode(GPIO.BCM)       # 
        GPIO.setup(Gpin, GPIO.OUT)     # Imposta Gpin in modalità output
        GPIO.setup(Rpin, GPIO.OUT)     # Imposta Rpin in modalità output
        GPIO.setup(speedPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)    # Imposta speedPin in modalità input e inizializzalo a livello alto (3.3V)
        GPIO.add_event_detect(speedPin, GPIO.BOTH, callback=detect, bouncetime=200)

    def Led(x):
        if x == 0:
            GPIO.output(Rpin, 0)
            GPIO.output(Gpin, 1)
        if x == 1:
            GPIO.output(Rpin, 1)
            GPIO.output(Gpin, 0)
            print ('Light was blocked')
            
    def detect(chn):
        Led(GPIO.input(speedPin))

    def loop():
        while True:
            pass

    def destroy():
        GPIO.output(Gpin, GPIO.LOW)       # Spegni il LED verde
        GPIO.output(Rpin, GPIO.LOW)       # Spegni il LED rosso
        GPIO.cleanup()                    # Rilascia le risorse

    if __name__ == '__main__':     # Il programma parte da qui
        setup()
        try:
            loop()
        except KeyboardInterrupt:  # Quando viene premuto 'Ctrl+C', il programma distrugge() sarà eseguito.
            destroy()

**Spiegazione del Codice**

.. code-block:: python

    GPIO.add_event_detect(speedPin, GPIO.BOTH, callback=detect, bouncetime=200)

Aggiungi un evento qui, che viene attivato da una variazione del livello di ``speedPin`` e chiama ``detect()`` per controllare l'accensione e lo spegnimento dei 2 LED.

.. code-block:: python

    def Led(x):
        if x == 0:
            GPIO.output(Rpin, 0)
            GPIO.output(Gpin, 1)
        if x == 1:
            GPIO.output(Rpin, 1)
            GPIO.output(Gpin, 0)
            print ('Light was blocked')			

Definisci una funzione ``Led()`` che accende il LED rosso e stampa ``Light was blocked`` quando il parametro è 1; accende il LED verde quando il parametro è 0.

.. code-block:: python

    def detect(chn):
        Led(GPIO.input(speedPin))

Definisci una funzione di callback dove il valore di ``speedPin`` controllerà l'accensione o lo spegnimento dei 2 LED.

Immagine del Fenomeno
--------------------------

.. image:: ../img/2.2.6photo_interrrupter.JPG
   :width: 500
   :align: center
