2.4 カラフルな光¶
我々が知っているように、光は重ね合わせることができます。例えば、青い光と緑の光を混ぜるとシアン色の光が生まれ、赤い光と緑の光を混ぜると黄色の光が生まれます。 これを「加法混色」と呼びます。
この方法に基づいて、三原色を用いて、異なる比重に応じて任意の色の可視光を混合することができます。例えば、オレンジ色は赤色を多く、緑色を少なくして作ることができます。
この章では、RGB LEDを用いて加法混色の神秘を探求します!
RGB LEDは、赤いLED、緑のLED、青いLEDを一つのランプキャップの下に封入し、三つのLEDは一つのカソードピンを共有しています。 各アノードピンに電気信号が供給されるため、対応する色の光が表示されます。各アノードの電気信号強度を変更することで、さまざまな色を生成することができます。
必要なコンポーネント
このプロジェクトでは、以下のコンポーネントが必要です。
一式をまとめて購入するのは非常に便利です。リンクはこちら:
名称 |
このキットに含まれるアイテム |
リンク |
---|---|---|
ケプラーキット |
450+ |
以下のリンクから個別に購入することも可能です。
SN |
コンポーネント |
個数 |
リンク |
---|---|---|---|
1 |
1 |
||
2 |
マイクロUSBケーブル |
1 |
|
3 |
1 |
||
4 |
数本 |
||
5 |
3(1-330Ω, 2-220Ω) |
||
6 |
1 |
回路図
PWMピンのGP13、GP14、およびGP15は、RGB LEDの赤、緑、青のピンをそれぞれ制御します。共通のカソードピンはGNDに接続されます。これにより、RGB LEDは異なるPWM値でこれらのピンに光を加算することで、特定の色を表示できます。
配線
RGB LEDには4つのピンがあります:一番長いピンは共通のカソードピンで、通常はGNDに接続されます。この長いピンの隣にある左側のピンが赤で、右側にある2つのピンは緑と青です。
コード
注釈
kepler-kit-main/micropython
ディレクトリ内の2.4_colorful_light.py
ファイルを開くか、このコードをThonnyにコピペして、「Run Current Script」をクリック、またはF5キーを押して実行します。右下角にある「MicroPython(Raspberry Pi Pico)」インタープリターをクリックして選択してください。
詳細なチュートリアルは、 コードを直接開いて実行する を参照してください。
import machine
import utime
red = machine.PWM(machine.Pin(13))
green = machine.PWM(machine.Pin(14))
blue = machine.PWM(machine.Pin(15))
red.freq(1000)
green.freq(1000)
blue.freq(1000)
def interval_mapping(x, in_min, in_max, out_min, out_max):
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
def color_to_duty(rgb_value):
rgb_value = int(interval_mapping(rgb_value, 0, 255, 0, 65535))
return rgb_value
def color_set(red_value, green_value, blue_value):
red.duty_u16(color_to_duty(red_value))
green.duty_u16(color_to_duty(green_value))
blue.duty_u16(color_to_duty(blue_value))
color_set(255, 128, 0)
こちらでは、描画ソフト(例:ペイント)で好みの色を選び、RGB LEDでその色を表示できます。
color_set()
関数にRGB値を入力すると、選択した色でRGB LEDが点灯します。
仕組みについて
三原色を統合して機能するように、 color_set()
関数を定義しています。
現在、コンピュータのハードウェアピクセルは通常24ビットで表現されます。各基本色は8ビットに分けられ、色値は0から255までです。0を含めて各基本色に256の可能な組み合わせがあります。よって、256 x 256 x 256 = 16,777,216色が可能です。
color_set()
関数も24ビット表記を使用しているため、色の選択が容易です。
そして、 duty_u16()
の値域が0〜65535であるため、PWMを通じてRGB LEDに信号を出力する際には、 color_to_duty()
と interval_mapping()
関数を用いて色値をduty値にマッピングしています。