Arduinoで7セグメント LED を使う

Arduino
Arduino+7セグメントLED実験

今回は、数字を表示するための『 7セグメント LED 』を使ってみます。

7セグメントLED

概要

7セグメントLEDは、数字を表示するのに使用されてきた古い部品です。ほとんどの場合、数字の形を表す7つの LED +小数点を表す1つの LED が下図のように配置されています。

数字を表す部分の LED は『 a 』~『 g 』、小数点は『 dp 』の記号で表されます。

内部回路

内部の回路は2種類あります。

カソードコモン

この回路では、LED のアノード側が個別の端子となり、カソード側は1つにまとめられています。このような接続になっているものをカソードコモン型(またはコモンカソード型)といいます。

カソードコモン型の 7セグメントLED を Arduino などワンボードマイコンから制御する場合、アノード a ~ g、dp を電流制限抵抗を経由してワンボードマイコンの出力端子に接続し、common は GND に接続します。ワンボードマイコンの出力端子を HIGH にすると対応する LED が発光します。

アノードコモン

先の例とは逆に、LED のアノード側が1つにまとめられ、カソード側が個別の端子になっています。このような接続になっているものをアノードコモン型(またはコモンアノード型)といいます。

コモンカノード型の7セグメントLED を Arduino などワンボードマイコンから制御する場合、カソード a ~ g 、dp を電流制限抵抗を経由してワンボードマイコンの出力端子に接続し、common は +5V など電源のプラス側に接続します。ワンボードマイコンの出力端子を LOW にすると対応する LED が発光します。

発光パターン

文字パターンと、カソードコモン(HIGHだと点灯)の場合の端子電位の例を示します。文字パターンには、0が下半分だけ・6の上の横棒がない・9の下の横棒がない、などの異体もあります。

数字abcdefg表示
0HIGHHIGHHIGHHIGHHIGHHIGHLOW
1LOWHIGHHIGHLOWLOWLOWLOW
2HIGHHIGHLOWHIGHHIGHLOWHIGH
3HIGHHIGHHIGHHIGHLOWLOWHIGH
4LOWHIGHHIGHLOWLOWHIGHHIGH
5HIGHLOWHIGHHIGHLOWHIGHHIGH
6HIGHLOWHIGHHIGHHIGHHIGHHIGH
7HIGHHIGHHIGHLOWLOWLOWLOW
8HIGHHIGHHIGHHIGHHIGHHIGHHIGH
9HIGHHIGHHIGHHIGHLOWHIGHHIGH

製作

使用部品

部品数量備考
ブレッドボード1小さなものでOK
7セグメントLED1カソードコモンのもの
抵抗(220Ω)74本帯では赤赤茶+誤差、5本帯では赤赤黒黒+誤差
ジャンパ線8黒×1、黄×7がオススメ
7セグメントLED、抵抗

今回の制作例ではカソードコモン型の7セグメント LED 、5161AS を使用します。

データシートによると、5161AS の順方向電圧降下 \(V_F\) は 1.8 V です。電流の最大定格は 30 mA なので、多少余裕を持って点灯時の電流を \(I_F\)=10 ~ 20 mA とすると、電流制限抵抗 \(R\) は、

\(I_F\)=10 mA のとき \(R=\displaystyle\frac{V_o-V_F}{I_F}=\frac{5.0-1.8}{10\times 10^{-3}}=320\)

\(I_F\)=20 mA のとき \(R=\displaystyle\frac{V_o-V_F}{I_F}=\frac{5.0-1.8}{20\times 10^{-3}}=160\)

というわけで、電流制限用として 160 ~ 320 Ω 程度の抵抗を挿入するのが適当ということになります。今回は部品箱に大量に在庫していた 220 Ω を使用しています。

※カソードコモン型の7セグメントLEDなら他の品番のものでも同じ回路同じプログラム使用可ですが、電流制限抵抗はデータシートを参照して計算して下さい。

製作・実行

回路

