【Lesson6】RGBフルカラーLEDをPWM制御でコントロール!Controlling an RGB LED with PWM

0
2479

今回はフルカラーLEDの色をR(赤)G(緑)B(青)の3原色でコントロールするプログラムを実行します。PWM制御でRGB3つの色をコントロールすることで、さまざまな色を作り出すことができます。PWMで出力することによりアナログ値のように徐々に明るさを変化させることができます。PWM制御についての詳細はLesson5をご覧ください。

使用する部品

  • Raspberry Pi 3 Model B × 1
  • 電源アダプター5V 2.5A × 1
  • ブレットボード × 1
  • フルカラーLED × 1
  • 抵抗 220Ω × 3
  • ジャンプワイヤー(オス/オス) × 4

※これらの部品はFabshopがふるさと納税で提供している「ふるさと納税Raspberry Piスターターキット」もしくは当サイトで購入可能な「Raspberry Pi スターターキット」の電子工作キットに同梱されています。

実体配線図

コモンノードRGB LEDは3つのLEDがくっついただけ!

Lesson5では1つのLEDをPWMで光らない状態から徐々に明るくなり、また暗くなっていくというアナログのような光の調整を行いました。実はRGBコモンノードLEDはこれら3つのRed(赤)、Green(緑)、Blue(青)がくっついて、その色の強さで光が混じりフルカラーを再現しているLEDです。今回利用するLEDはアノードコモンとなっているため、一番長い脚が「アノード(+側)」になっていて、ほかそれぞれR、G、Bのカソードになっています。

プログラムのコピーと保存

画面左上のラズベリーパイメニューから「プログラミング」-「Geany」を開きます。

メニューバーから「ファイル」→「新規」をクリックします。

【Lessoon1】のときと同じように、この下にある「Controlling an RGB LED with PWMのプログラム」の枠右上に並んだアイコンの内、右から2番目のアイコンをクリックします。(マウスをアイコンに近づけると”Copy”の表示が現れます)

すると、プログラムの文字列が全て選択されるので、「Ctrl」と「C」キーを同時に押してコピーします。

import RPi.GPIO as GPIO
import time

colors = [0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF]
pins = {'pin_R':11, 'pin_G':12, 'pin_B':13}

GPIO.setmode(GPIO.BOARD)
for i in pins:
    GPIO.setup(pins[i], GPIO.OUT)
    GPIO.output(pins[i], GPIO.HIGH)  

p_R = GPIO.PWM(pins['pin_R'], 2000)
p_G = GPIO.PWM(pins['pin_G'], 2000)
p_B = GPIO.PWM(pins['pin_B'], 5000)

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

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

def setColor(col):
    R_val = (col & 0x110000) >> 16 
    G_val = (col & 0x001100) >> 8
    B_val = (col & 0x000011) >> 0

    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)

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

try:
    while True:
        for col in colors:
            setColor(col)
            time.sleep(0.5)
except KeyboardInterrupt:
    p_R.stop()
    p_G.stop()
    p_B.stop()
    for i in pins:
        GPIO.output(pins[i], GPIO.HIGH)
    GPIO.cleanup()

プログラム解説

3つのLEDを扱うようなものですので、ソースコードも多くなっています。もう少し簡略化もできますが、ここはあえて単純なコードにして分かりやすくしています。

まず変数の部分ですが、colors には複数の色の情報がはいっています。このように[]で囲ってcolorsという変数に6つの文字列をカンマで区切ってまとめて管理することができます。次のpinsについてはpin_R:11 という風にpin_Rと11を1つの対にして辞書型として使っています。辞書型は{}で囲みキーと値は「:」で組み合わせます。

このようにすることで、GPIO.setupなどは同じことの繰り返しを3回書かなければならなかったのを、for文を使って1セットつくれば、あと3つのpinの設定も完了していまいます。for i in pins というのは、iが「0」から始まってpins変数内のすべての値が終わるまで繰り返すという意味になっています。

次にそれぞれの出力ポートに対してPWMの値を決めていきます。

p_R = GPIO.PWM(pins[‘pin_R’] , 2000)となっていますが、変数値pins[‘pin_R’]は11という事になりますので、R(レッド)のポートは11番を使って2000Hzの周波数で動作させる設定という事になります。同様に、グリーン、ブルーのポートも設定します。

p_R.star(0) の部分ではディーティー比をいくつから始めるかという部分です。

def map の部分ではmap関数を作ってPWMの入力の値と出力の値の範囲を変換して数値を合わせている部分です。

def setColor 関数では色のパターンを作る関数です。色は16進数で表されているためFF0000 は赤など、それぞれ色の設定がcolors変数にリストとして入っていますので、プログラム本文ではその値をfor文で順次入れていく事で色を変化させています。

新たに開いたタブ「untitled×」の1行目にマウスカーソルを置いて右クリックして出てくるメニューから「貼り付け」を選択します。

Geanyのメニューバーから「ファイル」→「別名で保存」をクリックします。

新たに「ファイルを保存」画面が現れるので、左ペインの「デスクトップ」をクリックします。

「ファイルを保存」画面の1番上の項目「名前:」の入力欄に拡張子”.py”でプログラム名を入力し、「保存」ボタンをクリックします。

プログラムの実行

Geanyの画面に戻って、ツールバーの紙飛行機のようなアイコンをクリックします。

新たに「ターミナル」画面が開き、フルカラーLEDの色が刻々と変化します。「Ctrl」と「C」キーを同時に押すとプログラムが停止します。