Arduinoで実験 (4桁7セグメントLEDを使う)

2013/03/28


◆ 4桁7セグメントLEDを使う

LEDのルーレットや信号機等は直感的に動作の意味がわかるが、同色のLEDを並べているだけでは何が何やらわからなくなってくる。

数字の表示であればぱっと見ただけで意味がわかる。 複数個のLEDを一つのパッケージに収め数字を表現するデバイスが7セグメントディスプレイだ。 より多くのLEDを使用した16セグメント等もある。


7セグメントは各LEDがアノード(+)を共有するアノードコモンとカソード(-)を共有するカソードコモンとがある。

複数桁(たとえば4桁)の7セグメントを一度に点灯させると、点灯させるLEDの個数分の電力と配線(制御線)が必要となります。4桁の7セグで最大32本が必要となり各10mA必要ならば320mAが必要となります。マイコンのみの出力が不可能となります。 このような点灯方式をスタティック・ドライブといいます。

対して、1桁のみを表示させ目には止まらぬ早業で各桁を切り替えていけば、同時に点灯しているLEDは8個のみとなりマイコンで制御できる範囲です。 もちろん目には止まらぬ早業ということは点滅が意識できないほどの速度で表示を切り替えているので、人の目にはあたかも4桁が同時に点灯しているように見えます。 これをダイレクト・ドライブといいます。

 


◆ 一つだけ点灯させる

実験では4桁7セグメントディスプレイを使用しますが、手始めに一つのLEDのみを点灯させてみます。

なお、使用する7セグによりピンの配置や電流が違って来るので、自分の環境に合わせて読み替えてください。 なお、電流制限抵抗の計算式は次の通りです。

電源制限抵抗 = (電源の電圧 - LEDへの電圧)÷LEDへの電流

種別 定格・番 個数 備考
マイコン Arduino UNO 1  
7セグメントディスプレイ アノードコモン 1 Vf = 2.1V / If = 20mA (peak = 30mA)
抵抗 220Ω 8 電流制限抵抗 ≒(5-2.1)/0.15
//
// 03-01 7セグメントディスプレイの実験スケッチ
//

void setup() {
    pinMode(13, OUTPUT); // 13番ピンを出力に設定
}

void loop() {
    digitalWrite(13, LOW); // アノードコモンはLOWで点灯
    delay(1000);
    digitalWrite(13, HIGH);
    delay(1000);
}

7セグの上の部分が点滅したはずです。

為にし13番ピンからAに接続された線をBにつなぎ換えてみると、上部右が点見滅するはずです。 同じようにC~DPへつなぎかえるとどの位置が点灯するか確認できるでしょう。 また、DIG1への配線をDIG2~DIG4へと繋ぐと違う桁が点灯します。


◆ 数字を点灯させる

次は複数点灯させ数字を表現してみます。 配線が多くなるので繋ぎ間違いに注意してください。 特に抵抗を介さずに5Vを流すと一瞬明るくひかりLEDが焼けてしまいます。 5Vのラインは配線を確認して最後に繋ぐ癖をつけましょう。

配線は次の通り。
    6    → 抵抗 → A
    7    → 抵抗 → B
    8    → 抵抗 → C
    9    → 抵抗 → D
    10   → 抵抗 → E
    11   → 抵抗 → F
    12   → 抵抗 → G
    13   → 抵抗 → DP

//
// 03-02 数字の点灯実験スケッチ
//

void setup() {
    pinMode( 6, OUTPUT); // (A)   6番ピンを出力に設定
    pinMode( 7, OUTPUT); // (B)   7番ピンを出力に設定
    pinMode( 8, OUTPUT); // (C)   8番ピンを出力に設定
    pinMode( 9, OUTPUT); // (D)   9番ピンを出力に設定
    pinMode(10, OUTPUT); // (E)  10番ピンを出力に設定
    pinMode(11, OUTPUT); // (F)  11番ピンを出力に設定
    pinMode(12, OUTPUT); // (G)  12番ピンを出力に設定
    pinMode(13, OUTPUT); // (DP) 13番ピンを出力に設定
}

