先日、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()
コメント