LEDの並列接続と制限抵抗

 先日、2年ぶりにラズパイと電子工作キットを取り出し、初めからお勉強を再開しました。
 エルチカを実施してから、数日経過しましたが、まだそのエルチカ(LEDを光らせよう!)の部分を深堀中です。

 なお、アマゾンのブラックフライデーで、電子部品のスペックを調べるテスターを購入しました。
 40代になると、抵抗の帯の色を識別するのが難しいです。
 (中華の安物なのか、妙に細い色線で厳しい)

 で、そのテスターでLEDを調べると、順方向電圧というのが表示されまして、そこから色々と深堀中です。

順方向電圧

 電子部品セットとかに含まれている一般的な赤色LEDは、1.9vあたり。緑や青色は2.5vあたり。
 色によって、この数字が変わるのがポイントですね。
 
 で、テスターで調べたら、フルカラーLED(4本足のRGB LED)に関しても、赤、緑、青でそれぞれ違う順方向電圧でした。

制限抵抗

 初心者向けのラズパイ電子工作の本には、LEDに過電流を流さないために100Ω程度の抵抗を直列につなげる必要があると書いているのですが、その根拠がいまいち分かりませんでした。
 
 私なりの解釈ですが、
 LEDは限りなく抵抗値が0。なので、そのまま流すと過電流になり、壊れる。
 LEDにかかる電圧ははぼ一定。(赤1.9v 青2.5v等)
 ラズパイの出力電圧は3.3v。
 LED1個、抵抗1個を直列につなげた際の、抵抗にかかる電圧は赤色なら、3.3-1.9=1.4v
 一般的なLEDは、5mA流せば十分に明るい。そして実用的な最大許容範囲は30mAあたり。

 よって、
 LEDに5mA流すには、1.4v ÷ 0.005A = 280Ω
 LEDに10mA流すには、1.4v ÷ 0.010A = 140Ω

 100Ωの時は、1.4v ÷ 100Ω = 0.014A = 14mA

 なので、大体の電子工作の本で、エルチカに使われる制限抵抗が100~200Ωというのは、理解できました。

LEDの直列回路と並列回路

 一般的な赤色LEDの順方向電圧が1.9vのため、直列で3本つなげると5.7v必要になるため、ラズパイの3.3v電圧では、おそらく点灯しないか暗くなる。
で、並列回路で点灯するような回路になりますが、

 なぜか、初心者向けの電子工作の本では、いちいちすべてのLEDに制限抵抗がついています。
 なので、10個点灯させようとすると、抵抗も10個必要となるのですが、

 これって、電源の直近に1個抵抗を置いて、そこから並列に分配すればいいのでは?

 という、疑問というか、抵抗をいちいち数通り用意するのがメンドイ^^;、ので抵抗1個で実践したのが冒頭の動画です。

 結果として、同じ色(同じ順方向電圧)のLEDなら、抵抗1個で並列に同時3点灯できましたが、違う色のLEDが混ざると、一番順方向電圧の低い赤色のLEDしか点灯しないという結果になりました。

 こうやって、実践すると、妙に納得できます。
 電子工作の楽しさですね!

制限抵抗はアノード、カソードどちら側に置いても大丈夫

GPIOにつなげる向きも、どちらに置いても大丈夫

 制限抵抗は、プラス電源とLEDのアノードの間に入れているのを紹介している本が多いですが、カソードとマイナス電源側に置いても同じように点灯しました。
 基本的にはどちらでも問題ないのですが、電源+側に置くほうが、部品がショートした際の被害が抑えられるというのが理由みたいです。

 ラズパイの3.3v出力ピンから3.3vを出して、LEDを点灯し、制御GPIOピンをマイナス(Low)にして流す回路も、
 ラズパイの制御GPIOピンから3.3v(High)を出して、LEDを点灯し、GPIOのGNDピンに流すという回路も、

 同様の結果となりました。
 特に、動画の最後のように、ラズパイの3つの制御GPIOピンから3.3v(High)を出せば、制限抵抗は1個で済むのでは?と思いましたが、これも同じ結果(同時に流すと、赤色しか点灯しない)になったのは、ちょっと意外でした。
 これを踏まえると、何種類かの出力をする際は、各出力に制限抵抗を入れておかないと、狙った動きをしないということですかね。

 エルチカひとつとっても、奥が深いです。

