Raspberry Pi でLチカ

2017年7月25日

Raspberry Pi でLEDを点滅する内容のまとめです。

赤色LEDを点灯させる

以下のものを準備します。

  • 赤色LED(使用 メーカー不明)
  • 抵抗 100 Ω

抵抗 100 Ω の場合は以下の電流値が推測されます。
LEDでの電圧降下分の推測
E=hν=hc/λ=1239.84/λ=1239.84/633≒2 eV
電源からLEDの電圧降下を引いた値が抵抗にかかる電圧
3.3 – 2 =1.3 V
1.3 V ÷ 100 Ω = 13 mA

Raspberry Pi の1ピン辺りの電流の上限は16 mAなので流す電流としては問題なし。(下記リンク参照)

https://www.raspberrypi.org/documentation/hardware/computemodule/cm-designguide.md

GPIO 4 とGND ピンにLEDと抵抗を直列に接続します。(下図参照)
Image

点灯用のコード(sample_led1.py)を下に記載します。GPIO.cleanup()は最後に記入しないとシンタックスエラーとなる場合があります。
$ sudo chmod +x プログラム名.py を実行して実行権限を追加してからの実行となります。

#! /usr/bin/env python
import RPi.GPIO as GPIO

GPIO.cleanup()

GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.OUT)
GPIO.output(4, GPIO.HIGH)

点滅のプログラム

次はプログラムで点滅させてみましょう。
1秒間の点滅を5回繰り返すプログラムです。
while 文を使って処理をループさせます。

#! /usr/bin/env python

import RPi.GPIO as GPIO
import time

I=0
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.OUT)

while I <5:
    GPIO.output(4,GPIO.LOW)
    time.sleep(1)
    GPIO.output(4,GPIO.HIGH)
    time.sleep(1)
    I=I+1

GPIO.cleanup()

青色LEDをバイポーラトランジスタを使って点滅させる

青色LEDを点灯させる回路を作ります。
青色LEDはバンドギャップ(禁制帯幅)が大きい材料(GaN系)を使っているため、他のLEDよりVfが大きいです。
そのため、GPIOの出力する3.3Vではあまり電流を流すことができません。
Raspberry PI の5Vの出力ピンとトランジスタ(バイポーラトランジスタ)を使ってOnとOffの制御をすることにします。

以下のものを準備します。下記の製品名は参考に書いておきます。
・青色LED(使用 スタンレー製:UB3804X),
・バイポーラnpnトランジスター:Tr(使用 東芝製:2SC1815GR)
・抵抗 :R1 150 Ω
・抵抗 :R2 15 KΩ

抵抗の設定は以下のように行いました。

・R1を決める
5(電源)-3.2(予想Vf)-0.25(VCEsat)=1.65[v]
*予想VfはGaN系のバンドギャップより推測した。発光波長から求めると実際測定するとVfが小さくなった。VCEsatはデータシートより推測した。
1.65/R1=10[mA]
R1=165Ω なので近い150Ωを使用しました。

・R2を決める
10[mA]=IB×200(hfe)
=0.05[mA]=50[μA]
三倍の余裕をとります。
50[μA]×3=150[μA]
3.3[V]-0.7(VBE)=2.6[V]
*VBEはシリコン製でVB間のダイオードのVfの推測値です。
2.6[V]/R2=150[uA]
R2≈17[kΩ]→15[kΩ]

回路図は以下です。
Image

プログラムは、“点滅のプログラム”を使ってテストしました。

スイッチを使ってLEDのオン・オフを切り替える
タクトスイッチを使ってオン・オフを切り替えます。

用意するもの
・タクトスイッチ
一応使用したもの
・抵抗 300 Ω(プルアップやプルダウンの抵抗が内部にあるのでいらないようです。)

下図に接続回路図を示します。
Image

プログラムは下記になります。
変数Stateに点灯の状態を記録することにより、点滅を制御します。
プルアップでスイッチのオン、オフを入力していて、オフの場合Vdd(3.3V)、オンの場合0Vになることでオン・オフを判別します。

#! /usr/bin/env python

import RPi.GPIO as GPIO
import time

State = 0
I = 0
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.OUT)
GPIO.setup(9,GPIO.IN,pull_up_down=GPIO.PUD_UP)

GPIO.output(4,GPIO.LOW)

while True:
    if (GPIO.input(9) == 0):
        if (State == 1):
            GPIO.output(4,GPIO.LOW)
            State = 0
        elif (State == 0):
            GPIO.output(4,GPIO.HIGH)
            State = 1
        while (GPIO.input(9) == 0):
            time.sleep(0.1)

GPIO.cleanup()

以上 Raspberry でのLチカのまとめでした。