ラズベリーパイは基板上に「GPIO」と呼ばれる、ラズベリーパイ上で作成したプログラムから信号の入力・信号の出力といった制御をすることができるピンが存在します。
信号の入力とは「スイッチのON/OFF」「温度計で室温の計測」といった、ラズベリーパイの外の情報を入力(インプット)してプログラム上で使用することです。
対して、信号の出力とは「LEDを点灯させる」「モータを回す」といった、ラズベリーパイで制御した結果を外に出力(アウトプット)することです。
7セグメントLEDとは、数字状に7ヶのLEDを配置した電子部品でエレベータや電光掲示板など日常でも色々な用途で使用されます。ラズパイのGPIOと7セグメントLEDを直接接続すると、1桁表示させるだけでGPIOを7点使用することになります。※右下のドットを含むと8点。
これを7セグメントドライバを使用することでGPIOの数を削減できるとともに、プログラムを簡単にすることができます。
この記事では、ラズベリーパイのプログラム(Python)から7セグメントドライバを用いて7セグメントLEDに数値を表示させる方法を解説します。
7セグメントLEDを直接GPIOに接続して数値を表示させる方法は以下のページで解説しておりますので、宜しければご覧ください。
【ラズパイ電子工作】7セグメントLEDに数値を表示させる方法 【ラズパイ電子工作】7セグメントLEDに繰り返し数値(0~9)を表示させる方法 【ラズパイ電子工作】7セグメントLEDの数値をスイッチで増減させる方法目次
1. 完成イメージ(7セグメントLEDに5と表示する)
この記事で完成するものは以下のようになります。
7セグメントLEDはエレベータや電光掲示板など日常でも色々な用途で使用されている電子部品です。
今回はこの7セグメントLEDに7セグメントドライバTC4511BPを用いて数字の5を3秒間表示させます。
2. 使用する部品
今回使用する部品は以下の通りです。
『Raspberry Pi 3 Model B+』を使用します。※2020年8月時点で最新は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の一番上の横棒が点灯します。
今回のようなカソードがまとめられていることをカソードコモンと呼び、逆にアノードがまとめられている場合はアノードコモンと呼びます。
7セグメントドライバTC4511BPは、表示したい数値を2進数で入力すると、その数値を7セグメントLEDに表示(点灯)させるICです。
ピン接続図は以下の通りです。
↑の1,2,6,7番(B,C,D,A)ピンに2進数を入力すると、7セグメントLEDにその数値を表示するように9~15番(a~g)ピンを出力します。
例えば、7セグメントLEDに5(2進数だと0101)と表示する場合、2,7番(C,A)ピンをHighにすることで、13,11,10,15,14番(a,c,d,f,g)ピンがHighになります。
LEDなど電子部品は適した電圧と電流が決められており、それ以上の電流を流してしまうと壊れてしまう場合があります。
抵抗は電流の流れを抑えることで、部品に流れる電流を抑える役割を担います。
今回は220Ω(オーム)の抵抗器を、7セグメントLEDの各アノード側に使用します。
電子工作をするため、これまで解説した部品の他にもスイッチやセンサなど、色々な部品が必要になってきます。個々で購入するには手間がかかるため、最初はセット品を購入することをおススメします。
私は以下のセット品を購入しました!
また、これからラズベリーパイを購入する場合、ラズベリーパイ本体を含めたセット品を購入することをおススメします。
ラズベリーパイ本体を収めるケースや、OSをインストールするためmicroSDカードなど必要なものを個々に購入する手間を省くことができます。
3. 回路図・配線の様子
ラズベリーパイのプログラム(Python)から7セグメントドライバを用いて7セグメントLEDに数値を表示させる回路を解説します。
回路図は以下のようになります。
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を接続します。
7セグメントドライバの9~15番(a~g)ピンと7セグメントLEDの各アノードを接続します。(220Ωの抵抗経由)
配線の様子です。こんな感じになりました。
↑では、フラットケーブルでGPIOの全ピンをブレッドボードに接続しています。回路図と実際の配線は異なる部分がありますがご了承ください。
※電気的には「回路図」と同じ意味です。
4. プログラム(Python)
7セグメントドライバを用いて7セグメントLEDに数値を表示させるプログラム(Python)は以下のようになります。
#必要なモジュールをインポート
import RPi.GPIO as GPIO #GPIO用のモジュールをインポート
import time #時間制御用のモジュールをインポート
#ポート番号の定義
seg_pin = [
#A, B, C, D
5, 6, 13, 19] #変数"seg_pin"にドライバで使用するポート
#GPIOの設定
GPIO.setmode(GPIO.BCM) #GPIOのモードを"GPIO.BCM"に設定
GPIO.setup(seg_pin, GPIO.OUT) #GPIO(4ヶ)を出力モードに設定
#7セグLEDに表示する数値
seg_number = 5 #変数"seg_number"に5を代入
#初期化処理
i = 0 #変数"i"に0を代入
#7セグLEDに数値を表示させる処理
while i < 4:
GPIO.output(seg_pin[i], seg_number & (0x01 << i)) #7セグメントドライバに2進数を出力
i = i + 1 #変数"i"をインクリメント
time.sleep(3) #3秒間待つ
GPIO.output(seg_pin, GPIO.LOW) #7セグメントドライバに0を出力
#GPIOをクリーンアップ
GPIO.cleanup()
7セグメントドライバに表示させる数値の2進数を出力します。今回は5を表示させるため、2進数”0101”を出力します。
#必要なモジュールをインポート
import RPi.GPIO as GPIO #GPIO用のモジュールをインポート
import time #時間制御用のモジュールをインポート
2,3行目で今回必要な「モジュール」を宣言します。
#ポート番号の定義
seg_pin = [
#A, B, C, D
5, 6, 13, 19] #変数"seg_pin"にドライバで使用するポート
変数”seg_pin”に5,6,13,19を代入します。この数値は7セグメントドライバに出力するGPIOのポート番号として扱い、後からポート番号を変更する場合はこの数値を変更します。
#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ヶを出力モードに設定します。
#7セグLEDに表示する数値
seg_number = 5 #変数"seg_number"に5を代入
変数”seg_number”に5を代入します。この数値は7セグメントLEDに表示させる数値です。
#7セグLEDに数値を表示させる処理
while i < 4:
GPIO.output(seg_pin[i], seg_number & (0x01 << i)) #7セグメントドライバに2進数を出力
i = i + 1 #変数"i"をインクリメント
「while文」は条件を指定して、その条件が真の時に繰り返し処理を行うものです。
while 条件式:
繰り返し処理を行うコード
↑の「条件式」にi < 4
を指定することで、変数iが4未満の場合に繰り返し処理を行います。
GPIO.output(seg_pin[i], seg_number & (0x01 << i))
は、7セグメントLEDに表示する数値を2進数にして7セグメントドライバに出力します。
i = i + 1
は変数iをインクリメントします。
time.sleep(3) #3秒間待つ
GPIO.output(seg_pin, GPIO.LOW) #7セグメントドライバに0を出力
time.sleep(3)
は何もせずに3秒間待ちます。この間、7セグメントLEDには数値5が表示されています。
GPIO.output(seg_pin, GPIO.LOW)
は7セグメントドライバに2進数の0000を出力して7セグメントLEDに数値0を表示させます。
5. おわりに
ラズベリーパイのプログラム(Python)から7セグメントドライバを用いて7セグメントLEDに数値を表示させる方法を解説しました。
まだまだラズベリーパイ初心者の私ですが、以下の参考書が大変参考にさせて頂いております。
2冊とも初学者にも易しい内容になっており、ゼロからラズベリーパイを始める方にもオススメできる参考書です。