ラズベリーパイは基板上に「GPIO」と呼ばれる、ラズベリーパイ上で作成したプログラムから信号の入力・信号の出力といった制御をすることができるピンが存在します。
信号の入力とは「スイッチのON/OFF」「温度計で室温の計測」といった、ラズベリーパイの外の情報を入力(インプット)してプログラム上で使用することです。
対して、信号の出力とは「LEDを点灯させる」「モータを回す」といった、ラズベリーパイで制御した結果を外に出力(アウトプット)することです。
この記事では、ラズベリーパイのプログラム(Python)からGPIOピンを用いて7セグメントLEDの数値をスイッチ2ヶで増減する方法について解説します。※7セグメントとは?後ほど解説します。
7セグメントLEDを用いた他の記事は以下のページで解説しておりますので、宜しければご覧ください。(今後も増やしていきたいと思います。)
【ラズパイ電子工作】7セグメントLEDに数値を表示させる方法 【ラズパイ電子工作】7セグメントLEDに繰り返し数値(0~9)を表示させる方法目次
1. 完成イメージ(7セグメントLEDに0~9を表示)
この記事で完成するものは以下のようになります。
7セグメントLEDは↑のように数値やアルファベットを表示させる電子部品で、エレベータや電光掲示板など日常でも色々な用途で使用されています。
今回は、この7セグメントLEDに表示する数値をスイッチ2ヶ(黄色と緑色)で増減させます。
2. 使用する部品
今回使用する部品は以下の通りです。
『Raspberry Pi 3 Model B+』を使用します。※2020年4月時点で最新はRaspberry Pi 4になります。
LEDや抵抗といった各種部品や(後述する)ジャンパ線などを穴に差し込み、部品間を電気的に接続する板(ボード)です。
電子工作をする上で必須の部品です。
ブレッドボートに差し込み、電子部品の間を電気的に接続します。
↑の写真では両側が「ピン」になっており、ブレッドボートの穴に差し込んで使用します。
7セグメントLED(seven-segment LED)とは、数字状に7ヶ(※)のLEDを配置した電子部品で、エレベータや電光掲示板など日常でも色々な用途で使用されています。 (※)右下のドットを入れると計8ヶのLEDとなります。
LEDには極性があり、プラス側をアノード(Anode)、マイナス側をカソード(Cathode)と呼びます。
7セグメントLEDもざっくりいうとLEDが8ヶまとまっている部品なので、各LEDにはアノードとカソードがあります。そして、一般的な7セグメントLEDはアノードまたはカソードの端子が部品内部でまとめられています。
以下は7セグメントLED(LEDS5612AUR1C)のデータシートから抜粋したものです。
データシート(右上の回路図)から、7セグメントLEDはカソードが3,8番ピンにまとめられており、アノードが各LED毎で独立しています。(アノードは1,2,4,5,6,7,9,10番ピン)
例えば、7番ピンにプラス側の電圧を掛けてAのLEDを光らせると、7セグメントLEDの一番上の横棒が点灯します。
今回のようなカソードがまとめられていることをカソードコモンと呼び、逆にアノードがまとめられている場合はアノードコモンと呼びます。
LEDなど電子部品は適した電圧と電流が決められており、それ以上の電流を流してしまうと壊れてしまう場合があります。
抵抗は電流の流れを抑えることで、部品に流れる電流を抑える役割を担います。
今回は220Ω(オーム)の抵抗器を、7セグメントLEDの各アノード側に8ヶ使用します。
スイッチを押すと、内部の回路が繋がり電流を流します。
今回は黄色と緑色のスイッチを使用します。
電子工作をするため、これまで解説した部品の他にもスイッチやセンサなど、色々な部品が必要になってきます。個々で購入するには手間がかかるため、最初はセット品を購入することをおススメします。
私は以下のセット品を購入しました!
また、これからラズベリーパイを購入する場合、ラズベリーパイ本体を含めたセット品を購入することをおススメします。
ラズベリーパイ本体を収めるケースや、OSをインストールするためmicroSDカードなど必要なものを個々に購入する手間を省くことができます。
3. 回路図・配線の様子
ラズベリーパイのプログラム(Python)からGPIOピンを用いて7セグメントLEDの数値をスイッチ2ヶで増減する回路を解説します。
回路図は以下のようになります。
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)を使用しませんが配線はしておきます。(深い理由はありません)
黄色スイッチの片側とGPIO 5番ポートを接続します。(黄色のジャンパ線)
黄色スイッチの片側とGPIO 6番ポートを接続します。(緑色のジャンパ線)
各スイッチのもう片側は3.3Vに接続します。(赤色のジャンパ線)
回路図と実際のスイッチの色が異なりますがご了承くださいm(__)m
配線の様子です。こんな感じになりました。
「この画像から何を読み取れっちゅうねん!」って感じですね…。
↑では、フラットケーブルでGPIOの全ピンをブレッドボードに接続しています。回路図と実際の配線は異なる部分がありますがご了承ください。
※電気的には「回路図」と同じ意味です。
4. プログラム(Python)
GPIOピンを用いて7セグメントLEDの数値をスイッチ2ヶで増減するプログラム(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セグで使用するポート
#スイッチのポートを定義
Sw_yellow_pin = 5 #変数"Sw_yellow_pin"に5を代入
Sw_green_pin = 6 #変数"Sw_green_pin"に6を代入
#GPIOの設定
GPIO.setmode(GPIO.BCM) #GPIOのモードを"GPIO.BCM"に設定
GPIO.setup(Seg_pin, GPIO.OUT) #7セグメントLEDのGPIO(8ヶ)を出力モードに設定
#GPIO5を入力モードに設定してプルダウン抵抗を有効にする
GPIO.setup(Sw_yellow_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
#GPIO6を入力モードに設定してプルダウン抵抗を有効にする
GPIO.setup(Sw_green_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
#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(0.3) #0.3秒間待つ
if(GPIO.input(Sw_yellow_pin) == 1): #GPIO5が"1"であるか判断(↓1であれば以下を実行)
Desp -= 1 #変数"Desp"を-1
if(GPIO.input(Sw_green_pin) == 1): #GPIO6が"1"であるか判断(↓1であれば以下を実行)
Desp += 1 #変数"Desp"を+1
if Desp >= 10: #変数"Desp"が10以上であれば↓を実行
Desp = 0 #変数"Desp"に0を代入
if Desp <= -1: #変数"Desp"が-1以下であれば↓を実行
Desp = 9 #変数"Desp"に9を代入
except KeyboardInterrupt: #Ctrl+Cキーが押された
GPIO.cleanup() #GPIOをクリーンアップ
sys.exit() #プログラムを終了
while文を用いて7セグメントLEDの各数値に対応する場所のLEDを点灯させます。
#必要なモジュールをインポート
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のポート番号を変更する場合はここを変更します。
#スイッチのポートを定義
Sw_yellow_pin = 5 #変数"Sw_yellow_pin"に5を代入
Sw_green_pin = 6 #変数"Sw_green_pin"に6を代入
スイッチのGPIO ポート番号を定義します。
黄色スイッチはGPIO 5番ポート、緑色スイッチはGPIO 6番ポートに接続されています。
#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番ポートを出力モードに設定します。
#GPIO5を入力モードに設定してプルダウン抵抗を有効にする
GPIO.setup(Sw_yellow_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
#GPIO6を入力モードに設定してプルダウン抵抗を有効にする
GPIO.setup(Sw_green_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
スイッチで使用するGPIOの設定を行います。
GPIO.setup(Sw_yellow_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
は、GPIO 5番ポートを入力モードに設定して、内部にあるプルダウン抵抗を有効にします。
緑色スイッチが接続されているGPIO 6番ポートも同様に設定を行います。(23行目)
#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(0.3) #0.3秒間待つ
if(GPIO.input(Sw_yellow_pin) == 1): #GPIO5が"1"であるか判断(↓1であれば以下を実行)
Desp -= 1 #変数"Desp"を-1
if(GPIO.input(Sw_green_pin) == 1): #GPIO6が"1"であるか判断(↓1であれば以下を実行)
Desp += 1 #変数"Desp"を+1
if Desp >= 10: #変数"Desp"が10以上であれば↓を実行
Desp = 0 #変数"Desp"に0を代入
if Desp <= -1: #変数"Desp"が-1以下であれば↓を実行
Desp = 9 #変数"Desp"に9を代入
except KeyboardInterrupt: #Ctrl+Cキーが押された
GPIO.cleanup() #GPIOをクリーンアップ
sys.exit() #プログラムを終了
「while文」は条件を指定して、その条件が”真”の時に繰り返し処理を行うものです。
while 条件式:
繰り返し処理を行うコード
↑の「条件式」にTrue
を指定することにより、条件式は常に真となりwhile文は無限に繰り返します。
ただし、このままではプログラム実行中に無限ループから抜け出す方法がありません。そこでwhile文の中にある「try文」と「except文」を使用します。
このtry-except文を用いることにより、while文の処理は以下のようになります。
while True:
try:
繰り返し処理を行うコード
except KeyboardInterrupt: #Ctrl+Cキーが押された
GPIO.cleanup() #GPIOをクリーンアップ
sys.exit() #プログラムを終了
except KeyboardInterrupt:
は、キーボードのCtrl + Cキーが押された時にwhile文の繰り返し処理から抜けて「GPIOのクリーンアップ」と「プログラムの終了」の処理を行います。
Ctrl + Cキーが押されていないとき、try文の中の処理を繰り返し行います。(以下で解説)
while文の中のtry文の中の「繰り返し処理を行うコード」は以下の通りです。つまり、Ctrl + Cキーが押されるまで以下の処理を繰り返します。
GPIO.output(Seg_pin, GPIO.LOW) #7セグで使用するGPIOの出力をLow(0V)にする
GPIO.output(Seg[Desp], GPIO.HIGH) #7セグに数値を表示
time.sleep(0.3) #0.3秒間待つ
if(GPIO.input(Sw_yellow_pin) == 1): #GPIO5が"1"であるか判断(↓1であれば以下を実行)
Desp -= 1 #変数"Desp"を-1
if(GPIO.input(Sw_green_pin) == 1): #GPIO6が"1"であるか判断(↓1であれば以下を実行)
Desp += 1 #変数"Desp"を+1
if Desp >= 10: #変数"Desp"が10以上であれば↓を実行
Desp = 0 #変数"Desp"に0を代入
if Desp <= -1: #変数"Desp"が-1以下であれば↓を実行
Desp = 9 #変数"Desp"に9を代入
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は点灯します。つまり、変数”Desp”の値が7セグメントLEDに表示される数値となります。以下でスイッチの状態によって変数”Desp”の値を増減させます。
time.sleep(0.3)
は何もせずに0.3秒間待ちます。この処理を行うために3行目でtimeモジュールをインポートしています。
if(GPIO.input(Sw_yellow_pin) == 1):
はif文によって黄色スイッチが押されているか判断します。
if 条件式:
条件式が"真"の時に実行するコード
条件式が”真”、つまり黄色スイッチが押されていればDesp -= 1
が実行されます。これは変数”Desp”の値をデクリメント(1ずつ減算)する意味です。
逆に緑色スイッチが押された場合、if(GPIO.input(Sw_green_pin) == 1):
の条件が”真”となりDesp += 1
が実行されます。
スイッチがどちらも押されていない状態では、上記2ヶのif文の条件は”偽”となり、何も実行されずに変数”Desp”の値も変化しません。
if Desp >= 10: #変数"Desp"が10以上であれば↓を実行
Desp = 0 #変数"Desp"に0を代入
if Desp <= -1: #変数"Desp"が-1以下であれば↓を実行
Desp = 9 #変数"Desp"に9を代入
変数”Desp”の数値が7セグメントLEDに表示する数値となりますが、今回表示する数値は0~9です。変数の値が10以上、または-1以下になると変数に値を代入し直す処理を↑のif文で行います。0~9の範囲内の場合はこの処理はスルーします。
5. おわりに
ラズベリーパイのGPIOピンを用いて7セグメントLEDの数値をスイッチ2ヶで増減する方法について解説しました。
まだまだラズベリーパイ初心者の私ですが、以下の参考書が大変参考にさせて頂いております。
2冊とも初学者にも易しい内容になっており、ゼロからラズベリーパイを始める方にもオススメできる参考書です。