【ラズパイ電子工作】7セグメントLEDの数値をスイッチで増減させる方法(ドライバ使用)

【ラズパイ電子工作】7セグメントLEDの数値をスイッチで増減させる方法(ドライバ使用)

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

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

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

7セグメントLEDとは、数字状に7ヶのLEDを配置した電子部品でエレベータや電光掲示板など日常でも色々な用途で使用されます。ラズパイのGPIOと7セグメントLEDを直接接続すると、1桁表示させるだけでGPIOを7点使用することになります。※右下のドットを含むと8点。

7セグメントドライバと呼ばれるICを使用することでGPIOの数を削減できるとともに、プログラムを簡単にすることができます。

この記事では、ラズベリーパイのプログラム(Python)から7セグメントドライバを用いて7セグメントLEDに表示する数値をスイッチ2ヶで増減させる方法を解説します。

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

7セグメントLEDを直接GPIOに接続して数値を表示させる方法は以下のページで解説しておりますので、宜しければご覧ください。

【ラズパイ電子工作】7セグメントLEDに数値を表示させる方法【ラズパイ電子工作】7セグメントLEDに数値を表示させる方法 【ラズパイ電子工作】7セグメントLEDに繰り返し数値(0~9)を表示させる方法【ラズパイ電子工作】7セグメントLEDに繰り返し数値(0~9)を表示させる方法 【ラズパイ電子工作】7セグメントLEDの数値をスイッチで増減させる方法【ラズパイ電子工作】7セグメントLEDの数値をスイッチで増減させる方法

7セグメントドライバを用いて7セグメントLEDを制御する方法は以下のページで解説しております。

【ラズパイ電子工作】7セグメントLEDに数値を表示させる方法(ドライバ使用)【ラズパイ電子工作】7セグメントLEDに数値を表示させる方法(ドライバ使用) 【ラズパイ電子工作】7セグメントLEDに繰り返し数値を表示させる方法(ドライバ使用)【ラズパイ電子工作】7セグメントLEDに繰り返し数値を表示させる方法(ドライバ使用)

1. 完成イメージ(7セグメントLEDの数値を増減)

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

10_完成イメージ

7セグメントLEDはエレベータや電光掲示板など日常でも色々な用途で使用されている電子部品です。

今回はこの7セグメントLEDに7セグメントドライバTC4511BPを用いて、表示する数値をスイッチを押すことで増減させます。

2. 使用する部品

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

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

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

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

ブレッドボード

20_ブレッドボート

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

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

ジャンパ線

20_ジャンパ線

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

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

7セグメントLED(LEDS5612AUR1C)

20_7セグメントLED

7セグメントLED(seven-segment LED)とは、数字状に7ヶ(※)のLEDを配置した電子部品で、エレベータや電光掲示板など日常でも色々な用途で使用されています。 (※)右下のドットを入れると計8ヶのLEDとなります。

LEDには極性があり、プラス側をアノード(Anode)、マイナス側をカソード(Cathode)と呼びます。

7セグメントLEDもざっくりいうとLEDが8ヶまとまっている部品なので、各LEDにはアノードとカソードがあります。そして、一般的な7セグメントLEDはアノードまたはカソードの端子が部品内部でまとめられています。

以下は7セグメントLED(LEDS5612AUR1C)のデータシートから抜粋したものです。

20_データシート
出典: LEDS5612AUR1C DATAsheet

データシート(右上の回路図)から、7セグメントLEDはカソードが3,8番ピンにまとめられており、アノードが各LED毎で独立しています。(アノードは1,2,4,5,6,7,9,10番ピン)

例えば、7番ピンにプラス側の電圧を掛けてAのLEDを光らせると、7セグメントLEDの一番上の横棒が点灯します。

今回のようなカソードがまとめられていることをカソードコモンと呼び、逆にアノードがまとめられている場合はアノードコモンと呼びます。

メモ
コモン(common)とは、共通・共有といった意味があり、電子回路では共通部分のことを指します。

7セグメントドライバ(TC4511BP)

7セグメントドライバ(TC4511BP)

7セグメントドライバTC4511BPは、表示したい数値を2進数で入力すると、その数値を7セグメントLEDに表示(点灯)させるICです。

ピン接続図は以下の通りです。

7セグメントドライバ_ピン接続図
出典: TC4511BP DATAsheet

↑の1,2,6,7番(B,C,D,A)ピンに2進数を入力すると、7セグメントLEDにその数値を表示するように9~15番(a~g)ピンを出力します。

メモ
ラズパイには1,2,6,7番(B,C,D,A)ピンを、7セグメントLEDには9~15番(a~g)ピンを接続します。
7セグメントドライバ_真理値表
出典: TC4511BP DATAsheet

例えば、7セグメントLEDに5(2進数だと0101)と表示する場合、2,7番(C,A)ピンをHighにすることで、13,11,10,15,14番(a,c,d,f,g)ピンがHighになります。

抵抗器

20_抵抗器

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

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

今回は220Ω(オーム)の抵抗器を、7セグメントLEDの各アノード側に使用します。

タクトスイッチ

タクトスイッチ(カラー)

