Raspberry PiのGPIO端子電圧を制御してLEDを点滅

Raspberry Piから指令を与えて様々な電子デバイスを制御してみたいですよね。

GPIO出力電圧制御の基本をマスターすれば、様々な電子デバイス制御に応用出来ます!

今回はその前段階として、GPIO端子から出力される電圧を制御して、LEDを点滅させてみます。本記事では、まずGPIO、LEDの基礎知識を解説します。次にLED点滅回路の説明、最後にLED点滅プログラムの説明といった流れです。

完成姿がこちら↓

目次

準備したもの

  • Raspberry Pi
  • ブレッドボード
  • ジャンパワイヤ オス-メス
  • 赤色LED
  • 330Ω抵抗

基礎知識

GPIOとは

Raspberry Piで電子機器を制御するには、GPIOの知識が必須です。ここでは、GPIOについて説明します。

Raspberry Piには、GPIOと呼ばれるコネクタが備わっています。GPIOとは「General-purpose input/output」の略で、汎用入出力のことです。このGPIOコネクタには、40本の端子があります。この端子からLEDを点灯させるための電圧を取り出します。

GPIO端子にはそれぞれ役割があり、端子配列は下図になります。

端子配列を忘れてしまったらコマンドラインで

pinout

と打てば端子配列を確認出来ます。

GPIO端子から3.3Vの電圧を出力させることが出来、この電圧をLEDに印加してLEDを点灯させていきます。

プログラムでGPIOをHighレベルに設定すると3.3V印加され、Lowレベルに設定すると0Vになります。

LED基礎知識

LEDの極性

LEDには極性があり、正しい方向に電圧を加えないと電流が流れません。極性はLEDの電極の長さから分かります。長い方がアノードと呼ばれ正極、短い方がカソードと呼ばれ負極になります。

では、LED正極とGPIO端子の出力、LED負極とGPIO端子のGNDを接続してみましょう。

ちょっと待って下さい!

GPIO端子を直接LEDに繋げると大電流が流れ、素子が破壊されてしまいます。素子を破壊しないよう適切な抵抗を間に挟み、電圧、電流を適正にする必要があります。

抵抗の計算方法

LEDに大電流を長さないよう抵抗を選定していきます。本来ならLEDのデータシートを確認して抵抗値を計算するのが理想的ですが、今回用いた赤色LEDがいつ購入したものか分からず、当然素性も分かりません。赤色LEDの順方向電圧降下は一般的に2.1V程度、その時の順方向電流は約20mAです。

今回はLEDに10mAの電流を流す前提で抵抗を計算していきます。10mA電流が流れたときの順方向電圧降下はデータシートが無いと分からないですが、1.8V電圧降下が生じると仮定します。

GPIO端子出力電圧は3.3Vですので、赤色LEDで1.8V電圧降下すると、抵抗の両端電圧は3.3-1.8=1.5Vとなります。直列回路では電流一定なので抵抗にもLEDと同じ電流が流れます。LEDに10mA流したいので、オームの法則により抵抗は1.5V / 10mA = 150Ωとなります。ぴったりの抵抗は所持していなかったので、150Ωより大きい抵抗で330Ωの抵抗を選定しました。

回路設計

ブレッドボードLED

GPIO 17(端子番号11)端子から電圧を出力する回路です。GPIO 17端子とLEDアノードとの間に330Ωの抵抗を挟みます。LEDカソードはGPIOのGND(端子番号6)端子に接地させます。

LED点灯プログラム

Pythonプログラム

Pythonによる0.5秒おきにLEDを点灯・消灯させるプログラムです。

プログラム流れはGPIO初期化→LED点灯・消灯の無限ループです。

import RPi.GPIO as GPIO
from time import sleep

# GPIOの初期化
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)

try:
    #LEDを0.5秒おきに点灯・消灯
    while True:
        GPIO.output(17, GPIO.HIGH)
        sleep(0.5)
        GPIO.output(17, GPIO.LOW)
        sleep(0.5)

except KeyboardInterrupt:
    pass

GPIO.cleanup()

プログラム詳細について以下で解説していきます。

GPIO入出力設定

まず、GPIOの各端子指定方法を設定します。指定方法は2通りあり、物理端子番号で指定またはBCM(Broadcom SOC Channel)番号で指定です。BCM番号は、GPIO番号のことです。

#物理端子番号で指定
GPIO.setmode(GPIO.BOARD)
#GPIO番号で指定
GPIO.setmode(GPIO.BCM)

自分にとって分かりやすい指定方法を選べばいいと思います。今回はBCM番号で指定しました。

次に、LEDに電圧を印加するために接続したGPIO17を出力にします。

#GPIO17を出力設定
GPIO.setup(17, GPIO.OUT)

LED点滅

GPIO端子に電圧を3.3V印加するにはGPIO出力をHighに設定、0Vに戻すにはGPIO出力をLowに設定します。

LEDの点灯は0.5秒おきに点灯、消灯を繰り返し、点滅するようsleep()を使用します。

#LEDを0.5秒おきに点灯・消灯
while True:
    GPIO.output(17, GPIO.HIGH)
    sleep(0.5)
    GPIO.output(17, GPIO.LOW)
    sleep(0.5)

動作結果

GPIO 17がLowの時はLEDが消灯↓

GPIO 17がHighの時はLEDが点灯↓

当初、LEDに流したい電流は10mAでした。このときの抵抗見積もりが150Ωでしたが、実際は330Ω抵抗を接続しています。では、実際はLEDにどれだけの電流が流れているのでしょうか?抵抗での電圧降下を測りました。

電圧降下は1.50Vです。抵抗が330Ωですので、オームの法則によりLEDに流れている電流は1.50V / 330Ω = 4.5mAとなります。狙いの10mAの半分程ですが十分な輝度は確保出来ています。

まとめ

GPIO出力電圧制御の基本となるLED点滅プログラムについて解説しました。本記事をおさらいすると

  • GPIOと呼ばれる汎用入出力端子が40本あり、それぞれ役割があることを学んだ
  • LEDに大電流が流れないよう、適正な電流が流れる抵抗を計算した
  • GPIO端子とLED間に抵抗を挟んで接続する回路を組んだ
  • GPIOからの出力をHigh ↔Low繰り返すLEDを点滅するプログラムを作成した

でした。GPIO端子出力制御を応用すれば、様々な電子デバイスを制御出来ると思います。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

大学で機械工学を学んだ後、製造業で働く40代の会社員です。
IT系、電気系を学んでこなかった機械系人間が、ゲーム制作、電子工作に奮闘してます。
極力低コストでものづくりを楽しむのがモットー。

目次