【ラズパイ電子工作】赤色バーLEDを点灯させる方法(OSX10201-R)

RPD028【ラズパイ電子工作】赤色バーLEDを点灯させる方法(OSX10201-R)

ラズベリーパイは基板上に「GPIO」と呼ばれる、ラズベリーパイ上で作成したプログラムから信号の入力・信号の出力といった制御をすることができるピンが存在します。

信号の入力とは「スイッチのON/OFF」「温度計で室温の計測」といった、ラズベリーパイの外の情報を入力(インプット)してプログラム上で使用することです。

対して、信号の出力とは「LEDを点灯させる」「モータを回す」といった、ラズベリーパイで制御した結果を外に出力(アウトプット)することです。

バーLEDとは、LEDが横一列に配列されているLEDで、視認性を高める目的でレベルメーター等に多く使用される部品です。

今回使用するバーLEDのOXS10201-Rは赤色10個のLEDが横一列に配列されているLEDで、各LEDは独立した配線になっています。

この記事では、ラズベリーパイのプログラム(Python)から赤色バーLED OXS10201-Rを点灯させる方法を解説します。

注意
この記事中に記載されている内容はソースコード含めて電気設計人が自己流で行ったものです。一般的な方法とは相違がある可能性がありますので予めご了承ください。

1. 完成イメージ(赤色バーLEDを点灯させる)

この記事で完成するものは以下のようになります。

10_完成イメージ

横一列に配列した赤色のLEDが左から流れるように点灯します。各LEDは0.1秒毎に点灯しています。

2. 使用する部品

今回使用する部品は以下の通りです。

ラズベリーパイ本体(モデル3B+)

20_ラズベリーパイ3B+

『Raspberry Pi 3 Model B+』を使用します。※2020年5月時点で最新はRaspberry Pi 4になります。

ブレッドボード

20_ブレッドボート

LEDや抵抗といった各種部品や(後述する)ジャンパ線などを穴に差し込み、部品間を電気的に接続する板(ボード)です。

電子工作をする上で必須の部品です。

ジャンパ線

20_ジャンパ線

ブレッドボートに差し込み、電子部品の間を電気的に接続します。

↑の写真では両側が「ピン」になっており、ブレッドボートの穴に差し込んで使用します。

赤色バーLED:OXS10201-R

赤色バーLED_OXS10201-R

今回は「バーLED」であるOXS10201-Rを使用します。赤色のLEDが10ヶ横一列に配列されています。各LEDのアノード・カソードは独立しています。(コモンラインは無し)

外形図、内部配線は以下のようになります。

データシート_OXS10201-R
出典:OSX10201-Xシリーズデータシート

抵抗器

20_抵抗器

LEDなど電子部品は適した電圧と電流が決められており、それ以上の電流を流してしまうと壊れてしまう場合があります。

抵抗は電流の流れを抑えることで、部品に流れる電流を抑える役割を担います。

今回は220Ω(オーム)の抵抗器を使用します。

オススメの電子工作セット

電子工作をするため、これまで解説した部品の他にもスイッチやセンサなど、色々な部品が必要になってきます。個々で購入するには手間がかかるため、最初はセット品を購入することをおススメします。

電気設計人
電気設計人

私は以下のセット品を購入しました!

また、これからラズベリーパイを購入する場合、ラズベリーパイ本体を含めたセット品を購入することをおススメします。

ラズベリーパイ本体を収めるケースや、OSをインストールするためmicroSDカードなど必要なものを個々に購入する手間を省くことができます。

3. 回路図・配線の様子

ラズベリーパイのプログラム(Python)から赤色バーLED OXS10201-Rを点灯させる回路を解説します。

回路図

回路図は以下のようになります。

30_回路図

バーLEDの各アノードにGPIOを個別に配線します。(単純ですが配線量は多いです)

左側のLEDをA、右側のLEDをJとすると、各LEDとGPIOの関係は以下のようになります。

LED区別GPIOジャンパ線色
LED_A(一番左側)GPIO 27番ポート白色
LED_BGPIO 22番ポート青色
LED_CGPIO 5番ポート黄色
LED_DGPIO 13番ポートオレンジ色
LED_EGPIO 26番ポート白色
LED_FGPIO 18番ポート青色
LED_GGPIO 23番ポート黄色
LED_HGPIO 24番ポートオレンジ色
LED_IGPIO 16番ポート白色
LED_J(一番右側)GPIO 21番ポート青色