スイッチを押すと、内部の回路が繋がり電流を流します。

今回は黄色と緑色のスイッチを使用します。

メモ
電気的に繋がっている状態を「導通している」と表現することがあります。

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

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

電気設計人
電気設計人

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

注意
7セグメントドライバ:TC4511BPはこのセット内には入っていませんので、別途購入が必要です。

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

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

3. 回路図・配線の様子

ラズベリーパイのプログラム(Python)から7セグメントドライバを用いて7セグメントLEDに表示する数値をスイッチ2ヶで増減させる回路を解説します。

回路図

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

30_回路図

7セグメントドライバTC4511BPとGPIO 4ヶを接続します。

7セグメントドライバピンGPIOジャンパ線色
7番(A)ピンGPIO 5番ポート黄色
1番(B)ピンGPIO 6番ポート青色
2番(C)ピンGPIO 13番ポート白色
6番(D)ピンGPIO 19番ポート黄色

16番(Vdd)ピンに3.3V、8番(Vss)ピンにGNDを接続します。

メモ
前項2.使用する部品の真理値表から「3,4番(LT,BI)ピンに3.3V」「5番(LE)ピンにGND」を接続します。

7セグメントドライバの9~15番(a~g)ピンと7セグメントLEDの各アノードを接続します。(220Ωの抵抗経由)


黄色スイッチの片側をGPIO 18番ポート、緑色スイッチの片側をGPIO 23番ポートに接続します。

各スイッチのもう片側には3.3Vを接続します。(赤色のジャンパ線)

回路図と実際のスイッチの色が異なりますがご了承ください。

配線の様子

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

31_配線の様子1
31_配線の様子2
31_配線の様子3
31_配線の様子4

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

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

4. プログラム(Python)

7セグメントドライバを用いて7セグメントLEDに表示する数値をスイッチ2ヶで増減させるプログラム(Python)は以下のようになります。

ソースコード

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

#ポート番号の定義
seg_pin = [
   #A, B, C,  D
    5, 6, 13, 19]                #変数"seg_pin"にドライバで使用するポート
    
#スイッチのポートを定義
Sw_yellow_pin = 18               #変数"Sw_yellow_pin"に18を代入
Sw_green_pin = 23                #変数"Sw_green_pin"に23を代入

#GPIOの設定
GPIO.setmode(GPIO.BCM)           #GPIOのモードを"GPIO.BCM"に設定
GPIO.setup(seg_pin, GPIO.OUT)    #GPIO(4ヶ)を出力モードに設定