今回はほとんど何も考えず、Arduino のデジタル出力端子から電流制限抵抗を経由して7セグメント LED の各端子に接続します。 LED 1つを制御したときの回路を8組つくっているのと同じです。今回はdp(小数点に対応する端子)にはなにも接続していませんが、もし使ってみたい場合は a ~ g と同様に抵抗器を介して Arduino の空いているデジタル出力端子( D9 など)に接続して下さい。

出力端子は D0・D1 を使わず D2 ~ D8 の 7つを LED の制御に使用します。実は D0・D1 は PC とのシリアル通信インターフェイスにも使われている(USB コネクタと回路を共有している)ため、LED の制御に使用すると PC との通信ができなくなってしまうのです。

※Arduino の基板をよく見ると、D0 端子には Rx、D1 端子には Tx と、シリアル通信用の端子名も書かれています

配線

図を参考に配線して下さい。LED の各端子への配線を間違えないように注意して下さい。

1. 図を参考にして、7セグメントLED をブレッドボードの適当な位置に挿す

2. Arduino の GND 端子(3つあるうちのどれでもいい) と 7セグメントLED の コモン端子(下の中央の足)を黒いジャンパ線で接続

3. 図を参考にして、220 Ω の抵抗の一方の足7セグメント LED の a 端子と同じ列 に、
もう一方の足ブレッドボードのまだなにも挿していない列 に挿す。7セグメントLED とは反対側の脚を a’ とする。

4. 同様に、7セグメントLED の b ~ g 端子と、ブレッドボードの空いている列の間に 220 Ω の抵抗を挿していく。抵抗の 7セグメントLED とは反対側の脚を b’ ~ g’ とする。

※ブレッドボードは中央の溝を境に上下は別の列という扱いです

5. a’ と同じ列の穴Arduino の D2 端子 を黄色のジャンパ線で接続する。b’ ~ g’ について、それぞれ Arduino の D3 ~ D8 端子 と接続していく。

プログラム

Arduino IDE を起動し、以下のソースコードを入力します。

C++
int pattern[10][7]={{HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,LOW },
                    {LOW ,HIGH,HIGH,LOW ,LOW, LOW, LOW },
                    {HIGH,HIGH,LOW, HIGH,HIGH,LOW, HIGH},
                    {HIGH,HIGH,HIGH,HIGH,LOW, LOW, HIGH},
                    {LOW, HIGH,HIGH,LOW, LOW, HIGH,HIGH},
                    {HIGH,LOW, HIGH,HIGH,LOW, HIGH,HIGH},
                    {HIGH,LOW, HIGH,HIGH,HIGH,HIGH,HIGH},
                    {HIGH,HIGH,HIGH,LOW, LOW, LOW, LOW },
                    {HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH},
                    {HIGH,HIGH,HIGH,HIGH,LOW, HIGH,HIGH}
};

int pinNo[7] = {2,3,4,5,6,7,8};

void display(int n){
  for(int i=0;i<7;i++){
    digitalWrite(pinNo[i], pattern[n][i]);
  }
}

void setup() {
  for(int i=0;i<7;i++){
    pinMode(pinNo[i], OUTPUT);
  }
}

void loop() {
  for(int n=0; n<10; n++){
    display(n);
    delay(1000);
  }
}

プログラムの解説

文字パターンは2次元配列で
C++
int pattern[10][7]={{HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,LOW },
                    {LOW ,HIGH,HIGH,LOW ,LOW, LOW, LOW },
                    {HIGH,HIGH,LOW, HIGH,HIGH,LOW, HIGH},
                    {HIGH,HIGH,HIGH,HIGH,LOW, LOW, HIGH},
                    {LOW, HIGH,HIGH,LOW, LOW, HIGH,HIGH},
                    {HIGH,LOW, HIGH,HIGH,LOW, HIGH,HIGH},
                    {HIGH,LOW, HIGH,HIGH,HIGH,HIGH,HIGH},
                    {HIGH,HIGH,HIGH,LOW, LOW, LOW, LOW },
                    {HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH},
                    {HIGH,HIGH,HIGH,HIGH,LOW, HIGH,HIGH}
};

