LEDバーアレイ

LEDバーアレイは10個のLEDが組み込まれたデバイスで、複数集めると動的な棒グラフの表示ができます。各LEDにUNOから直接に接続をすると手間なので、シフトレジスターを用いて、UNO からは2本の信号で制御する方法を紹介します。この方法は、後のSPIやI2Cによるシリアル接続の基礎となります。

  1. LEDバー

     LEDバーはLEDを棒状に並べた表示器で、ここで使用する B-1000x(ParaLight社)は緑から赤色に 10個のLEDを並べた表示器です。


    内部はつぎのようなLEDのアレイです。1ピンは、側面に文字が印字されている側になります。
     

  2. 遠隔制御と MINI ボード

     LEDの各端子に直接LEDバーを接続すると10本の信号線が必要です。これでは、制御する側と表示器が離れている場合、配線作業に手間がかかります。そこで、シリアル通信方式を利用し、2本の信号線でLEDバーの点灯制御を試みます。
     左側が mini バード、右側が シフトレジスタを搭載したLEDバー側のボードになります。mini ボードについては前の章(「パターン表示」)を参照ください。
     
  3. シフトレジスタと端子

     8ビットのシフトレジスタを用いると2本のシリアル制御用の端子で8個のLEDを点灯できます。ここで利用するシフトレジスタ(74HC164)は 「74HCファミリー」の小規模のディジタル回路(IC)です。 写真の形状はDIP((Dual Inline Package)型のパッケージで、図で左下が1ピンになります。このファミリーはCMOS型で、電源電圧 3.3V でも動作します。

      
       外観               ピン番号と端子         論理記号

     電源として、右下(7ピン)にグランド、左上(14ピン)に5Vを接続します。内部に8ビットの記憶機能があり、各ビットの出力端子が QA,QB,...、OH となります。CLR 端子を LOW にすると、QA〜QH はすべて LOW にクリアされます。
     A,B を共にHIGH にして、CK端子 にパルスを入れると QA〜QH の各信号の値が1桁右にシフトし、A & B(A,Bの論理積)の値がQA、元のQAはQBに、.. QGの値がQHに移動します。
     A & B を HIGH にしておけば、パルスの数だけ QA〜QH が HIGH になります。たとえば、パルスを3個入れると、QA,QB,QC が1になり、QD〜QH は LOW のままです。パルスの数だけ、右シフトが起こり、A & B の値を取り込みます。
     
  4. シフトレジスタ接続回路

     シフトレジスタの QA〜QH を LED バーの B〜I に接続します(LEDバーの残り2本はここでは利用しません)。Mini の D5 を シフトレジスタの CLR に、 D4 を CK に接続します。 バーLEDを別の基盤に実装しても、2本の信号と電源( Vcc, GND)だけで簡単に接続できます。


     ここでは 少し大きなブレッドボードを利用します。このボードでは、上下にある左右に伸びる穴が電源用で、内部で接続されています。ここに、MINI ボードからの電源(3.3Vを接続します(上の赤と下の青/黒)。
     配線の都合上、LEDバーは1ピンを上側に向けて挿入します。74164(シフトレジスタ) は1ピンを左下にして挿入します。シフトレジスタの電源は 7 ピンがグランド、14 ピンが 5V になります。1,2ピンを 5V(Hレベル) にすることを忘れないようにしてください。
     左上の 緑と黄色の信号線が MINI ボードから出力される CLR と CK の信号です。

  5. シフトレジスタ接続プログラム

    D5(CLR) を一瞬 LOW にすると、QA〜QH を LOWに クリアできます。LOW にした後、HUGH に戻さないと、クリア状態が続きます。
       digitalWrite(D5,HIGH);
       digitalWrite(D5,LOW);
     次に、D4(CLK) に ht 個のパルスを送ります。
       for(i=0;i<ht;i++){
           digitalWrite(D4,HIGH);
           digitalWrite(D4,LOW);
       }
     これで、QAから順に ht 個の出力端子を HIGH に設定できます。たとえば、ht を 3にすると、QA,QB,QC が1になります。
    最初に、B5(CLR)をHIGH、B4(CK)を LOW に設定します。繰り返し部で、B5(シフトレジスタのクリア)をLOW にして、シフトレジスタの QA,,QH をすべてLOW(消燈)にします。次に、HT個のパルスを B4 に送り、シフトレジスタを HTビット HIGHにします。HTを 1..8 まで変化させながら繰り返します。

    //LED Bar
    //CLR:9 D11
    //CLK:9 D10
    
    int ht,i;
    int CLR=11;
    int CLK=10;
    
    void setup(){
     pinMode(CLR,OUTPUT);
     pinMode(CLK,OUTPUT); 
    }
    
    void loop(){
                
      for(ht=0;ht<9;ht++){
       //シフトレジスタをクリア
       digitalWrite(CLR,LOW);
       digitalWrite(CLR,HIGH);
    
        digitalWrite(CLK,LOW);
       //set ht bits   
        for(i=0;i<ht;i++){
          //CLKを送りシフトする
            digitalWrite(CLK,HIGH);
            digitalWrite(CLK,LOW);
        }
        delay(200);
      }
    
    }

  6. シフトレジスタを利用しない場合

     シフトレジスタを用いないで、直接接続する場合の回路とプログラムを紹介します。UNO のD2,D3..D11 に LED 0,1..9 を接続を接続します。LED の抵抗330オームが必要です。


    UNO の端子番号 Di は整数 i で置き換えることができます。
    //LEDバーを順に点灯する
    int BarLED1 = 2;//バーLEDが接続されている一番若いピン
    
    void setup(){
    //モード指定
     for(int i = 0;i <= 10;i++){
      pinMode(BarLED1 + i,OUTPUT);
     }
    }
    
    void loop(){
     for(int i = 0;i <= 10;i++){
      setBar(i);
      delay(500);//
     }//for
    }
    
    //num個のLEDを点灯する
    void setBar(int num){
     int i;
     if(num >= 10) num = 10;
     if(num < 0) num = 0;
      //num個点灯
     for(int i = 0;i < num;i++){
      digitalWrite(BarLED1 + i,HIGH);
     }
     //それ以上は消灯
     for(int i = num;i < 10;i++){
      digitalWrite(BarLED1 + i,LOW);
     }
    }

  7. 発展

    1. シフトレジスタによる接続方法はシリアル接続ですか?

      この方法は、次節以後で紹介する I2C や SPI と呼ばれる標準的な規格で定められたシリアル伝送方式の基本となります。

    2. 10ビット以上のシフトレジスターはありませんか?

      NJU3714D は12bit、TB62701ANは16bitシフトレジスターです。

    3. MINI ボードで 5V版と3.3V版の違いは何ですか?

      電源 5V の場合 16MHz のクロックで動作します。3.3V の場合、 8MHz のクロックになります。