使用プログラム(Python)

 私の覚書用です。
 「一つずつ点灯、消灯」。「一つずつ点灯し、3つ同時に点灯後に3つ消灯」
 の部分をコピペして流用したので、プログラムの説明部分が一緒ですが、気にしないで!

#ラズパイのGPIOを制御するために、Rpi.GPIOライブラリーを読み出し
import RPi.GPIO as GPIO
#時間に関する制御をするために、time関数を読み出し
import time

#使用するLEDのGPIO番号(セットモードはBCM)(物理ピン番号はBOARD)
LedPin1 = 17
LedPin2 = 27
LedPin3 = 22

#初期設定 setup()関数の定義
def setup():
    #立ち上がり時のGPIOのエラーメッセージを非表示
    GPIO.setwarnings(False)
    #GPIOのピン番号指定方法(通常はGPIO番号 BCM)(物理ピン番号での指定は BOARD)
    GPIO.setmode(GPIO.BCM)
    #使用するGPIOピンを入力(IN)で使用するのか、出力(OUT 3.3v)で使用するのかの設定
    #initialは初期の状態 1=GPIO.HIGH=True
    #初期設定がHighなのは、LEDのカソード(ー)をGPIOに繋げるため
    GPIO.setup(LedPin1,GPIO.OUT,initial=1)
    GPIO.setup(LedPin2,GPIO.OUT,initial=1)
    GPIO.setup(LedPin3,GPIO.OUT,initial=1)
 
#メインプログラム main()関数の定義
def main():
    #1番目 LED ON 0.5秒点灯
    print('LED1 ON')
    GPIO.output(LedPin1,GPIO.LOW)
    time.sleep(0.5)
 
    #2番目 LED ON 0.5秒点灯
    print('LED2 ON')
    GPIO.output(LedPin1,GPIO.HIGH)
    GPIO.output(LedPin2,GPIO.LOW)
    time.sleep(0.5)
 
    #3番目 LED ON 0.5秒点灯
    print('LED3 ON')
    GPIO.output(LedPin2,GPIO.HIGH)
    GPIO.output(LedPin3,GPIO.LOW)
    time.sleep(0.5)

    #LED OFF 0.5秒消灯
    print('LED OFF')
    GPIO.output(LedPin3,GPIO.HIGH)
    time.sleep(0.5)

#1番目 LED ON 0.5秒点灯
    print('LED1 ON')
    GPIO.output(LedPin1,GPIO.LOW)
    time.sleep(0.5)
 
    #2番目 LED ON 0.5秒点灯
    print('LED2 ON')
    GPIO.output(LedPin2,GPIO.LOW)
    time.sleep(0.5)
 
    #3番目 LED ON 0.5秒点灯
    print('LED3 ON')
    GPIO.output(LedPin3,GPIO.LOW)
    time.sleep(0.5)

    #LED OFF 0.5秒消灯
    print('LED OFF')
    GPIO.output(LedPin1,GPIO.HIGH)
    GPIO.output(LedPin2,GPIO.HIGH)
    GPIO.output(LedPin3,GPIO.HIGH)
    time.sleep(0.5)

#エンディングプログラム destroy()関数の定義
def destroy():
    #LED OFF
    GPIO.output(LedPin1,GPIO.HIGH)
    GPIO.output(LedPin2,GPIO.HIGH)
    GPIO.output(LedPin3,GPIO.HIGH)
    #GPIOの初期化
    GPIO.cleanup()
    
#ここから実際の実行内容
n=5
setup()
while n>0:
    main()
    n=n-1
    print (n)

destroy()

コメント

タイトルとURLをコピーしました