ラズパイで半固定抵抗3つ使って(RGB)フルカラーLEDを点灯させる | そう備忘録

ラズパイで半固定抵抗3つ使って(RGB)フルカラーLEDを点灯させる

フルカラーLED

Raspberry Pi 3 B+で半固定抵抗3つを使ってフルカラーLEDを点灯させるプログラムを作成した時の備忘録。

フルカラーLEDの点灯

フルカラーLEDは赤、青、緑の光の三原色を内蔵したLEDで3色の光の強さを別々に調整することが出来るLEDだ。

下記の写真は秋月電子の製品(RGBフルカラーLED 5mm OSTA5131A)。

フルカラーLEDと光拡散キャップ

この製品のコネクタは左から、

  1. 緑(+)
  2. 青(+)
  3. 共通カソード(GNDへ接続)
  4. 赤(+)

になっている。

しかし製品によっては色の順番が異なっていたりアノード(+)が共通の製品もあるのでデータシートを確認した方が良い。

光拡散キャップは被せると光が拡散してきれいに見える効果がある。

主なパーツ

使用している主なパーツは以下の通り。

フルカラーLED

前述のRGBフルカラーLED。

抵抗

330Ωの抵抗を3つ。

GPIOの出力をそのままLEDに接続すると電流が流れすぎてしまうので330Ωの抵抗をつけている。

電流の抵抗の計算の仕方は以前の記事を参照

半固定抵抗

つまみを回すことにより抵抗値を変えることが出来るパーツ。

分圧抵抗を利用して電圧を変えている。

分圧抵抗については以前の記事を参照

ADコンバーター

半固定抵抗からの電圧のアナログ値からデジタル値に変換する。

ラズパイはアナログ値を直接扱えないのでADコンバーターでデジタル値に変換する必要があるのでMCP3208を使っている。

その他にラズパイ本体やブレッドボード等については以前の記事の「必要なモノ」を参照して欲しい。

回路図

ラズパイと半固定抵抗、MCP3208、フルカラーLEDは以下の様に接続している。

フルカラーLEDの回路図

3つ並んでいる半固定抵抗のつまみを回すことにより(時計回りで光が強くなる)それぞれ3色の光の強さを別々に調整する事ができる。

つまみは左から、

の順番になっている。

半固定抵抗のつまみを回すことにより抵抗値が変わりADコンバーターのチャンネル0~2に出力される電圧が0V~3.3Vの範囲で変わる。(電圧が変わる仕組みついては以前の記事の抵抗の分圧計算式を参照

プログラムではADコンバーターより0(0V)~4095(3.3V)の範囲で値を受け取ってPWM(Pulse Width Modulation)でそれぞれの色のGPIOに0~100のデューティー比で出力して光の強さを変更する。

デューティー比についての詳細はこちらの記事を参照して欲しい。

参考書籍

回路図は金丸隆志さんの「Raspberry Piで学ぶ電子工作」を参考にさせて貰った。

2018年に初めてラズパイを触った時に購入した書籍で秋月電子通商の「Raspberry Piで学ぶ電子工作 パーツセット」と一緒に購入して書籍に書かれている事は一通り試してみた。

基本的な事からちょっとした応用まで細かく丁寧に書かれているのでとてもありがたく思っている。

尚、上記の書籍はRaspberry Pi 3をベースに書かれている。

ラズパイ4対応の書籍も出版されていたので一緒に載せておく。

事前準備

プログラムの実行前にラズパイの設定画面のインターフェースタブにてspiを有効にした後、spidev(Pythonからspiを制御するライブラリー)をインストールする。

spiの有効化の方法とspidevのインストールの方法については以前の記事を参照して欲しい。

プログラム

ソースコード

# -*- coding: utf-8 -*-
"""
Created on Sun Aug  9 21:05:02 2020

@author: Souichirou Kikuchi
"""

import spidev
import RPi.GPIO as GPIO
from time import sleep

CHN_GREEN = 0 # Green接続チャンネル
CHN_BLUE = 1 # Blue接続チャンネル
CHN_RED = 2 # Red接続チャンネル
LED_GREEN = 25 # LED緑用GPIO
LED_BLUE = 24 # LED青用GPIO
LED_RED = 23 # LED赤用GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_GREEN, GPIO.OUT)
GPIO.setup(LED_BLUE, GPIO.OUT)
GPIO.setup(LED_RED, GPIO.OUT)
pwm_green = GPIO.PWM(LED_GREEN, 50)  # 周波数50Hz
pwm_blue = GPIO.PWM(LED_BLUE, 50)  # 周波数50Hz
pwm_red = GPIO.PWM(LED_RED, 50)  # 周波数50Hz
pwm_green.start(0)
pwm_blue.start(0)
pwm_red.start(0)

spi = spidev.SpiDev()
spi.open(0, 0) # 0:SPI0、0:CE0
spi.max_speed_hz = 1000000 # 1MHz SPIのバージョンアップによりこの指定をしないと動かない

def get_data(channel):
    dout = spi.xfer2([((0b1000+channel)>>2)+0b100,((0b1000+channel)&0b0011)<<6,0]) # Din(RasPi→MCP3208)を指定
    bit12 = ((dout[1]&0b1111) << 8) + dout[2] # Dout(MCP3208→RasPi)から12ビットを取り出す
    return float(bit12) # 0~4095

try:
    print('--- start program ---')
    while True:
        val_green = get_data(CHN_GREEN)
        val_blue = get_data(CHN_BLUE)
        val_red = get_data(CHN_RED)
        print('val_green= ',val_green)
        print('val_blue= ',val_blue)
        print('val_red= ',val_red)
        duty_green = val_green * 100 / 4095
        duty_blue = val_blue * 100 / 4095
        duty_red = val_red * 100 / 4095
        pwm_green.ChangeDutyCycle(duty_green)
        pwm_blue.ChangeDutyCycle(duty_blue)
        pwm_red.ChangeDutyCycle(duty_red)
        sleep(0.2)
except KeyboardInterrupt:
    pass
finally:
    pwm_green.stop()
    pwm_blue.stop()
    pwm_red.stop()
    spi.close()
    GPIO.cleanup()
    print('--- stop program ---')

補足説明

定数の定義

12~17行目で定数を定義している。

CHN_GREEN、BLUE、REDはそれぞれADコンバーター(MCP3208)への接続チャンネルを表している。

LED_GREEN、BLUE、REDはそれぞれの色を制御するGPIO番号を表している。

PWM

23~28行目はPWM(Pulse Width Modulation)の設定。

それぞれの色の光の強さをパルスに変換してデューティー比で制御する。

PWMの説明については以前の記事のPWMの説明を参照して欲しい。

データ取得関数

34~37行目はADコンバーター(MCP3208)からの値を取得する関数だ。

接続チャンネル(0~2)毎にDinを送って12ビットのDoutを受け取っている。

MCP3208からのデータの取得についての詳細は以前のこちらの記事を参照して欲しい。

メイン処理

42~54行目がメインの処理。

0.2秒間隔でWhileループを回しながらget_data関数を呼び出してADコンバーターからの値を読み取っている。

0~4095の値を0~100のデューティー比に変換してそれぞれの色のGPIOにChangeDutyCycleメソッドで出力して緑・青・赤の光の強さを変えている。

動画

実際にフルカラーLEDを光らせている時の様子。

肉眼と比べて映像だと色の違いが分かりづらいが半固定抵抗のつまみの左から緑、青、赤の色調整となっている。

以上で今回の記事は終了とする。

最後に

この記事が何処かで誰かの役に立つことを願っている。

尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。