各LEDのカソードには抵抗器(220Ω)を介してGNDに接続します。(黒色のジャンパ線)

メモ
抵抗器に極性はありませんので、プラスとマイナスは気にしなくてOKです。

配線の様子

配線の様子です。こんな感じになりました。

31_配線の様子

↑では、フラットケーブルでGPIOの全ピンをブレッドボードに接続しています。回路図と実際の配線は異なる部分がありますがご了承ください。

※電気的には「回路図」と同じ意味です。

4. プログラム(Python)

赤色バーLED OXS10201-R を点灯させるプログラム(Python)は以下のようになります。

ソースコード

#必要なモジュールをインポート
import RPi.GPIO as GPIO             #GPIO用のモジュールをインポート
import time                         #時間制御用のモジュールをインポート
import sys                          #sysモジュールをインポート

#ポート番号の定義
Led_A = 27                          #変数"Led_A"に27を格納
Led_B = 22                          #変数"Led_B"に22を格納
Led_C = 5                           #変数"Led_C"に5を格納
Led_D = 13                          #変数"Led_D"に13を格納
Led_E = 26                          #変数"Led_E"に26を格納
Led_F = 18                          #変数"Led_F"に18を格納
Led_G = 23                          #変数"Led_G"に23を格納
Led_H = 24                          #変数"Led_H"に24を格納
Led_I = 16                          #変数"Led_I"に16を格納
Led_J = 21                          #変数"Led_J"に21を格納

#GPIOの設定
GPIO.setmode(GPIO.BCM)              #GPIOのモードを"GPIO.BCM"に設定
GPIO.setup(Led_A, GPIO.OUT)         #GPIO27を出力モードに設定
GPIO.setup(Led_B, GPIO.OUT)         #GPIO22を出力モードに設定
GPIO.setup(Led_C, GPIO.OUT)         #GPIO5を出力モードに設定
GPIO.setup(Led_D, GPIO.OUT)         #GPIO13を出力モードに設定
GPIO.setup(Led_E, GPIO.OUT)         #GPIO26を出力モードに設定
GPIO.setup(Led_F, GPIO.OUT)         #GPIO18を出力モードに設定
GPIO.setup(Led_G, GPIO.OUT)         #GPIO23を出力モードに設定
GPIO.setup(Led_H, GPIO.OUT)         #GPIO24を出力モードに設定
GPIO.setup(Led_I, GPIO.OUT)         #GPIO16を出力モードに設定
GPIO.setup(Led_J, GPIO.OUT)         #GPIO21を出力モードに設定

delay = 0.1                         #変数"delay"に0.1を格納

