.. note:: 

    こんにちは、FacebookのSunFounder Raspberry Pi & Arduino & ESP32愛好者コミュニティへようこそ！Raspberry Pi、Arduino、ESP32について、他の愛好者と一緒に深く学びましょう。

    **参加する理由**

    - **専門家のサポート**: 購入後の問題や技術的な課題を、コミュニティやチームのサポートを受けて解決できます。
    - **学び・共有**: ヒントやチュートリアルを交換して、スキルを向上させましょう。
    - **限定プレビュー**: 新製品の発表や先行公開情報をいち早く手に入れましょう。
    - **特別割引**: 新製品に対する特別割引を楽しめます。
    - **祝祭キャンペーンやプレゼント**: プレゼントキャンペーンやシーズンプロモーションに参加できます。

    👉 一緒に探求し、創造的な活動をしてみませんか？[|link_sf_facebook|]をクリックして、今すぐ参加しましょう！

.. _py_rgb:

2.4 色とりどりの光
====================

このレッスンでは、Raspberry Pi Pico 2を使用して、RGB LEDでさまざまな色を作成する方法を学びます。赤、緑、青の各成分の強度を調整することで、光を混ぜて幅広い色を作り出すことができます。この概念は、加法混色の方法に基づいています。

**加法混色とは？**

加法混色は、異なる色の光を組み合わせて新しい色を作り出す方法です。赤、緑、青の光をさまざまな強度で組み合わせると、目に見える色の範囲内でどんな色でも作り出すことができます。例えば：

* **赤 + 緑 = 黄**
* **赤 + 青 = マゼンタ**
* **緑 + 青 = シアン**
* **赤 + 緑 + 青 = 白**

|img_rgb_mix|

**必要なもの**

このプロジェクトには、以下のコンポーネントが必要です。

キットを購入するのが便利です。こちらのリンクからご覧いただけます：

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

    *   - 名前	
        - このキットに含まれるアイテム
        - リンク
    *   - Newton Lab Kit	
        - 450+
        - |link_newton_lab_kit|


個別に購入することもできます。以下のリンクからご覧ください。

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

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

    *   - 1
        - :ref:`cpn_pico_2`
        - 1
        - |link_pico2_buy|
    *   - 2
        - Micro USBケーブル
        - 1
        - 
    *   - 3
        - :ref:`cpn_breadboard`
        - 1
        - |link_breadboard_buy|
    *   - 4
        - :ref:`cpn_wire`
        - 複数
        - |link_wires_buy|
    *   - 5
        - :ref:`cpn_resistor`
        - 3(1-330Ω, 2-220Ω)
        - |link_resistor_buy|
    *   - 6
        - :ref:`cpn_rgb`
        - 1
        - |link_rgb_led_buy|


**回路図**

|sch_rgb|

PWMピンのGP13、GP14、GP15はそれぞれRGB LEDの赤、緑、青のピンを制御し、共通カソードピンはGNDに接続します。これにより、RGB LEDは異なるPWM値でこれらのピンに光を重ね合わせることで、特定の色を表示します。


**配線図**

|img_rgb_pin|

RGB LEDには4つのピンがあります。長いピンが共通カソードピンで、通常はGNDに接続されます。最も長いピンの隣の左側のピンが赤、右側の2つのピンが緑と青です。

赤いLEDは他の色のLEDよりも明るいため、同じ電流で動作させるために高めの抵抗を使用します。

|wiring_rgb|

**コードの作成**

PWM（パルス幅変調）を使用して、各色の強度を制御するMicroPythonプログラムを書き、さまざまな色を作成します。

.. note::

    * ``newton-lab-kit/micropython`` から ``2.4_colorful_light.py`` を開くか、コードをThonnyにコピーして、「実行」ボタンをクリックするか、F5キーを押して実行します。
    * 正しいインタープリターが選択されていることを確認してください：MicroPython (Raspberry Pi Pico).COMxx。

