7素子数字表示

電卓などでおなじみの表示器で、7本の表示素子(多くは棒状のLED)を数字の形にならべ、0-9 の形になるように発光させます。手軽で安価な表示素子ですが、配線が多い、液晶に比べて消費電力がやや多いのが難点です。夜や室外での視認性は良好です。

  1. 1ケタ表示素子

     下図(C-551SRD)は1ケタの数字表示器です(7セグメント表示器とも呼びます)。右図のように7個のLEDの集合体です。表示位置にしたがい、a,b,..,g  の番号をつけます。各LEDは 右の図のように端子に接続されています。A (7ピン)から 3または 6ピンに電流を流すと a のセグメントは発光します。DP は右下の小数点表示用です。GND 側は共通で 3 と 8 ピンです。端子の番号は左下が1ピン(E)、右下が5ピン(DP)、右上が6ピン(B)、左上が10ピン(G)になります。
     
     表示器:C-551SRD         セグメントの番号      端子番号

     図のように、内部でカソード(GND側)が共通に接続されている場合、「カソードコモン」と呼びます。逆に + 側が共通になった表示器を アノードコモンと呼びます。

  2. 数字とパターン

     棒状の発光体を7本を 日 の字型に組み合せ、適当に点滅させると、0 から 9 の数字を表示することができます。下の図は 5 と 9 を表示した例です。a の素子を第 0 ビット、h の素子を第 7bitにすると、1は 0000 0110、5は 0110 1101 となります。これを 16進数で表示すると 1は 0x6 、5 は 0x6D となります。


     セグメント番号     表示例

    16進数は 2進数4ビットを下の表のように英数字1文字で表現します。
    10進数 0 1 2 3 4 5 6 7
    2進 0000 0001 0010 0011 0100 0101 0110 0111
    16進 0 1 2 3 4 5 6 7
    10進数 8 9 10 11 12 12 14 15
    2進 1000 1001 1010 1011 1100 1101 1110 1111
    16進 8 9 A B C D E F

    0-9 の表示パターンを 16進数の配列で表現すると、
     byte segment[] = { 0x3f, 0x6, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x7, 0x7F, 0x67};
    となります。

  3. 端子の対応づけ

     素子の数字が読めるように置いたとき、左下が1ピンになります(右上が6ピンで左上が12ピンです)。この反時計まわりの数え方はピンの数が変わっても同じです。表示素子の端子は 1:e, 2:d, 3:dp, 4:c, 5:g, 6:nc 7:b, 8:d1, 9:d2 10:f, 11:a, 12:d3, となります。左の数字がピン番号、右の英字がセグメントの名前です。
     UNO 側の端子と接続する数字表示のセグメント番号を次のように。 D2:a、D3:b、 D4:c、 D5:d、 D6:e、 D7:f、D8:g 、D9:h、 と対応させます。左が UNO の端子、右が接続する数字表示のセグメント名です。

  4. 接続回路

     数字表示器の、A−G の端子を 抵抗330Ωを通して UNO の 2 - 9端子 に接続します。また、GND 端子をArduinoのGNDに接続します。 また、表示器の 3,8 の端子を UNO の GND の接続します。
     
    (下の図はArduino側のピン番号が違います、工事中)

    下の写真では、ディジタル側の端子が下側になっています。これまでの例と UNO の向きが違いますから注意してください。

       接続回路
  5. 数字の表示

     数字のパターンは、segment[ ] で記憶しています。data = segment[i] には i の数字のパタンが記録されています。data を取り出し、第 0 ビットの値で a、第 1 ビットの値で b、 .. を点灯すれば、対応する数字を表示できます。
     a(0ビット) の端子は UNO の D2 端子、b(1ビット)は D3 端子に接続されています。UNOの D2 端子は 数字 2 で指定できますから、data の 第 i ビットの値を、 i + 2 の端子に書き込めばよいことになります。したがって、data の第 isg ビットの値を 対応する UNO の端子に書き込む命令は以下のようになります。
      digitalWrite(2+isg, bitRead(data,isg ));
     ここで、bitRead(data,isg) は、変数 data の isg ビットを読み出す命令です。

  6. 数字の順次表示プログラム

     以下は、数字(num) の値を 数字表示器で表示するプログラムです。表示後 num の値1増加し、10 以上になると 0 に戻します。
    //1ケタ試験用
    //7素子3桁表示 c-533SR
    //0-999の値を数字3桁で表示する
    
    //数字表示器の端子
    //1:E, 2:D, 3:GND, 4:C, 5:DP,
    //6:B 7:A, 8:VCC, 9:G, 10:G
    //UNO端子、抵抗100~300オーム
    //D2:a, D3:b, 48:c, D5:d, D6:e, D7:f,D8:g
    
    //数字のパターン
    byte segment[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7F,0x67};
    byte data;
    int num;
    
    void setup(){
    
      byte i;
      for(i = 2; i <= 15; i++){
        pinMode(i,OUTPUT);
      }
      num=0;
    }//setup
    
    void loop(){
      int isg;  
      data = segment[num];//数字のパターンを読み出す
      //各セグメントを対応する端子で点灯する
       for(isg=0;isg<7;isg++){ //a-gのセグメント設定
         //>>は右シフト、& はand演算 、isg番のbitを表示
         digitalWrite(2+isg,bitRead(data,isg ));
     }
     num=num+1;
     if(num>=10) num=0;//10以上になったら 0 に戻す
     delay(500);
    
    }//loop
    変数numを用意し(int num;)、data = segment[1] ; の 1 を num とし、num の値0から1づつ増加すれば、0-9 が表示できます。ただし、10より大きくなったら 0 に戻します( if (num>10) num=0; )

  7. 発展

    1. 16進数字は表示できますか?

      7素子の数字表示器で16進の文字を表示することができます。ただし、b、c、d、は小文字の表示になります。 0から9までのパターンに加えて A,b,c,d,E,F のパターンの配列を作成すれば、0 から F までの16進文字を表示することができます。
    2. 多桁の表示はできませんか

       3,4 桁の表示モジュールが利用できます。「多桁の数字表示」の節を参照してください。

    3. 表示器にアノードコモンとカソードコモンの2種がありますが?

       複数のLEDを使用する場合、アノード(+側)またはカソード(ー側)が共通の端子になっています。ここで使用した C-551 はカソードコモンのタイプです。