#GPIO18を入力モードに設定してプルダウン抵抗を有効にする
GPIO.setup(Sw_yellow_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
#GPIO23を入力モードに設定してプルダウン抵抗を有効にする
GPIO.setup(Sw_green_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

#初期化処理
seg_number = 0                   #変数"seg_number"に0を代入
i = 0                            #変数"i"に0を代入

#while文で無限ループ
#GPIOの電圧を制御
while True:
    try:
        while i < 4:                         #7セグLEDに数値を表示させる処理
            GPIO.output(seg_pin[i], seg_number & (0x01 << i))   #7セグメントドライバに2進数を出力
            i += 1                           #変数"i"を+1
        time.sleep(0.3)                      #0.3秒間待つ
        i = 0                                #変数"i"に0を代入
        if(GPIO.input(Sw_yellow_pin) == 1):  #GPIO18が"1"であるか判断(↓1であれば以下を実行)
            seg_number -= 1                  #変数"seg_number"を-1
        if(GPIO.input(Sw_green_pin) == 1):   #GPIO23が"1"であるか判断(↓1であれば以下を実行)
            seg_number += 1                  #変数"seg_number"を+1

        if seg_number >= 10:                 #変数"seg_number"が10以上であれば↓を実行
            seg_number = 0                   #変数"seg_number"に0を代入
        if seg_number <= -1:                 #変数"seg_number"が-1以下であれば↓を実行
            seg_number = 9                   #変数"seg_number"に9を代入

    except KeyboardInterrupt:            #Ctrl+Cキーが押された
        GPIO.cleanup()                   #GPIOをクリーンアップ
        sys.exit()                       #プログラム終了

7セグメントLEDに表示する数値を変数seg_numberに代入して、その値を2進数に変換して7セグメントドライバに繰り返し出力します。

スイッチが押された場合、変数seg_numberの値をインクリメント(+1)、またはデクリメント(-1)します。

プログラムの解説

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

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


#ポート番号の定義
seg_pin = [
   #A, B, C,  D
    5, 6, 13, 19]                #変数"seg_pin"にドライバで使用するポート

変数seg_pinに5,6,13,19を代入します。この数値は7セグメントドライバに出力するGPIOのポート番号として扱い、後からポート番号を変更する場合はこの数値を変更します。


#スイッチのポートを定義
Sw_yellow_pin = 18               #変数"Sw_yellow_pin"に18を代入
Sw_green_pin = 23                #変数"Sw_green_pin"に23を代入

スイッチのGPIOポート番号を定義します。

黄色スイッチはGPIO 18番ポート、緑色スイッチはGPIO 23番ポートを使用します。


#GPIOの設定
GPIO.setmode(GPIO.BCM)           #GPIOのモードを"GPIO.BCM"に設定
GPIO.setup(seg_pin, GPIO.OUT)    #GPIO(4ヶ)を出力モードに設定

GPIOの設定を行います。

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

GPIO.setup(seg_pin, GPIO.OUT)は、GPIO 4ヶを出力モードに設定します。


#GPIO18を入力モードに設定してプルダウン抵抗を有効にする
GPIO.setup(Sw_yellow_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
#GPIO23を入力モードに設定してプルダウン抵抗を有効にする
GPIO.setup(Sw_green_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

GPIO.setup(Sw_yellow_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)は、GPIO 18番ポートを入力モードに設定して、内部にあるプルダウン抵抗を有効にします。

緑色スイッチが接続されているGPIO 23番ポートも同様の設定を行います。


#初期化処理
seg_number = 0                   #変数"seg_number"に5を代入
i = 0                            #変数"i"に0を代入

変数の初期化処理を行います。

変数seg_number7セグメントLEDに表示させる数値として使用します。


#while文で無限ループ
#GPIOの電圧を制御
while True:
    try:
        while i < 4:                         #7セグLEDに数値を表示させる処理
            GPIO.output(seg_pin[i], seg_number & (0x01 << i))   #7セグメントドライバに2進数を出力
            i += 1                           #変数"i"を+1
        time.sleep(0.3)                      #0.3秒間待つ
        i = 0                                #変数"i"に0を代入
        if(GPIO.input(Sw_yellow_pin) == 1):  #GPIO18が"1"であるか判断(↓1であれば以下を実行)
            seg_number -= 1                  #変数"seg_number"を-1
        if(GPIO.input(Sw_green_pin) == 1):   #GPIO23が"1"であるか判断(↓1であれば以下を実行)
            seg_number += 1                  #変数"seg_number"を+1

        if seg_number >= 10:                 #変数"seg_number"が10以上であれば↓を実行
            seg_number = 0                   #変数"seg_number"に0を代入
        if seg_number <= -1:                 #変数"seg_number"が-1以下であれば↓を実行
            seg_number = 9                   #変数"seg_number"に9を代入

    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キーが押されるまで以下の処理を繰り返します。

    while i < 4:                         #7セグLEDに数値を表示させる処理
        GPIO.output(seg_pin[i], seg_number & (0x01 << i))   #7セグメントドライバに2進数を出力
        i += 1                           #変数"i"を+1
    time.sleep(0.3)                      #0.3秒間待つ
    i = 0                                #変数"i"に0を代入
    if(GPIO.input(Sw_yellow_pin) == 1):  #GPIO18が"1"であるか判断(↓1であれば以下を実行)
        seg_number -= 1                  #変数"seg_number"を-1
    if(GPIO.input(Sw_green_pin) == 1):   #GPIO23が"1"であるか判断(↓1であれば以下を実行)
        seg_number += 1                  #変数"seg_number"を+1

    if seg_number >= 10:                 #変数"seg_number"が10以上であれば↓を実行
        seg_number = 0                   #変数"seg_number"に0を代入
    if seg_number <= -1:                 #変数"seg_number"が-1以下であれば↓を実行
        seg_number = 9                   #変数"seg_number"に9を代入

while i < 4:は変数iが4未満の場合に繰り返し処理を行います。

GPIO.output(seg_pin[i], seg_number & (0x01 << i))は、7セグメントLEDに表示する数値を2進数にして7セグメントドライバに出力します。

i += 1は変数iをインクリメント(+1)します。

↑ここまでの処理は、GPIO 5,6,13,19番ポートに対して変数seg_numberの値を2進数(4ビット長)に変換して出力します。


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

if(GPIO.input(Sw_yellow_pin) == 1):はif文によって黄色スイッチが押されているか判断します。

Python
if 条件式:
    条件式が"真"の時に実行するコード

条件式が”真”、つまり黄色スイッチが押されていればseg_number -= 1が実行されます。これは変数seg_numberの値をデクリメント(-1)する意味です。

逆に緑色スイッチが押された場合、if(GPIO.input(Sw_green_pin) == 1):の条件が”真”となりseg_number += 1が実行されます。

スイッチがどちらも押されていない状態では、上記2ヶのif文の条件は”偽”となり、何も実行されずに変数seg_numberの値も変化しません。


    if seg_number >= 10:                 #変数"seg_number"が10以上であれば↓を実行
        seg_number = 0                   #変数"seg_number"に0を代入
    if seg_number <= -1:                 #変数"seg_number"が-1以下であれば↓を実行
        seg_number = 9                   #変数"seg_number"に9を代入

変数seg_numberの数値が7セグメントLEDに表示する数値となりますが、今回表示する数値は0~9です。変数の値が10以上、または-1以下になると変数に値を代入し直す処理を↑のif文で行います。0~9の範囲内の場合はこの処理はスルーします。

5. おわりに

ラズベリーパイのプログラム(Python)から7セグメントドライバを用いて7セグメントLEDに表示する数値をスイッチ2ヶで増減させる方法を解説しました。

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

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

コメントを残す

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