#while文で無限ループ
#GPIOの電圧を制御
while True:
    try:
        GPIO.output(Led_A, GPIO.HIGH)    #GPIO27の出力をHigh(3.3V)にする
        time.sleep(delay)                #変数"delay"間待つ
        GPIO.output(Led_A, GPIO.LOW)     #GPIO27の出力をLow(0V)にする
        GPIO.output(Led_B, GPIO.HIGH)    #GPIO22の出力をHigh(3.3V)にする
        time.sleep(delay)                #変数"delay"間待つ
        GPIO.output(Led_B, GPIO.LOW)     #GPIO22の出力をLow(0V)にする
        GPIO.output(Led_C, GPIO.HIGH)    #GPIO5の出力をHigh(3.3V)にする
        time.sleep(delay)                #変数"delay"間待つ
        GPIO.output(Led_C, GPIO.LOW)     #GPIO5の出力をLow(0V)にする
        GPIO.output(Led_D, GPIO.HIGH)    #GPIO13の出力をHigh(3.3V)にする
        time.sleep(delay)                #変数"delay"間待つ
        GPIO.output(Led_D, GPIO.LOW)     #GPIO13の出力をLow(0V)にする
        GPIO.output(Led_E, GPIO.HIGH)    #GPIO26の出力をHigh(3.3V)にする
        time.sleep(delay)                #変数"delay"間待つ
        GPIO.output(Led_E, GPIO.LOW)     #GPIO26の出力をLow(0V)にする
        GPIO.output(Led_F, GPIO.HIGH)    #GPIO18の出力をHigh(3.3V)にする
        time.sleep(delay)                #変数"delay"間待つ
        GPIO.output(Led_F, GPIO.LOW)     #GPIO18の出力をLow(0V)にする
        GPIO.output(Led_G, GPIO.HIGH)    #GPIO23の出力をHigh(3.3V)にする
        time.sleep(delay)                #変数"delay"間待つ
        GPIO.output(Led_G, GPIO.LOW)     #GPIO23の出力をLow(0V)にする
        GPIO.output(Led_H, GPIO.HIGH)    #GPIO24の出力をHigh(3.3V)にする
        time.sleep(delay)                #変数"delay"間待つ
        GPIO.output(Led_H, GPIO.LOW)     #GPIO24の出力をLow(0V)にする
        GPIO.output(Led_I, GPIO.HIGH)    #GPIO16の出力をHigh(3.3V)にする
        time.sleep(delay)                #変数"delay"間待つ
        GPIO.output(Led_I, GPIO.LOW)     #GPIO16の出力をLow(0V)にする
        GPIO.output(Led_J, GPIO.HIGH)    #GPIO21の出力をHigh(3.3V)にする
        time.sleep(delay)                #変数"delay"間待つ
        GPIO.output(Led_J, GPIO.LOW)     #GPIO21の出力をLow(0V)にする
        
    except KeyboardInterrupt:            #Ctrl+cキーが押された
        GPIO.cleanup()                   #GPIOをクリーンアップ
        sys.exit()                       #プログラムを終了

各LEDに接続されたGPIOの出力をHigh(3.3V)にすることで点灯する処理を、while文で繰り返し行います。(地獄のように単純で力技なプログラムです。)

プログラムの解説

#必要なモジュールをインポート
import RPi.GPIO as GPIO             #GPIO用のモジュールをインポート
import time                         #時間制御用のモジュールをインポート
import sys                          #sysモジュールをインポート

2~4行目で今回必要な「モジュール」を宣言します。


#ポート番号の定義
Led_A = 27                          #変数"Led_A"に27を格納
Led_B = 22                          #変数"Led_B"に22を格納
Led_C = 5                           #変数"Led_C"に5を格納
Led_D = 13                          #変数"Led_D"に13を格納
Led_E = 26                          #変数"Led_E"に26を格納
Led_F = 18                          #変数"Led_F"に18を格納
Led_G = 23                          #変数"Led_G"に23を格納
Led_H = 24                          #変数"Led_H"に24を格納
Led_I = 16                          #変数"Led_I"に16を格納
Led_J = 21                          #変数"Led_J"に21を格納

使用するGPIOのポート番号を宣言します。この数値はGPIOのポート番号として扱い、後からポート番号を変更する場合はこの数値を変更します。


#GPIOの設定
GPIO.setmode(GPIO.BCM)              #GPIOのモードを"GPIO.BCM"に設定
GPIO.setup(Led_A, GPIO.OUT)         #GPIO27を出力モードに設定
GPIO.setup(Led_B, GPIO.OUT)         #GPIO22を出力モードに設定
GPIO.setup(Led_C, GPIO.OUT)         #GPIO5を出力モードに設定
GPIO.setup(Led_D, GPIO.OUT)         #GPIO13を出力モードに設定
GPIO.setup(Led_E, GPIO.OUT)         #GPIO26を出力モードに設定
GPIO.setup(Led_F, GPIO.OUT)         #GPIO18を出力モードに設定
GPIO.setup(Led_G, GPIO.OUT)         #GPIO23を出力モードに設定
GPIO.setup(Led_H, GPIO.OUT)         #GPIO24を出力モードに設定
GPIO.setup(Led_I, GPIO.OUT)         #GPIO16を出力モードに設定
GPIO.setup(Led_J, GPIO.OUT)         #GPIO21を出力モードに設定

GPIOの設定を行います。

GPIO.setmode(GPIO.BCM)は、GPIOをポート番号で扱う方法に設定します。

GPIO.setup(Led_A, GPIO.OUT)は、GPIO 27番ポートを出力モードに設定します。