void loop() {
// 数字の1を点灯
    digitalWrite( 6, HIGH);
    digitalWrite( 7, LOW);
    digitalWrite( 6, LOW);
    digitalWrite( 7, HIGH);
    digitalWrite( 6, HIGH);
    digitalWrite( 7, HIGH);
    digitalWrite( 6, HIGH);
    digitalWrite( 7, HIGH);
    delay(1000);

// 数字の2を点灯
    digitalWrite( 6, LOW);
    digitalWrite( 7, LOW);
    digitalWrite( 6, HIGH);
    digitalWrite( 7, LOW);
    digitalWrite( 6, LOW);
    digitalWrite( 7, HIGH);
    digitalWrite( 6, LOW);
    digitalWrite( 7, HIGH);
    delay(1000);

// 数字の3を点灯
    digitalWrite( 6, LOW);
    digitalWrite( 7, LOW);
    digitalWrite( 6, LOW);
    digitalWrite( 7, LOW);
    digitalWrite( 6, HIGH);
    digitalWrite( 7, HIGH);
    digitalWrite( 6, LOW);
    digitalWrite( 7, LOW);
    delay(1000);
}


◆ 2桁の点灯

次に2桁目の点灯を行ってみる。 5VからDIG1への配線を4番ピンからDIG1へ差し替えて以下のスケッチを実行してみる。

//
// 03-03 デジタル出力の点灯実験スケッチ
//

void setup() {
    pinMode( 6, OUTPUT); // (A)   6番ピンを出力に設定
    pinMode( 7, OUTPUT); // (B)   7番ピンを出力に設定
    pinMode( 8, OUTPUT); // (C)   8番ピンを出力に設定
    pinMode( 9, OUTPUT); // (D)   9番ピンを出力に設定
    pinMode(10, OUTPUT); // (E)  10番ピンを出力に設定
    pinMode(11, OUTPUT); // (F)  11番ピンを出力に設定
    pinMode(12, OUTPUT); // (G)  12番ピンを出力に設定
    pinMode(13, OUTPUT); // (DP) 13番ピンを出力に設定

    pinMode( 4, OUTPUT); // (DIG1)
    digitalWrite( 4, HIGH);

}

void loop() {

// 数字の3を点灯
    digitalWrite( 6, LOW);
    digitalWrite( 7, LOW);
    digitalWrite( 6, LOW);
    digitalWrite( 7, LOW);
    digitalWrite( 6, HIGH);
    digitalWrite( 7, HIGH);
    digitalWrite( 6, LOW);
    digitalWrite( 7, LOW);
    delay(1000);

// 前消灯
    digitalWrite( 6, HIGH);
    digitalWrite( 7, HIGH);
    digitalWrite( 6, HIGH);
    digitalWrite( 7, HIGH);
    digitalWrite( 6, HIGH);
    digitalWrite( 7, HIGH);
    digitalWrite( 6, HIGH);
    digitalWrite( 7, HIGH);
    delay(1000);
}

5Vからで無く、4番ピンよりDIG1へ出力しているので表示がちゃんと行える。 次に新たに3番ピンをDIG2へ配線して以下のスケッチを実行してみる。

先頭の #define で切り替え時間を定義している。 これはこの後の実験で説明する。

//
// 03-04 2桁の点灯実験スケッチ
//

#define time 1000;

void setup() {
    pinMode( 6, OUTPUT); // (A)   6番ピンを出力に設定
    pinMode( 7, OUTPUT); // (B)   7番ピンを出力に設定
    pinMode( 8, OUTPUT); // (C)   8番ピンを出力に設定
    pinMode( 9, OUTPUT); // (D)   9番ピンを出力に設定
    pinMode(10, OUTPUT); // (E)  10番ピンを出力に設定
    pinMode(11, OUTPUT); // (F)  11番ピンを出力に設定
    pinMode(12, OUTPUT); // (G)  12番ピンを出力に設定
    pinMode(13, OUTPUT); // (DP) 13番ピンを出力に設定

    pinMode( 4, OUTPUT); // (DIG1)
    digitalWrite( 4, HIGH);

    pinMode( 3, OUTPUT); // (DIG2)
    digitalWrite( 4, LOW);

}