.. code-block:: python

    import machine
    import utime

    # 赤、緑、青のピン用にPWMを初期化
    red = machine.PWM(machine.Pin(13))
    green = machine.PWM(machine.Pin(14))
    blue = machine.PWM(machine.Pin(15))

    # PWMの周波数を設定
    red.freq(1000)
    green.freq(1000)
    blue.freq(1000)

    def map_value(x, in_min, in_max, out_min, out_max):
        # 値をある範囲から別の範囲にマッピング
        return int((x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)

    def set_color(r, g, b):
        # デューティサイクルを調整して色を設定
        red.duty_u16(map_value(r, 0, 255, 0, 65535))
        green.duty_u16(map_value(g, 0, 255, 0, 65535))
        blue.duty_u16(map_value(b, 0, 255, 0, 65535))

    # 例：色をオレンジに設定
    set_color(255, 165, 0)

コードを実行すると、RGB LEDがオレンジ色の光を発します。

**コードの理解**

#. ライブラリのインポート：

   * ``machine``: ハードウェア固有の機能を使用するため。
   * ``utime``: 時間関連の機能（この例では使いませんが、アニメーションに役立ちます）。

#. PWMオブジェクトの初期化：

   * 赤、緑、青の各ピンにPWMオブジェクトを作成し、すべての色に対してPWM周波数を1000Hzに設定します。

   .. code-block:: python

        # 赤、緑、青のピン用にPWMを初期化
        red = machine.PWM(machine.Pin(13))
        green = machine.PWM(machine.Pin(14))
        blue = machine.PWM(machine.Pin(15))

        # PWMの周波数を設定
        red.freq(1000)
        green.freq(1000)
        blue.freq(1000)

#. ``map_value`` 関数の定義：

   * ``duty_u16`` メソッドは0から65535の範囲の値を受け取るため、色の値は通常0から255の範囲であるため、0-255の範囲を0-65535にマッピングする必要があります。
   * ``map_value`` 関数は入力値を適切にスケーリングします。

   .. code-block:: python

        def map_value(x, in_min, in_max, out_min, out_max):
            # 値をある範囲から別の範囲にマッピング
            return int((x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)

#. ``set_color`` 関数の定義：

   この関数はRGB値（各0から255）を受け取り、マッピング後に各色チャネルのデューティサイクルを設定します。

   .. code-block:: python

        def set_color(r, g, b):
            # デューティサイクルを調整して色を設定
            red.duty_u16(map_value(r, 0, 255, 0, 65535))
            green.duty_u16(map_value(g, 0, 255, 0, 65535))
            blue.duty_u16(map_value(b, 0, 255, 0, 65535))
    
#. 希望の色を設定：

   ``set_color(255, 165, 0)`` を呼び出して、RGB LEDをオレンジ色に設定します。値を変更することで、任意のRGB色に変更できます。

**例：色のサイクリング**

コードを改善して、さまざまな色を循環させてみましょう。

#. 色ごとのRGB値を調べるには、グラフィックソフトウェアやオンラインのカラーピッカーを使用できます。例えば：

   * 赤： (255, 0, 0)
   * 緑： (0, 255, 0)
   * 青： (0, 0, 255)
   * 白： (255, 255, 255)
   * 紫： (128, 0, 128)

#. コードを作成します。

   色を表すRGBのタプルのリストを定義し、 ``while True`` ループで各色を順番に設定して1秒間隔で次の色に切り替えます。

   .. code-block:: python
       
       import machine
       import utime
       
       # 赤、緑、青のピン用にPWMを初期化
       red = machine.PWM(machine.Pin(13))
       green = machine.PWM(machine.Pin(14))
       blue = machine.PWM(machine.Pin(15))
       
       # PWMの周波数を設定
       red.freq(1000)
       green.freq(1000)
       blue.freq(1000)
       
       def map_value(x, in_min, in_max, out_min, out_max):
           return int((x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)
       
       def set_color(r, g, b):
           red.duty_u16(map_value(r, 0, 255, 0, 65535))
           green.duty_u16(map_value(g, 0, 255, 0, 65535))
           blue.duty_u16(map_value(b, 0, 255, 0, 65535))
       
       # サイクリングする色のリスト
       colors = [
           (255, 0, 0),     # 赤
           (0, 255, 0),     # 緑
           (0, 0, 255),     # 青
           (255, 255, 0),   # 黄
           (0, 255, 255),   # シアン
           (255, 0, 255),   # マゼンタ
           (255, 255, 255)  # 白
       ]
       
       while True:
           for color in colors:
               set_color(*color)
               utime.sleep(1)

このコードを実行すると、RGB LEDが赤、緑、青、黄、シアン、マゼンタ、白の順に1秒ごとに色が切り替わります。


**結論**

RGB LEDの赤、緑、青の成分の強度をPWMで制御することで、さまざまな色を作り出すことができます。このプロジェクトは、加法混色の原則を実演し、マイコンを使ったカラフルな光のディスプレイを作るための基礎となります。


**参考文献**

* |link_mpython_pwm|
