 
.. note::

    Bonjour et bienvenue dans la Communauté Facebook des passionnés de Raspberry Pi, Arduino et ESP32 de SunFounder ! Plongez plus profondément dans l'univers des Raspberry Pi, Arduino et ESP32 avec d'autres passionnés.

    **Pourquoi 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 et 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 aperçus.
    - **Réductions spéciales** : Profitez de réductions exclusives sur nos produits les plus récents.
    - **Promotions festives et cadeaux** : Participez à des cadeaux et des promotions de vacances.

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

.. _1.1.2_py:

1.1.2 LED RVB
====================

Introduction
--------------

Dans ce projet, nous allons contrôler une LED RVB pour qu'elle clignote en différentes couleurs.

Composants nécessaires
------------------------------

Dans ce projet, nous avons besoin des composants suivants.

.. image:: ../img/list_rgb_led.png
    :align: center

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

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

    *   - Nom	
        - ARTICLES DANS CE KIT
        - LIEN
    *   - Kit Raphael
        - 337
        - |link_Raphael_kit|

Vous pouvez également les acheter séparément via les liens ci-dessous.

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

    *   - INTRODUCTION DES COMPOSANTS
        - LIEN D'ACHAT

    *   - :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_rgb_led`
        - |link_rgb_led_buy|


Schéma de câblage
-----------------------

Après avoir connecté les broches de R, G et B à une résistance de limitation de courant, 
connectez-les respectivement aux GPIO17, GPIO18 et GPIO27. La broche la plus longue (GND) 
de la LED se connecte à la masse (GND) du Raspberry Pi. Lorsque les trois broches reçoivent 
différentes valeurs PWM, la LED RVB affichera différentes couleurs.

============== ======== ======== ===
Nom du T-Board physique wiringPi BCM
GPIO17         Pin 11   0        17
GPIO18         Pin 12   1        18
GPIO27         Pin 13   2        27
============== ======== ======== ===

.. image:: ../img/rgb_led_schematic.png

Procédures expérimentales
----------------------------

**Étape 1 :** Montez le circuit.

.. image:: ../img/image61.png

**Étape 2 :** Ouvrez le fichier de code.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/python

**Étape 3 :** Exécutez.

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 1.1.2_rgbLed.py

Après l'exécution du code, vous verrez que la LED RVB affiche du rouge, vert, bleu, jaune, rose et cyan.

**Code**

.. note::

    Vous pouvez **Modifier/Réinitialiser/Copier/Exécuter/Arrêter** le code ci-dessous. Mais avant cela, vous devez vous rendre dans le chemin source du code comme ``raphael-kit/python``. Après avoir modifié le code, vous pouvez l'exécuter directement pour voir l'effet.

.. raw:: html

    <run></run>

.. code-block:: python

    import RPi.GPIO as GPIO
    import time
    # Set up a color table in Hexadecimal
    COLOR = [0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF]
    # Set pins' channels with dictionary
    pins = {'Red':17, 'Green':18, 'Blue':27}

    def setup():
        global p_R, p_G, p_B
        GPIO.setmode(GPIO.BCM)
        # Set all LedPin's mode to output and initial level to High(3.3v)
        for i in pins:
            GPIO.setup(pins[i], GPIO.OUT, initial=GPIO.HIGH)

        p_R = GPIO.PWM(pins['Red'], 2000)
        p_G = GPIO.PWM(pins['Green'], 2000)
        p_B = GPIO.PWM(pins['Blue'], 2000)
        p_R.start(0)
        p_G.start(0)
        p_B.start(0)

    # Define a MAP function for mapping values.  Like from 0~255 to 0~100
    def MAP(x, in_min, in_max, out_min, out_max):
        return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

    # Define a function to set up colors
    def setColor(color):
    # configures the three LEDs' luminance with the inputted color value.
        R_val = (color & 0xFF0000) >> 16
        G_val = (color & 0x00FF00) >> 8
        B_val = (color & 0x0000FF) >> 0

        # Map color value from 0~255 to 0~100
        R_val = MAP(R_val, 0, 255, 0, 100)
        G_val = MAP(G_val, 0, 255, 0, 100)
        B_val = MAP(B_val, 0, 255, 0, 100)
        
        # Change the colors
        p_R.ChangeDutyCycle(R_val)
        p_G.ChangeDutyCycle(G_val)
        p_B.ChangeDutyCycle(B_val)

        print ("color_msg: R_val = %s,  G_val = %s, B_val = %s"%(R_val, G_val, B_val))  

    def main():
        while True:
            for color in COLOR:
                setColor(color)# change the color of the RGB LED
                time.sleep(0.5)

    def destroy():
        # Stop all pwm channel
        p_R.stop()
        p_G.stop()
        p_B.stop()
        # Release resource
        GPIO.cleanup()

    if __name__ == '__main__':
        setup()
        try:
            main()
        except KeyboardInterrupt:
            destroy()

**Explication du code**

.. code-block:: python

    p_R = GPIO.PWM(pins['Red'], 2000)
    p_G = GPIO.PWM(pins['Green'], 2000)
    p_B = GPIO.PWM(pins['Blue'], 2000)

    p_R.start(0)
    p_G.start(0)
    p_B.start(0)

Appelez la fonction ``GPIO.PWM()`` pour définir les broches PWM pour le rouge, le vert et 
le bleu et régler la fréquence des broches PWM à 2000Hz, puis utilisez la fonction ``Start()`` 
pour régler le cycle de service initial à zéro.

.. code-block:: python

    def MAP(x, in_min, in_max, out_min, out_max):
        return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

Définissez une fonction MAP pour mapper les valeurs. Par exemple, x=50, in_min=0, in_max=255, 
out_min=0, out_max=100. Après le mappage de la fonction map, elle renvoie ``(50-0) * (100-0)/(255-0) +0=19.6``, 
ce qui signifie que 50 dans 0-255 équivaut à 19,6 dans 0-100.

.. code-block:: python

    def setColor(color):
        R_val = (color & 0xFF0000) >> 16
        G_val = (color & 0x00FF00) >> 8
        B_val = (color & 0x0000FF) >> 0

Configurez la luminance des trois LEDs avec la valeur de couleur entrée, attribuez les deux 
premières valeurs de l'hexadécimal à R_val, les deux valeurs du milieu à G_val, les deux dernières 
valeurs à B_val. Par exemple, si color=0xFF00FF, R_val=（0xFF00FF & 0xFF0000）>> 16 = 0xFF, 
G_val = 0x00, B_val=0xFF.

.. code-block:: python

    R_val = MAP(R_val, 0, 255, 0, 100)
    G_val = MAP(G_val, 0, 255, 0, 100)
    B_val = MAP(B_val, 0, 255, 0, 100)

Utilisez la fonction map pour mapper les valeurs R,G,B entre 0 et 255 dans la plage de cycle de service PWM de 0 à 100.

.. code-block:: python

    p_R.ChangeDutyCycle(R_val) 
    p_G.ChangeDutyCycle(G_val)
    p_B.ChangeDutyCycle(B_val)

Attribuez la valeur du cycle de service mappée au canal PWM correspondant pour modifier la luminance.

.. code-block:: python

    for color in COLOR:
        setColor(color)
        time.sleep(0.5)

Attribuez chaque élément de la liste COLOR à la couleur respectivement et changez la couleur de la LED RVB via la fonction ``setColor()``.

Photo du phénomène
------------------------

.. image:: ../img/image62.jpeg
