フルカラーLEDを使ってみた(ソフト制御編)

フルカラーLEDを使ったみた(ハード制御編)」でフルカラーLEDを使って

7色(赤・緑・青・シアン・イエロー・マゼンタ・白)を発光させました。

ハード制御編ということで、色の明るさを抵抗値を用いて調整しました。

今回はソフト制御編です!

ラズベリーパイのGPIOを使って色彩を調整してみたいと思います!

色彩について

色のバリエーションはどれくらいある?

バリエーションは制御できるビット数によって異なります。

今回はRGBを8ビットずつ制御ができるpigpioを使用します。

pigpioを選んだ理由

Software PWMが比較的正確に使用できる

さて、RGBを8ビットずつ調整できるので合計24ビットの調整ができます。

表現できる色の数を計算すると、、、

24 bit = 2 ^ 24 =  16777216 (色)

つまり、約1677万の色を使うことができます!

 

参考:pigpio library

参考:Raspberry PiのGPIO制御の決定版 pigpio を試す

どうやって調光する?

(平均)電圧を変化させることで、色彩を変更できます。

実は、ハード側でも可変抵抗を用いて電圧を制御しておりました。

では、ソフト側でどのように(平均)電圧を制御するかというと、「PWM制御」です!!

参考:PWMとは | 東芝 半導体&ストレージ製品

PWMを含め、他にどのような変調方式があるかをざっと紹介します。

今回は、一番使いやすいSoftWare PWMというものを使用します。(SoftWare PWMの説明は省略)

用意するもの

ラズベリーパイ

Raspberry Pi 3 Model B+
created by Rinker

 

ブレッドボード

ブレッドボード
created by Rinker

 

ジャンパー線

ジャンパーワイヤ130pcs オス-オス forブレッドボード
created by Rinker

 

フルカラーLED(アノードコモン)

RGB 3色 LED モジュール
created by Rinker

 

抵抗

220Ω × 3個 (抵抗セットがお得です)

抵抗
created by Rinker

 

 

回路を設計しよう

配線の仕方は?

こんな感じになります。だいぶシンプルです。

抵抗値に関して、「フルカラーLEDを使ってみた」では光度の関係で

RGBそれぞれで異なる抵抗値にしていましたが、今回は同じ抵抗値で進めていきます。

またGPIOに関して、私はGPIO13,GPIO19,GPIO26を使用していますが、お好きなGPIOを選択してください。

RGBは同じ抵抗値でいいの?

結果的に問題ありません!

ただし、白色を調光した際にうまく白く再現できない可能性があります。

なぜかというと、ホワイトバランスと光度を計算されていないからです。

一例ですが、私のLEDの計算した電流量の比率は以下になります。(計算方法はこちら)

  = 6(mA) : 8(mA) : 4(mA) =  3 : 4 :  2

上記の比率を加味するとどう違うかを画像で比較します。

比率の設定なし 

比率を設定済

上の画像のほうがやや青みがかって見えると思います。(少しだけですが・・・)

ホワイトバランスも考えて、RGBの光度をPWMで制御していきます。

 

プログラムを作成しよう

ダイジェスト

実施する内容の手順を紹介します。

手順

1. 単色点灯

2. 複数色点灯

3. グラデーション点灯

 

単色点灯

単色点灯のソースコードは以下になります。(配置先はこちら)

[code lang="bash"]
#coding: UTF-8
import pigpio
import time
#RGBのポート番号の設定
GPIO_R = 13
GPIO_G = 26
GPIO_B = 19

def main():
    #ホワイトバランスの設定
    max_val = 255.0
    col = [max_val/ 4, max_val / 3, max_val / 2]

    #pigpioの初期化
    pi = pigpio.pi()

    #周波数の設定
    pi.set_PWM_frequency(GPIO_R,200)
    pi.set_PWM_frequency(GPIO_G,200)
    pi.set_PWM_frequency(GPIO_B,200)

    #PWMの設定("白"に設定)
    pi.set_PWM_dutycycle(GPIO_R,col[0])
    pi.set_PWM_dutycycle(GPIO_G,col[1])
    pi.set_PWM_dutycycle(GPIO_B,col[2])

if __name__ =='__main__':
    main()
[/code]

複数色点灯

複数色点灯のソースコードは以下になります。 (配置先はこちら)

[code lang="bash"]
#coding: UTF-8
import pigpio
import time
#RGBのポート番号の設定
GPIO_R = 13
GPIO_G = 26
GPIO_B = 19

