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

RPD015_【ラズパイ電子工作】7セグメントLEDに数値を表示させる方法(while文で数値を切替)

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

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

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

この記事では、ラズベリーパイのプログラム(Python)からGPIOピンを用いて7セグメントLEDに数値0~9を繰り返し表示する方法について解説します。※7セグメントとは?後ほど解説します。

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

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

RPD014_【ラズパイ電子工作】7セグメントLEDに数値を表示させる方法【ラズパイ電子工作】7セグメントLEDに数値を表示させる方法

1. 完成イメージ(7セグメントLEDに0~9を表示)

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

7セグメントLEDは↑のように数値やアルファベットを表示させる電子部品で、エレベータや電光掲示板など日常でも色々な用途で使用されています。

今回は、この7セグメントLEDに0から9を順々に1秒間隔で繰り返し表示させます。

2. 使用する部品

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

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

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

『Raspberry Pi 3 Model B+』を使用します。※2020年1月時点で最新は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)とは、共通・共有といった意味があり、電子回路では共通部分のことを指します。

カーボン抵抗器

20_抵抗器

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

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

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

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

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

電気設計人
電気設計人

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

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

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

3. 回路図・配線の様子

ラズベリーパイのプログラム(Python)からGPIOピンを用いて7セグメントLEDに数値0~9を繰り返し表示する回路を解説します。

回路図

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

30_回路図

7セグメントLEDの3,8番ピンをGNDに接続します。(黒のジャンパ線)

7セグメントLEDの各アノードとGPIOを接続します。今回接続したGPIOと7セグメントのピンの関係は以下のようになります。

7セグLED A(7番ピン):GPIO16:ジャンパ線 白
7セグLED B(6番ピン):GPIO20:ジャンパ線 黄
7セグLED C(4番ピン):GPIO19:ジャンパ線 青
7セグLED D(2番ピン):GPIO27:ジャンパ線 黄
7セグLED E(1番ピン):GPIO17:ジャンパ線 白
7セグLED F(9番ピン):GPIO23:ジャンパ線 オレンジ
7セグLED G(10番ピン):GPIO18:ジャンパ線 青
7セグLED DP(5番ピン):GPIO26:ジャンパ線 オレンジ

今回は右下のドット(DP)を使用しませんが配線はしておきます。(深い理由はありません)

配線の様子

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

31_配線の様子

「この画像から何を読み取れっちゅうねん!」って感じですね…。

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

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

4. プログラム(Python)

GPIOピンを用いて7セグメントLEDに数値0~9を繰り返し表示するプログラム(Python)は以下のようになります。

ソースコード

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

#ポート番号の定義
#7セグで使用するポートをまとめて定義
seg_pin = [
   #A, B,  C,  D,  E,  F,  G,  DP
    16, 20, 19, 27, 17, 23, 18, 26]     #変数"seg_pin"に7セグで使用するポート

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

#7セグで0~9を表示するためのポート
seg = [
    [16, 20, 19, 27, 17, 23],       #"0"
    [20, 19],                       #"1"
    [16, 20, 27, 17, 18],           #"2"
    [16, 20, 19, 27, 18],           #"3"
    [20, 19, 23, 18],               #"4"
    [16, 19, 27, 23, 18],           #"5"
    [16, 19, 27, 17, 23, 18],       #"6"
    [16, 20, 19, 23],               #"7"
    [16, 20, 19, 27, 17, 23, 18],   #"8"
    [16, 20, 19, 27, 23, 18],       #"9"
    ]

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

#while文で無限ループ
#GPIOの電圧を制御
while True:
    try:
        GPIO.output(seg_pin, GPIO.LOW)         #7セグで使用するGPIOの出力をLow(0V)にする
        GPIO.output(seg[desp], GPIO.HIGH)      #7セグに数値を表示       
        time.sleep(1)                          #1秒間待つ
        desp += 1                              #変数"desp"を+1
        if desp >= 10:                         #変数"desp"が10以上であれば↓を実行
            desp = 0                           #変数"desp"に0を代入
        
    except KeyboardInterrupt:                  #Ctrl+Cキーが押された
        GPIO.cleanup()                         #GPIOをクリーンアップ
        sys.exit()                             #プログラムを終了