void loop() {

// 数字の3を点灯
    digitalWrite( 4, LOW); // DIG1 を点灯
    digitalWrite( 3, LOW); // DIG2 を消灯
    digitalWrite( 6, LOW);
    digitalWrite( 7, LOW);
    digitalWrite( 6, LOW);
    digitalWrite( 7, LOW);
    digitalWrite( 6, HIGH);
    digitalWrite( 7, HIGH);
    digitalWrite( 6, LOW);
    digitalWrite( 7, LOW);
    delay(time);

// 数字の2を点灯
    digitalWrite( 4, LOW); // DIG2 を点灯
    digitalWrite( 3, LOW); // DIG1 を消灯
    digitalWrite( 6, LOW);
    digitalWrite( 7, LOW);
    digitalWrite( 6, HIGH);
    digitalWrite( 7, LOW);
    digitalWrite( 6, LOW);
    digitalWrite( 7, HIGH);
    digitalWrite( 6, LOW);
    digitalWrite( 7, HIGH);
    delay(time);
}

1秒毎に、異なる桁に数字が表示される。

次は、上記スケッチの time 1000 time 100 に変えて実行してみる。 これ位なら桁が切り替わるのが余裕でわかる。
次に time 50 で実行してみる。 数字は分かるがチカチカしていらいらする。
では time 20 だとどうだろうか。 だいぶ見やすく放ったがやっぱりチカチカする。
最後に time 10 で実験してみる。 するとまったく点滅しなくなった。 人間の目が追いつかなくなって同時に点灯しているように見えている。

2桁で実験を行ってみたが4桁でも理屈は同じことである。 自分でスケッチを変えて試してみてほしい。


◆ 処理の関数化

上記スケッチでは一つの数字を表示するのに直接表示させたい個所を指定している。 これを10行近く使っている。 もっと使いやすい形に変えてゆく。

//
// 03-05 スケッチの簡素化
//

boolean num[10][7]={    // 表示パターンを配列で記憶する。
    {0,0,0,0,0,0,1}, //0
    {1,0,0,1,1,1,1}, //1
    {0,0,1,0,0,1,0}, //2
    {0,0,0,0,1,1,0}, //3
    {1,0,0,1,1,0,0}, //4
    {0,1,0,0,1,0,0}, //5
    {1,1,0,0,0,0,0}, //6
    {0,0,0,1,1,1,1}, //7
    {0,0,0,0,0,0,0}, //8
    {0,0,0,1,1,0,0}, //9
};

void setup() {
    for (int i = 3; i<14; i++) {  // for 文を使用して 3~13 番ピンを初期化
        pinMode(i, OUTPUT);
    }
    digitalWrite( 3, HIGH);
    digitalWrite( 4, LOW);

}

void loop() {
    digitalWrite( 3, HIGH);             // DIG2 を表示
    digitalWrite( 4, LOW);
    for(int i = 0; i<8; i++) {
        digitalWrite(i + 6, num[5][i]);  // 数字の5を表示
    }
    delay(1);
    digitalWrite( 3, LOW);              // DIG1 を表示
    digitalWrite( 4, HIGH);
    for(int i = 0; i<8; i++) {
        digitalWrite(i + 6, num[4][i]);  // 数字の4を表示
    }
    delay(1);
}

◆ 7seguino のライブラリを利用する

morecat_labさん作の 7segino のライブラリやホームページ上のサンプルをそのまま使用したいので、Arduino から 7セグ の配線を次の様に変更する。

--Arduino--           --7seg--
    D3           →        (dig1)
    D4        → R →     (A)
    D5        → R →     (F)
    D6           →        (dig2)
    D7           →        (dig3)
    D8        → R →     (B)
    D9           →        (dig4)
    D10       → R →     (G)
    D11       → R →     (C)
    D12       → R →     (dot)
    D13       → R →     (D)
    A0        → R →     (E)


宿題: シフトレジスタやトランジスタアレイを使用した使い方を追記する。