ラズパイで半固定抵抗3つ使って(RGB)フルカラーLEDを点灯させる
Contents
フルカラーLED
Raspberry Pi 3 B+で半固定抵抗3つを使ってフルカラーLEDを点灯させるプログラムを作成した時の備忘録。
フルカラーLEDは赤、青、緑の光の三原色を内蔵したLEDで3色の光の強さを別々に調整することが出来るLEDだ。
下記の写真は秋月電子の製品(RGBフルカラーLED 5mm OSTA5131A)。
この製品のコネクタは左から、
- 緑(+)
- 青(+)
- 共通カソード(GNDへ接続)
- 赤(+)
になっている。
しかし製品によっては色の順番が異なっていたりアノード(+)が共通の製品もあるのでデータシートを確認した方が良い。
光拡散キャップは被せると光が拡散してきれいに見える効果がある。
主なパーツ
使用している主なパーツは以下の通り。
フルカラーLED
前述のRGBフルカラーLED。
抵抗
330Ωの抵抗を3つ。
GPIOの出力をそのままLEDに接続すると電流が流れすぎてしまうので330Ωの抵抗をつけている。
電流の抵抗の計算の仕方は以前の記事を参照。
半固定抵抗
つまみを回すことにより抵抗値を変えることが出来るパーツ。
分圧抵抗を利用して電圧を変えている。
分圧抵抗については以前の記事を参照。
ADコンバーター
半固定抵抗からの電圧のアナログ値からデジタル値に変換する。
ラズパイはアナログ値を直接扱えないのでADコンバーターでデジタル値に変換する必要があるのでMCP3208を使っている。
その他にラズパイ本体やブレッドボード等については以前の記事の「必要なモノ」を参照して欲しい。
回路図
ラズパイと半固定抵抗、MCP3208、フルカラー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のアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。
最近のコメント