while文を用いて、7セグメントLEDの各数値に相当する場所のLEDを1秒間隔で表示させます。

プログラムの解説

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

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


#ポート番号の定義
#7セグで使用するポートをまとめて定義
seg_pin = [
   #A, B,  C,  D,  E,  F,  G,  DP
    16, 20, 19, 27, 17, 23, 18, 26]     #変数"seg_pin"に7セグで使用するポート

8~10行目で、変数”seg_pin”に16, 20, 19, 27, 17, 23, 18, 26を格納します。この番号がGPIOのポート番号となり、7セグメントLEDの各LEDに接続されています。

後からGPIOのポート番号を変更する場合はここを変更します。


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

GPIOの設定を行います。

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

GPIO.setup(seg_pin, GPIO.OUT)は、GPIO 16, 20, 19, 27, 17, 23, 18, 26番ポートを出力モードに設定します。


#7セグで0~9を表示するためのポート
seg = [
    [16, 20, 19, 27, 17, 23],       #"0"
    [20, 19],                       #"1"
    [16, 20, 27, 17, 18],           #"2"
    [16, 20, 19, 27, 18],           #"3"
    [20, 19, 23, 18],               #"4"
    [16, 19, 27, 23, 18],           #"5"
    [16, 19, 27, 17, 23, 18],       #"6"
    [16, 20, 19, 23],               #"7"
    [16, 20, 19, 27, 17, 23, 18],   #"8"
    [16, 20, 19, 27, 23, 18],       #"9"
    ]

各数値(0~9)に対応する7セグメントLEDのGPIOのポート番号をリストで代入します。


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

変数”desp”に0を代入します。後ほどこの変数は7セグメントLEDに表示する数値を切替えるために使用します。


#while文で無限ループ
#GPIOの電圧を制御
while True:
    try:
        GPIO.output(seg_pin, GPIO.LOW)         #7セグで使用するGPIOの出力をLow(0V)にする
        GPIO.output(seg[desp], GPIO.HIGH)      #7セグに数値を表示       
        time.sleep(1)                          #1秒間待つ
        desp += 1                              #変数"desp"を+1
        if desp >= 10:                         #変数"desp"が10以上であれば↓を実行
            desp = 0                           #変数"desp"に0を代入
        
    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(seg_pin, GPIO.LOW)         #7セグで使用するGPIOの出力をLow(0V)にする
    GPIO.output(seg[desp], GPIO.HIGH)      #7セグに数値を表示       
    time.sleep(1)                          #1秒間待つ
    desp += 1                              #変数"desp"を+1
    if desp >= 10:                         #変数"desp"が10以上であれば↓を実行
        desp = 0                           #変数"desp"に0を代入

GPIO.output(seg_pin, GPIO.LOW)は7セグメントLEDで使用するGPIOの電圧をすべてLow(0V)にします。

GPIO.output(seg[desp], GPIO.HIGH)は変数”desp”の値を元にリスト型変数”seg”のGPIOをHigh(3.3V)にします。変数”desp”は先ほど0を代入していたので変数”seg”からGPIO 16, 20, 19, 27, 17, 23番ポートがHighになります。

GPIOの出力をHigh(3.3V)にすると各LEDは点灯します。

time.sleep(1)は何もせずに1秒間待ちます。この処理を行うために3行目でtimeモジュールをインポートしています。

desp += 1は変数”desp”をインクリメント(1ずつ加算)します。この変数を変えることで7セグメントLEDの表示内容を変更します。(38行目)

実質、この変数”desp”の数値が7セグメントLEDに表示する数値となるのですが、今回表示する数値は0~9です。変数”desp”をインクリメントし続けて9を超えた場合は変数を0に戻す必要があります。

そこで「if文」を使用して、変数”desp”が10以上であるか判断します。

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

「条件式が”真”の時に実行するコード」であるdesp = 0(42行目)は変数”desp”に0を代入します。これにより変数”desp”が10以上になると0に戻す処理になります。

5. おわりに

ラズベリーパイGPIOピンを用いて7セグメントLEDに数値0~9を繰り返し表示する方法について解説しました。

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

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

コメントを残す

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