同様に、21~29行目でGPIO 22, 5, 13, 26, 18, 23, 24, 16, 21番ポートを出力モードに設定します。


delay = 0.1                         #変数"delay"に0.1を格納

変数”delay”に0.1を代入します。後ほどこの変数で各LEDを点灯させる時間に使用します。


#while文で無限ループ
#GPIOの電圧を制御
while True:
    try:
        GPIO.output(Led_A, GPIO.HIGH)    #GPIO27の出力をHigh(3.3V)にする
        time.sleep(delay)                #変数"delay"間待つ
        GPIO.output(Led_A, GPIO.LOW)     #GPIO27の出力をLow(0V)にする
        GPIO.output(Led_B, GPIO.HIGH)    #GPIO22の出力をHigh(3.3V)にする
        time.sleep(delay)                #変数"delay"間待つ
        GPIO.output(Led_B, GPIO.LOW)     #GPIO22の出力をLow(0V)にする
        GPIO.output(Led_C, GPIO.HIGH)    #GPIO5の出力をHigh(3.3V)にする
        time.sleep(delay)                #変数"delay"間待つ
        GPIO.output(Led_C, GPIO.LOW)     #GPIO5の出力をLow(0V)にする
        GPIO.output(Led_D, GPIO.HIGH)    #GPIO13の出力をHigh(3.3V)にする
        time.sleep(delay)                #変数"delay"間待つ
        GPIO.output(Led_D, GPIO.LOW)     #GPIO13の出力をLow(0V)にする
        GPIO.output(Led_E, GPIO.HIGH)    #GPIO26の出力をHigh(3.3V)にする
        time.sleep(delay)                #変数"delay"間待つ
        GPIO.output(Led_E, GPIO.LOW)     #GPIO26の出力をLow(0V)にする
        GPIO.output(Led_F, GPIO.HIGH)    #GPIO18の出力をHigh(3.3V)にする
        time.sleep(delay)                #変数"delay"間待つ
        GPIO.output(Led_F, GPIO.LOW)     #GPIO18の出力をLow(0V)にする
        GPIO.output(Led_G, GPIO.HIGH)    #GPIO23の出力をHigh(3.3V)にする
        time.sleep(delay)                #変数"delay"間待つ
        GPIO.output(Led_G, GPIO.LOW)     #GPIO23の出力をLow(0V)にする
        GPIO.output(Led_H, GPIO.HIGH)    #GPIO24の出力をHigh(3.3V)にする
        time.sleep(delay)                #変数"delay"間待つ
        GPIO.output(Led_H, GPIO.LOW)     #GPIO24の出力をLow(0V)にする
        GPIO.output(Led_I, GPIO.HIGH)    #GPIO16の出力をHigh(3.3V)にする
        time.sleep(delay)                #変数"delay"間待つ
        GPIO.output(Led_I, GPIO.LOW)     #GPIO16の出力をLow(0V)にする
        GPIO.output(Led_J, GPIO.HIGH)    #GPIO21の出力をHigh(3.3V)にする
        time.sleep(delay)                #変数"delay"間待つ
        GPIO.output(Led_J, GPIO.LOW)     #GPIO21の出力をLow(0V)にする
        
    except KeyboardInterrupt:            #Ctrl+cキーが押された
        GPIO.cleanup()                   #GPIOをクリーンアップ
        sys.exit()                       #プログラムを終了

「while文」は条件を指定して、その条件が真の時に繰り返し処理を行うものです。

Python
while 条件式:
    繰り返し処理を行うコード

↑の「条件式」にTrueを指定することにより、条件式は常に真となりwhile文は無限に繰り返します。

メモ
無限に繰り返すことを、無限ループと表現したりします。

ただし、このままではプログラム実行中に無限ループから抜け出す方法がありません。そこでwhile文の中にある「try文」と「except文」を使用します。

このtry-except文を用いることにより、while文の処理は以下のようになります。

Python
while True:
    try:
        繰り返し処理を行うコード
    except KeyboardInterrupt:               #Ctrl+Cキーが押された
        GPIO.cleanup()                      #GPIOをクリーンアップ
        sys.exit()                          #プログラムを終了

