🫖

Raspberry Pi PicoでLEDを点灯させる①(計算付き)

2024/02/04に公開

いわゆるLチカをいくつかの回路で試してみる。LEDを点滅させるのが最終目標ならば、ネットの情報を鵜呑みにすれば良いが、自分で回路を組むのなら抵抗の計算なども出来ななくてはならない。

前提条件

Raspberry Pi Picoについて

  • GPIOの電圧は3.3V、最大電流はデフォルトで4mA
  • 3V3なら電圧3.3Vで最大電流300mAまで供給可能。ただしもちろんon/off制御は不可

https://zenn.dev/ythk/articles/ythk-raspico-pins

LEDについて

今回使用したLEDは順電圧V_F= 2.0V、 順電流I_F= 30mAで、光度は8400mcdのものである。30mAを流すと直視出来ない程度に明るい。そして1mAでも十分な視認性がある。

https://akizukidenshi.com/catalog/g/g113707/

LEDの基本

  • アノードを高電位側、カソードを低電位側に接続する(電流がアルファベット順に、a→cへ流れる と覚えると良い)
  • 砲弾内部の接合部の大きい方がカソードである。足を切ってしまっても、一応識別はできる


LEDの回路記号と一般的な外見

GPIOから電源を供給する場合

GPIO16にLEDを接続して点灯させてみる[1]。LED側の都合で3.3Vをそのまま掛けるわけにはいかないし、GPIO側の都合で30mA流すわけにもいかない。そこで直列に抵抗を挟むことで、電圧と電流を調整する。LED側はオームの法則には従わないので、きっちりと計算するのは困難である。しかし一般的にV_F付近で電流が0からI_Fまで急激に増加するので、以下のように概算できる。大概の場合はこれで十分である[2]


回路図

計算方法

LEDに掛ける電圧を制御するのではなく、流す電流を制御するという考え方が良い。以下の手順で概算する。

  • LEDに流す電流Iを決める
  • 上記回路において、LEDにはV_Fが掛かっていると仮定する
  • するとオームの法則とキルヒホッフの法則の法則より、抵抗Rは以下の式を満たす
V_F + IR = 3.3 \qquad \Rightarrow \qquad R = \frac{3.3 - V_F}{I}

ここでI= 3mA、V_F= 2.0Vとすると、R=\frac{3.3-2.0}{0.003}= 433Ωとなる。ピッタリの抵抗はないので、安全のために少し大きめの470Ωを選ぶ。

実装


ブレッドボード上への実装

プログラム

from machine import Pin # GPIOを操作する「Pin」を使えるように 
from time import sleep  # 処理を一時中断する「sleep」を使えるように

led_pin = Pin(16, Pin.OUT)  # GPIO16を出力モードに
led_on = False

while True:
    led_pin.value(led_on) # LEDの点灯
    led_on = not led_on
    sleep(1)              # 1秒停止(点滅の速さ調整)

トランジスタを使う場合

4mA以上の電流を流したい場合は、GPIOからの給電では足りない。ここでは20mAほど流したい場合を考える。20mAなら3V3から余裕で給電できので、GPIOとトランジスタの組み合わせて点滅の制御をする。ここではNPN型のバイポーラ・ジャンクション・トランジスタ(BJT)(普通のトランジスタ)を使う[3]

NPN型のトランジスタの基本

NPN型のトランジスタの特徴は以下の通りである。

  • 通常はコレクタ(C)からエミッタ(E)へは電流が流れない。
  • ベース(B)に電流I_Bが流れると、CからEへ大きな電流I_Cが流せるようになる。
  • h_{EF} I_B<I_Cを満たすh_{FE} を直線電流増幅率といい、トランジスタごとに決まっている。
  • ベースーエミッタ間の電圧V_{BE}は0.7V程度である。


トランジスタの回路記号と一般的な外見

回路記号と実際の端子の出方が違うので、注意が必要である。さらにベースとエミッタが写真とは逆になっているものあるそうなので、データシートで確認すると良いだろう。

回路図

下図のR_1R_2を適切に選びたい。


回路図

計算方法

h_{EF}の値は個体ごとのばらつきが大きいが。今回使用した2SC1815-GRの場合は、h_{EF}=200\sim400とのこと。マイコンでトランジスタをスイッチングとして利用する場合は、トランジスタの性能を最大限発揮するのではなく、余裕を持って使うのが良い。したがって、ここではh_{FE}は余裕を持って データシートの下限のさらに半分とする。つまり、h_{FE}=100とする。

https://akizukidenshi.com/catalog/g/g117089/

今回はI_C= 20mAとしたいので、I_B\geqq 0.2mAであれば良い。オームの法則とキルヒホッフの法則の法則より、R_BI_B R_2+0.7=3.3 を満たす。よってR_2\leqq\frac{3.3-0.7}{0.0002}=13 kΩである。

R_2を大きくしすぎると、I_Cが目標の20mAに届かなくない可能性があるが、小さすぎてもI_Bが無駄に流れて電気がもったいないだけである。とはいえ流石にI_Bが4mAを超える650Ω [4]よりは大きい値を選ばなくてはいけない。以上を勘案して、R_210kΩとする。

さてh_{EF} I_BI_Cよりも随分小さい運用をしているので、コレクターエミッタ間の電圧は0Vとみなせる。よってR_1V_F+R_1I_C=3.3よりR_1 = \frac{3.3 - V_F}{I_C}=\frac{3.3-2.0}{0.002}=65 Ωとなる。例によって少し大きめに選び、R_168Ωにする。

実装

プログラムを変える必要はない。


ブレッドボード上への実装

脚注
  1. 16番である必要はない。繋ぎやすい位置にあったらから選んだだけである。 ↩︎

  2. それ以上を望むのなら机上の計算ではなく、実際に回路を組んで測定すべきである。 ↩︎

  3. PNP型でも実現できるが、NPN型の方がわかりやすいと思う。 ↩︎

  4. \frac{3.3-0.7}{0.004}=650と計算。 ↩︎

Discussion