8*8LEDマトリックス

8*8 の小型LEDドットマトリックスを紹介します。8*8 ドットがあれば、簡単なロゴや、英字、ひらがな、などが表示できます。これをシリアルに接続すれば、電光掲示板もどきの作成も可能です。

  1. LEDマトリクス:BU5004

     BU5004は8*8の小型LEDアレイ(配列)で、パッチボードに搭載して配線が可能です。(現在この素子は製造中止で入手できませんが、Aitendo から同サイズのデバイスが入手できます GYXM-788ASR ただし、端子の番号は異なります)
    内部は下のような構成です。実際は8*8ですが、簡単のため4*4の図になっています。
     表示器の横のラベル(1657xx等の数字)を読める向きにして左手前が1ピンです。端子は以下のようになります。側面にラベルがある面を下側にしたとき、左下が1ピンです。
      
      BU5004             4*4 の説明図

  2. 表示方法

     C1,..C8 に 8ビット の表示用パターンデータを接続し、R1,..R8 を切り替えて動的点灯します。具体的には、R0,..,R3,.に列表示用の電圧を設定し、C0をLowにすると、左の第一列のLEDが点灯します。R0,..,R3,.に第2列表示用の電圧を設定しC1をLowにすると第2列が点灯します。
     このように、多桁の数字表示どうよう、動的な表示をおこないます。

  3. Arduino MINI

     ドットマトリックス BU5004 は端子数が多く、電流制限用の抵抗も必要とするため、 UNO の上に置くシールドでは収容困難です。また、ドットマトリックスは複数並べて同時に表示すると、電光掲示板への発展ができます。そこで、小型の 「Arduino MINI」 を利用した接続を紹介します。
     mini(正確には Arduino pro mini) は UNO と同じ機能の MPU (ATMEGA328)を搭載しています(写真右)。端子は 下側に D2-D9(D0,D1 は RXT と TXD に同じ)、上側に D10-D13 とA0-A3 があります。A2、A3 の下に、A4、A5 の丸い端子(ランド)があります。D13 の LED も用意されています。MINI ボードには 5V(16MHz)タイプと3.3V(8MHz)タイプの2種あります、動作するクロックが異なります。各種センサーなど多くのデバイスが 3,3v タイプが多なっていますが、モーターコントローラなどは一部は 5V が必要になります。ここでは、3.3V版を利用します。
      USB 接続機能はこのボードにはなく、左の、ICSP端子(DTR,TXD,..,) に、別の 「USB-シリアルアダプタ」を利用します。USBのケーブルも 小型の ミニ型 になります。
     
       
        USBアダプタ                      MINI ボード

     USB アダプタが1枚あれば、複数の MINI ボードに接続可能で、Arduino のシステムを複数利用したり、小型・バッテリー駆動のシステムを組むには便利です。USBアダプタはスイッチの切り替えで対応可能です。3.3V のとき、この電圧はUSBアダプタの電源を利用します。最大は50mAになります。電源はGND(下左から4ピン)とVCC(上左から4ピン)に出力されます。電源を外部から接続するには、RAW(上左から1ピン)を利用します。内部に搭載された3端子電源で安定化されます。
     プログラムを書き込むときは、Arduino の 「ツール」メニューの「マイコンボード」で、対応するボード(Arduino pro mini (5v/3.3V)ATmega328) を選択します。ブレッドボードで利用する場合、ピンヘッダを「半田付け」する必要があります。「半田付け」は付録を参照ください。USBアダプタを初めて利用する場合、ドライバーが要求される場合があります。FTDI 社から 「FT232R」用のドライバーを取り寄せてください。

  4. BU5004接続回路

     アナログ端子、A0,..A5 は標準では アナログ入力端子として利用しますが、pinMode() で設定すれば、出力端子としても利用できます。また、A0(1,2) 端子は デジタル端子の14(15,16)として指定することができます。
     BU5004の端子番号は以下のようになります。
      
    記号 R0 R1 R2 R3 R4 R5 R6 R7
    ピン番号 16 1 14 13 5 6 9 8
    記号 C0 C1 C2 C3 C4 C5 C6 C7
    ピン番号 7 4 3 2 10 11 12 13

    1列の表示で最大8個のLEDを点灯します。ドライバーなしで直接 MINI の端子で制御するには、LEDあたりの電流を3mA 程度に制限する必要があります。順方向電圧を2Vとすると、電源3.3V の場合 電流制限抵抗は 330Ω程度になります。そこで、LEDアレイの端子(R7..R0)を MINI の D2..D9 に抵抗 330 オームを通して接続します。またLEDアレイの端子(R0..R7)をMINI のD10..D13、A0,..A3 に接続します。
     回路図は実体配線図とは異なり、端子の位置は論理的な機能で並べ直します。たとえば、MINI のD10に接続するLEDアレイの端子はR0:16番端子であり、実物では上側から左から1番目の端子になります。


        MINI と ドットマトリックスの接続                                      接続回路

  5. ドット表示プログラム

     最初に、pattern[]配列に列方向に点灯パターンを設定します。下に例の場合、pattern[1]=0x24 ですから 00100100 になり、第2列では上から3と6番のLEDが点灯します(一番上を1と数えます)。
    digitalWrite(PIN_COL1 + col,(data >> col & 0x1)) で、PIN_COL1 + col で行方向の端子を指定します。data >> col でdata を col 回右シフトし、 & 0x1 で一番左のビットをとりだしています。
    //8×8ドットマトリクスLED
    
    //配線 BU5004:DMとする
    //D2〜D9:330Ω抵抗を介して DM の 7,4,3,2,10,11,12,15と MINIの D2-D9
    //DMの 16,1,14,13 を MINIの D10-D13、DMの5698を MINIのA0〜A3 に接続
    
    //ドットパターン(縦列データ)
    int pattern[] = {0,0x24,0x7e,0x7e,0x7e,0x3c,0x18,0};
    
    //1番目のピン(ここから8箇所連続する)
    const int PIN_COL1 = 2;//COL(横)の1番目
    const int PIN_ROW1 = 10;//ROW(縦)の1番目
    
    void setup(){
    //ピンの設定 ピン番号 0..13 は D0..D14に対応
    //ピンの設定 ピン番号 14..19は A0..A5に対応
    
     for(int i = 0; i < 8;i++){
      pinMode(PIN_COL1 + i,OUTPUT);
      pinMode(PIN_ROW1 + i,OUTPUT);
     }//for
    
    }//setup
    
    void loop(){
    
     for(int k = 0;k < 10;k++){
    //間延びで10回
      for(int row = 0;row < 8;row++){
       int data = pattern[row];//列の点灯パターン
    //   int data = 0xff;//1line  
       //各列のドットを表示
       for(int col = 0;col < 8;col++)
        digitalWrite(PIN_COL1 + col,(data >> col & 0x1));//1ドット×8
       digitalWrite(PIN_ROW1 + row,LOW);//列方向の端子をLにして表示
       delay(4);
       digitalWrite(PIN_ROW1 + row,HIGH);//表示終了
      }//for row
     }//for k
    
    }//loop

  6. スクロール表示

     8*8 のドットマトリックスでは1文字程度しか表示できません。8*n ドットの配列をスクロールしながら表示するプログラムを紹介します。スクロール表示するパターンを scpat[] に作成します(行数がscsize)。この配列から、8行分を切り出して、pattern[] にコピーします。この時、1行づつずらしながらコピーすると、スクロール表示ができます。コピーする先頭を sco に記録します。
     
    //8×8ドットマトリクスLED
    //スクロール表示をする
    
    //表示するドットパターン
    int pattern[] = {
      B00000000,
      B00011110,
      B00010010,
      B11111111,
      B00010010,
      B00011110,
      B00000000,
      B00000000,
    } ;
    //中京の文字
    int scpat[] = {
      B00000000,
      B00011110,
      B00010010,
      B11111111,
      B00010010,
      B00011110,
      B00000000,
      B00000000,
      B00000000,
      B00000010,
      B10111010,
      B00101010,
      B11101011,
      B00101010,
      B10111010,
      B00000010,
    } ;
    
    int scsize=16;
    int sco;
    //1番目のピン(ここから8箇所連続する)
    const int PIN_COL1 = 2;//COL(横)の1番目
    const int PIN_ROW1 = 10;//ROW(縦)の1番目
    
    void setup(){
    //ピンの設定 ピン番号 0..13 は D0..D14に対応
    //ピンの設定 ピン番号 14..19は A0..A5に対応
    
     for(int i = 0; i < 8;i++){
      pinMode(PIN_COL1 + i,OUTPUT);
      pinMode(PIN_ROW1 + i,OUTPUT);
     }//for
     sco=0;
    }//setup
    
    void loop(){
       
     for(int k = 0;k < 7;k++){
    //間延びで10回
      for(int row = 0;row < 8;row++){
       int data = pattern[row];//列の点灯パターン
    //   int data = 0xff;//1line  
       //各列のドットを表示
       for(int col = 0;col < 8;col++)
        digitalWrite(PIN_COL1 + col,(data >> col & 0x1));//1ドット×8
       digitalWrite(PIN_ROW1 + row,LOW);//列方向の端子をLにして表示
       delay(2);
       digitalWrite(PIN_ROW1 + row,HIGH);//表示終了
      }//for row
     }//for k
     
    //スクロールする
     sco++;
     if(sco>scsize) sco=0;
     for(int i=0;i<8;i++){
       pattern[i]=scpat[(sco+i)%scsize];
     }
    }
      MINI ボードによる接続と表示例


  7. 発展

    1. ドットパターンをデザインするツールはありませんか

      8*40 のドットをデザインするツールが下記のHPにあります。    http://hi-rom.com/blog/wp-content/uploads/2011/10/Dotsduino_Designer.html
      これを利用して適当なロゴをスクロール表示してください。
    2. 複数のドットマトリックスで表示する方法はありませんか?

      また、同じ回路を複数表示し、シリアル接続を利用し入力した1バイトを新規の1列としてシフトします。しシフトアウトしたデータを隣のドット表示回路に送信します。このようなシフト機能付きドット表示をn台作成して接続すれば、読みやすい電子掲示板が作成できます。

       
    3. 8*8で表示するフォントはありませんか?

      8*8 の フリーの漢字パターンとして美咲Font( http://www.geocities.jp/ littlimi/ misaki.htm#license)などが利用できます。 これを利用した、電子掲示板を続編で予定しています。