except KeyboardInterrupt:は、キーボードのCtrl + cキーが押された時にwhile文の繰り返し処理から抜けて「GPIOのクリーンアップ」と「プログラムの終了」の処理を行います。

Ctrl + cキーが押されていないとき、try:文の中の処理を繰り返し行います。(以下で解説)


while文の中の「繰り返し処理を行うコード」は以下の通りです。つまり、Ctrl + Cキーが押されるまで以下の処理を繰り返します。

    GPIO.output(Led_A, GPIO.HIGH)    #GPIO27の出力をHigh(3.3V)にする
    time.sleep(delay)                #変数"delay"間待つ
    GPIO.output(Led_A, GPIO.LOW)     #GPIO27の出力をLow(0V)にする
    GPIO.output(Led_B, GPIO.HIGH)    #GPIO22の出力をHigh(3.3V)にする
    time.sleep(delay)                #変数"delay"間待つ
    GPIO.output(Led_B, GPIO.LOW)     #GPIO22の出力をLow(0V)にする
    GPIO.output(Led_C, GPIO.HIGH)    #GPIO5の出力をHigh(3.3V)にする
    time.sleep(delay)                #変数"delay"間待つ
    GPIO.output(Led_C, GPIO.LOW)     #GPIO5の出力をLow(0V)にする
    GPIO.output(Led_D, GPIO.HIGH)    #GPIO13の出力をHigh(3.3V)にする
    time.sleep(delay)                #変数"delay"間待つ
    GPIO.output(Led_D, GPIO.LOW)     #GPIO13の出力をLow(0V)にする
    GPIO.output(Led_E, GPIO.HIGH)    #GPIO26の出力をHigh(3.3V)にする
    time.sleep(delay)                #変数"delay"間待つ
    GPIO.output(Led_E, GPIO.LOW)     #GPIO26の出力をLow(0V)にする
    GPIO.output(Led_F, GPIO.HIGH)    #GPIO18の出力をHigh(3.3V)にする
    time.sleep(delay)                #変数"delay"間待つ
    GPIO.output(Led_F, GPIO.LOW)     #GPIO18の出力をLow(0V)にする
    GPIO.output(Led_G, GPIO.HIGH)    #GPIO23の出力をHigh(3.3V)にする
    time.sleep(delay)                #変数"delay"間待つ
    GPIO.output(Led_G, GPIO.LOW)     #GPIO23の出力をLow(0V)にする
    GPIO.output(Led_H, GPIO.HIGH)    #GPIO24の出力をHigh(3.3V)にする
    time.sleep(delay)                #変数"delay"間待つ
    GPIO.output(Led_H, GPIO.LOW)     #GPIO24の出力をLow(0V)にする
    GPIO.output(Led_I, GPIO.HIGH)    #GPIO16の出力をHigh(3.3V)にする
    time.sleep(delay)                #変数"delay"間待つ
    GPIO.output(Led_I, GPIO.LOW)     #GPIO16の出力をLow(0V)にする
    GPIO.output(Led_J, GPIO.HIGH)    #GPIO21の出力をHigh(3.3V)にする
    time.sleep(delay)                #変数"delay"間待つ
    GPIO.output(Led_J, GPIO.LOW)     #GPIO21の出力をLow(0V)にする

GPIO.output(Led_A, GPIO.HIGH)はGPIO 27番ポートの出力をHigh(3.3V)にします。GPIO 27番ポートに接続された一番左側のLEDが点灯します。

time.sleep(delay)は何もせずに0.1秒間待ちます。

GPIO.output(Led_A, GPIO.LOW)はGPIO 27番ポートの出力をLow(0V)にすることで一番左側のLEDが消灯します。

この処理をべた書きで全LEDを行います。(プログラミングの悪い例として紹介されそうですね…)

5. おわりに

ラズベリーパイのプログラム(Python)から赤色バーLED OXS10201-Rを点灯させる方法を解説しました。

今回は各LEDをすべてGPIOに接続して、個別に力技で点灯させました。後日ドライバを用いて点灯させる方法を記事にまとめます。

まだまだラズベリーパイ初心者の私ですが、以下の参考書が大変参考にさせて頂いております。

2冊とも初学者にも易しい内容になっており、ゼロからラズベリーパイを始める方にもオススメできる参考書です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です