プログラムの最初の部分では、7セグメント LED で表示する文字『 0 』~『 9 』について、各セグメントの発光パターンを int 型の2次元配列 pattern[][] で定義しています。

pattern[number][segment]

number は、表示したい数字 0 ~ 9 を表します。

segment は、添字の整数値 0 ~ 6 が 7セグメントLED の a ~ g と対応しています。

値が HIGH なら点灯、LOW なら消灯を表しています。

出力端子の指定
C++
int pinNo[7] = {2,3,4,5,6,7,8};

グローバル変数 pinNo[] は、出力端子の番号を指定しています。 pinNo[0] ~ pinNo[6] が、それぞれ7セグメントLEDの a ~ g に接続するArduinoのデジタル出力端子番号を表します。

独自関数の定義と呼び出し

今回は、文字の表示のために独自の関数 display() を定義しています。関数とは、きまった処理に名前をつけていつでも呼び出せるように定義しておくものです。数学で言う『関数』と違い、必ずしも『値』を出力する必要はありません。

関数の定義の書式は以下の通りです。

返却値の型 関数名(引数リスト){
   処理内容
}

返却値の型は、関数が何らかの値を返す場合にその型を記述します。今回の例のように返却値が不要な場合は『 void 』と記述します。

関数名は、英字で始まり英数字が続く文字列で名前をつけることができます。

引数リストは、関数の処理に与えるパラメータを記述します。型名+仮引数名を、必要個数だけカンマ区切りで並べて記述します。引数が不要な場合は丸括弧のみ『( )』と記述します。

処理内容の中では、引数リストで仮引数として定義した名前を普通の変数のように扱うことができます。返却値の型としてvoid 以外を指定した場合は、return 文で宣言通りの型の値を返す必要があります。

関数を呼び出す場合は、

関数名(引数)

とします。

なお、本来のC言語には『関数は呼び出す前に(ソースコードで前の行になるように)定義する』というルールがありますが(本項のサンプルもそうしていますが)、Arduinoの開発言語ではJavaなどと同様、ソースコードのどの位置に定義しても呼び出せます。

C++
void display(int n){
  for(int i=0;i<7;i++){
    digitalWrite(pinNo[i], pattern[n][i]);
  }
}

このプログラムでは、引数として表示したい数字を整数型で受け取り、配列 pattern に定義されている HIGH/LOW のパターンを各セグメントに出力しています。

setup() の初期設定
C++
void setup() {
  for(int i=0;i<7;i++){
    pinMode(pinNo[i], OUTPUT);
  }
}

setup() 関数の中では、pinMode() 関数を使って D2 ~ D8 端子を出力に設定しています。for ループのカウンタ変数 i は 0 ~ 6 の範囲で変化しますが、piMode 関数では pinNo[i] を引数としているのでピン番号の指定は 2 ~ 8 となります。

全体の動作

C++
void loop() {
  for(int n=0; n<10; n++){
    display(n);
    delay(1000);
  }
}

loop() 関数では、カウンタ変数 n を 0 ~ 9 の範囲で順次カウントしながら関数 display(n) を呼び出しています。delay(1000) がありますので、1度呼び出すと 1,000 ms =1秒プログラムが休止します。

よって、1秒ごとに『 0 』→『 1 』→『 2 』→ … →『 9 』とLEDに表示をしていきます。

コンパイル&実行

それでは、PCとArduinoをUSBケーブルで接続し、スケッチをコンパル&実行してみましょう。

まとめ

  • 7セグメント LED は、数字を表示するための部品である
  • 7セグメント LED は、7つ(小数点も入れると8つ)の LED が内蔵されている
  • 7セグメント LED には アノードコモンとカソードコモンという2つの型があり、回路の組み方や制御の仕方が違う

コメント

タイトルとURLをコピーしました