def main():
    #ホワイトバランスの設定
    max_val = 255
    zero = (max_val-1)
    base_col = [max_val/3, max_val/4 , max_val/2]

    #色の定義
    red = [base_col[0],zero,zero]
    green = [zero,base_col[1],zero]
    blue = [zero,zero,base_col[2]]
    yellow = [base_col[0],base_col[1],zero]
    mazenta = [base_col[0],zero,base_col[2]]
    sian = [zero,base_col[1],base_col[2]]
    white = base_col

    #pigpioの設定
    pi = pigpio.pi()

    #周波数の設定
    pi.set_PWM_frequency(GPIO_R,200)
    pi.set_PWM_frequency(GPIO_G,200)
    pi.set_PWM_frequency(GPIO_B,200)

    #各色を2回分ループ
    for i in range(2):
        for col in [red,green,blue,yellow,mazenta,white]:
            #PWMの設定
            pi.set_PWM_dutycycle(GPIO_R,col[0])
            pi.set_PWM_dutycycle(GPIO_G,col[1])
            pi.set_PWM_dutycycle(GPIO_B,col[2])
            #スリープ
            time.sleep(1)

if __name__ =='__main__':
    main()
[/code]

グラデーション点灯

グラデーション点灯のソースコードは以下になります。(配置先はこちら)

[code lang="bash"]
#coding: UTF-8
import pigpio
import time

#RGBのポート番号の設定
GPIO_R = 13
GPIO_G = 26
GPIO_B = 19

#刻み幅の設定
STEP = 100

#スリープ時間の設定
SEC = 0.01

#pigpioの設定
pi = pigpio.pi()

def main():
    #ホワイトバランスの設定
    max_val = 255
    zero = (max_val-1)
    base_col = [max_val/3, max_val/4 , max_val/2]

    #色の定義
    red = [base_col[0],zero,zero]
    green = [zero,base_col[1],zero]
    blue = [zero,zero,base_col[2]]
    yellow = [base_col[0],base_col[1],zero]
    mazenta = [base_col[0],zero,base_col[2]]
    sian = [zero,base_col[1],base_col[2]]
    white = base_col

    #周波数の設定
    pi.set_PWM_frequency(GPIO_R,200)
    pi.set_PWM_frequency(GPIO_G,200)
    pi.set_PWM_frequency(GPIO_B,200)

    #PWMの設定(初期の色を"白"に設定)
    pi.set_PWM_dutycycle(GPIO_R,white[0])
    pi.set_PWM_dutycycle(GPIO_G,white[1])
    pi.set_PWM_dutycycle(GPIO_B,white[2])

    #グラデーション(赤→緑)
    change_color_gradation(red,green)
    #グラデーション(緑→赤)
    change_color_gradation(green,red)

#RGBごとの刻み幅の算出
def get_rgb_incriment(col1,col2):
    rgb_inc = []
    for i in range(3):
        rgb_inc.append(float(col2[i] - col1[i])/STEP)
    return rgb_inc

#col1からcol2へ徐々に色を変更
def change_color_gradation(col1,col2):
    #刻み幅の算出
    rgb_inc = get_rgb_incriment(col1, col2)
    for i in range(STEP):
        for color, GPIO in enumerate([GPIO_R,GPIO_G,GPIO_B]):
            #PWMの設定
            pi.set_PWM_dutycycle(GPIO,col1[color] + (i) * rgb_inc[color])
            #スリープ
            time.sleep(SEC)

if __name__ =='__main__':
    main()
[/code]

まとめ

● PIGPIOがすごく便利。ただ、デーモンを起動させるのが面倒

● PWMを使用すればハード側の制御に比べ、簡単に色を調光できる

● 理論的には1667万色調光できるはずだが、実際に目で判断できる色の種類は不明

2 thoughts on “フルカラーLEDを使ってみた(ソフト制御編)”
  1. 単色制御では白色だけですが、青色だけに光らせたい場合や黄色だけに光らせたい場合はコードはどのように書けばいいのでしょうか?
    defを使って他でimportできるようにしたいのですが,,,

  2. コメントありがとうございます。

    コードgitにアップしました。
    https://github.com/vascodagama0603/FullColorLED/blob/master/turn_on_selected_color.py

    【ポイント】
     ・列挙型を使用
       色を選ぶのに文字列(red,blue・・・)や数値(1,2・・・)のどちらか検討しましたが、
       引数の大文字小文字の入力間違いや数値の覚え違いが発生する可能性があります。
       列挙型ですと、使用する側は既定のメンバを使用するので比較的わかりやすいかと思います!

     ・照明時間を追加

    不明点がありましたら、引き続きコメントでお知らせくださいませ!

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA