ラズベリーパイは基板上に「GPIO」と呼ばれる、ラズベリーパイ上で作成したプログラムから信号の入力・信号の出力といった制御をすることができるピンが存在します。
信号の入力とは「スイッチのON/OFF」「温度計で室温の計測」といった、ラズベリーパイの外の情報を入力(インプット)してプログラム上で使用することです。
対して、信号の出力とは「LEDを点灯させる」「モータを回す」といった、ラズベリーパイで制御した結果を外に出力(アウトプット)することです。
この記事では、ラズベリーパイのプログラム(Python)からGPIOピンを用いて7セグメントLEDに数値を表示する方法について解説します。※7セグメントとは?後ほど解説します。
本記事では基礎中の基礎である7セグメントLEDにとりあえず数値の”3”と表示させます。0~9を順に表示される方法は別記事で解説を予定しています。
目次
1. 完成イメージ(7セグメントLEDに3と表示)
この記事で完成するものは以下のようになります。
7セグメントLEDはエレベータや電光掲示板など日常でも色々な用途で使用されている電子部品です。
今回は、この7セグメントLEDに数字の3を5秒間表示させます。
2. 使用する部品
今回使用する部品は以下の通りです。
『Raspberry Pi 3 Model B+』を使用します。※2020年1月時点で最新は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に数字を表示する回路を解説します。
回路図は以下のようになります。
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 | :ジャンパ線 オレンジ |
今回は数字の3を表示するだけなので使用しないLEDもありますが、7セグメントLEDの全てのピンにGPIOを接続します。
配線の様子です。こんな感じになりました。
「この画像から何を読み取れっちゅうねん!」って感じですね…。
↑では、フラットケーブルでGPIOの全ピンをブレッドボードに接続しています。回路図と実際の配線は異なる部分がありますがご了承ください。
※電気的には「回路図」と同じ意味です。
4. プログラム(Python)
GPIOピンを用いて7セグメントLEDに数値の3を表示するプログラム(Python)は以下のようになります。
#必要なモジュールをインポート
import RPi.GPIO as GPIO #GPIO用のモジュールをインポート
import time #時間制御用のモジュールをインポート
#ポート番号の定義
#7セグで使用するポートをまとめて定義
seg_pin = [
#A, B, C, D, E, F, G, DP
16, 20, 19, 27, 17, 23, 18, 26] #変数"seg_pin"にリストを格納
#GPIOの設定
GPIO.setmode(GPIO.BCM) #GPIOのモードを"GPIO.BCM"に設定
GPIO.setup(seg_pin, GPIO.OUT) #GPIO(8ヶ)を出力モードに設定
#7セグで"3"を表示するためのポート
seg_3 = [
#A, B, C, D, G,
16, 20, 19, 27, 18] #変数"seg_3"にリストを格納
#GPIOの電圧を制御
GPIO.output(seg_3, GPIO.HIGH) #GPIO(5ヶ)の出力をHigh(3.3V)にする
time.sleep(5) #5秒間待つ
GPIO.output(seg_3, GPIO.LOW) #GPIO(5ヶ)の出力をLow(0V)にする
#GPIOをクリーンアップ
GPIO.cleanup()
極端に言うと、GPIOの16,20,19,27,18番ポートの電圧をプログラム(Python)からHigh(3.3V)にして7セグメントの3の部分のLEDを5秒間点灯させているプログラムです。
#必要なモジュールをインポート
import RPi.GPIO as GPIO #GPIO用のモジュールをインポート
import time #時間制御用のモジュールをインポート
2,3行目で、今回必要な「モジュール」を宣言します。
#ポート番号の定義
#7セグで使用するポートをまとめて定義
seg_pin = [
#A, B, C, D, E, F, G, DP
16, 20, 19, 27, 17, 23, 18, 26] #変数"seg_pin"にリストを格納
7~9行目で、変数”seg_pin”に16,20,19,27,17,23,18,26を格納します。この番号がGPIOのポート番号となり、7セグメントLEDの各LEDに接続されています。(今回のように数字の3を表示するだけであれば本当は5ヶのGPIOだけで済みます。)
後からGPIOのポート番号を変更する場合はここを変更します。
#GPIOの設定
GPIO.setmode(GPIO.BCM) #GPIOのモードを"GPIO.BCM"に設定
GPIO.setup(seg_pin, GPIO.OUT) #GPIO(8ヶ)を出力モードに設定
12,13行目で、GPIOの設定を行います。
GPIO.setmode(GPIO.BCM)は、GPIO.setmode()を用いてGPIOをポート番号で扱う方法に設定します。
GPIO.setup(seg_pin, GPIO.OUT)は、GPIO.setup()を用いて変数”seg_pin”に格納されているGPIO 16,20,19,27,17,23,18,26番ポートを出力モードに設定します。
#7セグで"3"を表示するためのポート
seg_3 = [
#A, B, C, D, G,
16, 20, 19, 27, 18] #変数"seg_3"にリストを格納
16~18行目で、変数”seg_3”に16,20,19,27,18を格納します。この5ヶのGPIOの先に接続されているLEDが点灯することで、7セグメントLEDが数字の3と表示されます。
#GPIOの電圧を制御
GPIO.output(seg_3, GPIO.HIGH) #GPIO(5ヶ)の出力をHigh(3.3V)にする
time.sleep(5) #5秒間待つ
GPIO.output(seg_3, GPIO.LOW) #GPIO(5ヶ)の出力をLow(0V)にする
GPIO.output(seg_3, GPIO.HIGH)は、GPIO 16,20,19,27,18番ポートの電圧をHigh(3.3V)にします。ここで7セグメントLEDの対象のLEDは3.3Vが印加され点灯します。
time.sleep(5)は、何もせずに5秒間待ちます。この処理を行うために3行目でtimeモジュールをインポートしています。
GPIO.output(seg_3, GPIO.LOW)は、GPIO 16,20,19,27,18番ポートの電圧をLow(0V)にします。ここで7セグメントLEDの対象のLEDは消灯します。
#GPIOをクリーンアップ
GPIO.cleanup()
忘れがちですが、プログラムの最後にはGPIOをクリーンアップします。これが無い場合、GPIOの出力がLOWのままプログラムを終了したとしても、再度プログラムを実行した際に以下のような警告が発生します。
(訳)警告:このチャンネルはすでに使用されていますが、とにかく継続します。
この警告は無視してもプログラムは実行されますが、警告はなるべく無くした方が良いためプログラムの最後にGPIOをクリーンアップすることをおススメします。
5. おわりに
ラズベリーパイのGPIOピンを用いてプログラム(Python)から7セグメントLEDに数値の3を表示する方法を解説しました。
まだまだラズベリーパイ初心者の私ですが、以下の参考書が大変参考にさせて頂いております。
2冊とも初学者にも易しい内容になっており、ゼロからラズベリーパイを始める方にもオススメできる参考書です。
初めて質問させていただきます。
「きじのしっぽ」ブランドでRaspbrryPiを組み込んだ震度計を購入しましたが、震度表示がLEDの点灯数で判断するようになっているので1桁のデジタル数値表示にしたいのですが、どのような方法があるでしょうか?
電子回路無知な私は点灯しているランプを光センサーで感知してデジタル表示器に送ってはどうかと単純な考えしか浮かびません。
それでも、その具体的な回路も理解しているわけでもありません。情けないですがご指導を宜しくお願いします。