7セグメントLED(LB-303VK)
いつもの事ながら脱線が始まりました、「ペルチェ素子を使ったロケットストーブ発電をしたい」→「ペルチェ素子の実験でサーミスタで温度測定したい」→「サーミスタで測った温度を7セグメントLEDに表示したい」←今ココ
1. 7セグメントLEDとは?
7セグメントLED(英:seven-segment display、和:7セグメントLED、7セグLED、7セグメントディスプレイ)とは、複数のLEDを1つのパッケージに収めたもので、英数字やバーグラフを表示するためのLEDです。
アノードコモンとは、その名の通りアノード(陽極)をコモン(共通)としたものです。
カソードコモンとは、その名の通りアノード(陰極)をコモン(共通)としたものです。
図1:7セグメントLED及び周辺回路略式図
1.1 LB-303VKとは
今回使用する「LB-303VK」とは、7セグメントLED「LB-303AKシリーズ」の一つです。
シリーズの特徴として、図2に示す通り文字高さ8mmの高効率小型パッケージで、図3に示す11本に配線しダイナミック点灯※1する事で、3桁の英数字を表示出来ます。
また、LB-303AKシリーズは4種類有り、LEDの色が「Red」(型番末尾がV〇)及び「Green」(型番末尾がM〇)、また「アノードコモン」(型番末尾が〇A)もしくは「カソードコモン」(型番末尾が〇K)から選択できます。
今回使用する「LB-303VK」は赤色LED(V)のカソードコモン(K)タイプです。
※1:ダイナミック点灯(ダイナミック・ドライブ)とは、人の目に有る残像現象(約100msec程度)を利用して、10msec程度の短時間1つの桁を光らせたら、すぐ次の桁を光らせるということを高速に繰り返して複数桁を表示する方式の事。ダイナミック点灯の利点として、通常のスタティック点灯で7セグメントLED(D.P含む)を点灯させると、3桁で8×3桁=24本の制御信号が必要となりますが、ダイナミック点灯で行うと11本の制御信号で済みます。
図2:7セグメントLED「LB-303AKシリーズ」の寸法
図3:7セグメントLED「LB-303AKシリーズ」共通のピン配置図
1.2 仕様
7セグメントLED「LB-303AKシリーズ」の仕様は図4の通りです。
図4:7セグメントLED「LB-303AKシリーズ」の仕様
2. ライブラリの導入!
複数桁の7セグメントLEDをダイナミック点灯するには、十数本の信号端子を高速で制御する必要があります。
一番手っ取り早い方法が・・・ライブラリです!( ;∀;)
ライブラリのダウンロードは「GitHub」から以下図5~7の通り行いました。
図5:「Seven segment display controller library for Arduino」からダウンロード
図6:ArduinoIDEでインクルード選択
図7:「SevSeg-master.zip」をArduinoIDEにインクルード!以上
3. 実験回路!
表1の部品を使って、7セグメントLEDの点灯実験をしてみました
表1:使った部品
3.2 プログラム
図9回路で、7セグメントLEDを駆動するプログラムを図10の通り書きました
プログラムをArduinoUNOに書き込む際の注意点として、前に書かれていたプログラムが回路をショートする原因にも成りかねませんので、7セグメントLEDを抜いてからPCにUSBを接続し書き込みます。
プログラムの内容としては、最初に「SevSeg.h」ライブラリのインクルードと初期化を行い、loop関数中で英字「NOB」を表示します。
最後に、「-99~-10」「-9.9~0.0」「0.1~99.9」「100~999」と、4段階に分けて「マイナス」「小数点」を含む、3桁で表示可能な数値を全て表示します。
#include "SevSeg.h"
SevSeg sevseg; //7つのセグメントコントローラオブジェクトをインスタンス化する
void setup() {
byte numDigits = 3;//7SegLedの桁数を入力します。
byte digitPins[] = {6, 5, 3};//Com1~3の順にArduinoが接続されているピン番号を順に記入します。
byte segmentPins[] = {10, 8, 2, 4, 11, 9, 12, 7};// 7Segのa~g,D.pの順にArduinoが接続されているピン番号を記入します。
bool resistorsOnSegments = false; // 'false'はレジスタが桁のピンにあることを意味します
byte hardwareConfig = N_TRANSISTORS; //[COMMON_CATHODE][COMMON_ANODE][N_TRANSISTORS]
bool updateWithDelays = false;//デフォルトは「false;」
bool leadingZeros = false; //先行ゼロを保持する場合は 'true'を使用します
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros);
//sevseg.setBrightness(100);
}
void loop() {
//NOBと表示
for (long k = 0; k < 100000; k++) {//10000
sevseg.setChars("NOB");
sevseg.refreshDisplay();
}
//-99~-10迄(小数点0桁)でカウントアップ
for (float i = -99.0; i < -10; i = i + 0.1) {
for (long j = 0; j < 50; j++) {
sevseg.setNumber(i, 0);
sevseg.refreshDisplay();
}
}
//-9.9~0迄小数点1桁でカウントアップ
for (float i = -9.9; i < 0.0; i = i + 0.1) {
for (long j = 0; j < 500; j++) {
sevseg.setNumber(i, 1);
sevseg.refreshDisplay();
}
}
//0.0~99.9迄小数点1桁でカウントアップ
for (float i = -0.0; i < 99.9; i = i + 0.1) {
for (long j = 0; j < 50; j++) {
sevseg.setNumber(i, 1);
sevseg.refreshDisplay();
}
}
//100~999迄小数点0桁でカウントアップ
for (float i = 99.9; i < 999; i = i + 0.1) {
for (long j = 0; j < 5 ; j++) {
sevseg.setNumber(i, 0);
sevseg.refreshDisplay();
}
}
}
SevSeg sevseg; //7つのセグメントコントローラオブジェクトをインスタンス化する
void setup() {
byte numDigits = 3;//7SegLedの桁数を入力します。
byte digitPins[] = {6, 5, 3};//Com1~3の順にArduinoが接続されているピン番号を順に記入します。
byte segmentPins[] = {10, 8, 2, 4, 11, 9, 12, 7};// 7Segのa~g,D.pの順にArduinoが接続されているピン番号を記入します。
bool resistorsOnSegments = false; // 'false'はレジスタが桁のピンにあることを意味します
byte hardwareConfig = N_TRANSISTORS; //[COMMON_CATHODE][COMMON_ANODE][N_TRANSISTORS]
bool updateWithDelays = false;//デフォルトは「false;」
bool leadingZeros = false; //先行ゼロを保持する場合は 'true'を使用します
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros);
//sevseg.setBrightness(100);
}
void loop() {
//NOBと表示
for (long k = 0; k < 100000; k++) {//10000
sevseg.setChars("NOB");
sevseg.refreshDisplay();
}
//-99~-10迄(小数点0桁)でカウントアップ
for (float i = -99.0; i < -10; i = i + 0.1) {
for (long j = 0; j < 50; j++) {
sevseg.setNumber(i, 0);
sevseg.refreshDisplay();
}
}
//-9.9~0迄小数点1桁でカウントアップ
for (float i = -9.9; i < 0.0; i = i + 0.1) {
for (long j = 0; j < 500; j++) {
sevseg.setNumber(i, 1);
sevseg.refreshDisplay();
}
}
//0.0~99.9迄小数点1桁でカウントアップ
for (float i = -0.0; i < 99.9; i = i + 0.1) {
for (long j = 0; j < 50; j++) {
sevseg.setNumber(i, 1);
sevseg.refreshDisplay();
}
}
//100~999迄小数点0桁でカウントアップ
for (float i = 99.9; i < 999; i = i + 0.1) {
for (long j = 0; j < 5 ; j++) {
sevseg.setNumber(i, 0);
sevseg.refreshDisplay();
}
}
}
図10:プログラムの内容
3.3 実験!
4. まとめ
7セグメントLEDをArduinoUNOで制御してみた結果、少しでも負荷の掛かる処理を加えると・・・表示文字のチラツキが激しく出ます(;'∀')
最終的にはif文4個と計算式少々で表示文字が読めなくなりました
ダイナミック点灯の宿命ですが、「sevseg.refreshDisplay関数」などの方法で表示文字を一定間隔(10ms以下)で更新し続けないといけません!と言う事が分かりましたArduino一個で測定と7セグLED表示するのは厳しいですね・・・。