Arduinoの基礎 - ドットマトリクスLED

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動

概要

ここでは、MAX7219 LEDディスプレイドライバモジュールを使用して8x8ドットマトリクスLEDを制御することにより、流れる文字を表示する。

MAX7219モジュールは、AliExpress等で購入できる。


MAX7219モジュール

ArduinoとMAX7219モジュールは、SPIで接続する。

下図に示すように、MAX7219モジュールの左右にピンがあり、複数のMAX7219モジュールがデイジーチェン接続できるようになっている。
複数接続する場合は、右のIN側から入力して、左のOUT側から次のMAX7219モジュールを接続する。

Arduino DotMatrix 1.jpg



サンプルコード

サンプルコードでは、MaxMatrixライブラリを使用している。
MaxMatrixライブラリは、Google Code( https://code.google.com/archive/p/arudino-maxmatrix-library )からダウンロードできる。
ライブラリには文字を流すサンプルが存在するので、以下のサンプルコードではそれを元に記述している。

まず、MaxMatrixライブラリを使用するために、MaxMatrix.hファイルをインクルードする必要がある。

続いて、文字データをLEDのオン / オフで指定するため、const PROGMEM byte CH[]を定義する。
文字データはサイズが大きいため、PROGMEMを指定することにより、ROMに配置することができる。
(フラッシュメモリのサイズは、Arduino UNOで32[KB]ある)

文字データは、最大5ドット幅の文字を横向きで定義する。
1要素目は文字幅、2要素目は8固定、3〜7要素目は1列分のオン / オフを指定している。
例えば、文字Fでは下図のようになる。また、幅を指定することで、プロポーショナルフォントとして美しく表示できる。

Arduino DotMatrix 2.jpg


MaxMatrixクラスのコンストラクタでは、Arduinoのピンと使用するモジュール数を指定する。
変数maxInUseでモジュール数を指定する。ここでは、2個使用するので2を渡している。(最大8個まで使用できる)

 const int PIN_DIN  = 12;
 const int PIN_CS   = 10;
 const int PIN_CLK  = 11;
 const int maxInUse =  2;
 
 MaxMatrix m(PIN_DIN, PIN_CS, PIN_CLK, maxInUse);


setup関数でMaxMatrixクラスのインスタンスを初期化する。
setIntensityメソッドは、明るさを0〜15までの値で指定できる。

 void setup()
 {
    m.init();
    m.setIntensity(3);
 }


loop関数でprintStringWithShift関数を呼び出して、文字のスクロールを繰り返し実行する。
memcpy_P関数は、PROGMEM(フラッシュメモリ)へのアクセス時に使用する。これは、AVR Libcのavr/pgmspace.hで宣言されている。

 void loop()
 {
    printStringWithShift(string1, 100);
 }
 
 void printCharWithShift(char c, int shift_speed)
 {
    // 略
    memcpy_P(buffer, CH + 7*c, 7);
    // 略
 }


これにより、下図のようなスクロール表示が可能になる。

Arduino DotMatrix 3.jpg


以下に、全体のサンプルコードを記述する。

 #include <MaxMatrix.h>
 
 const PROGMEM byte CH[] = {
 3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
 1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !
 3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "
 5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #
 4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $
 5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // %
 5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // &
 1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // '
 3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // (
 3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // )
 5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // *
 5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // +
 2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // ,
 4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // -
 2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // .
 4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // /
 4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0
 3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1
 4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2
 4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3
 4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4
 4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5
 4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6
 4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7
 4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8
 4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9
 2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // :
 2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ;
 3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // <
 3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // =
 3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // >
 4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ?
 5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // @
 4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A
 4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
 4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C
 4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D
 4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E
 4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F
 4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G
 4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H
 3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I
 4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J
 4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K
 4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L
 5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M
 5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N
 4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O
 4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P
 4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q
 4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R
 4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S
 5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T
 4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U
 5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V
 5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W
 5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X
 5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y
 4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z
 2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [
 4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ backslash
 2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ]
 3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // hat
 4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _
 2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // `
 4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a
 4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b
 4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c
 4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d
 4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e
 3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f
 4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g
 4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h
 3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i
 4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j
 4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k
 3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l
 5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m
 4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n
 4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o
 4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p
 4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q
 4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r
 4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s
 3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t
 4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u
 5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v
 5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w
 5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x
 4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y
 3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z
 3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // {
 1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // |
 3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // }
 4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~
 };
 
 const int PIN_DIN  = 12;
 const int PIN_CS   = 10;
 const int PIN_CLK  = 11;
 const int maxInUse =  2;
 
 MaxMatrix m(PIN_DIN, PIN_CS, PIN_CLK, maxInUse);
 
 byte buffer[10];
 char string1[] = "Hello, world!    ";
 
 void setup()
 {
    m.init();
    m.setIntensity(3);
 }
 
 void loop()
 {
    printStringWithShift(string1, 100);
 }
 
 void printCharWithShift(char c, int shift_speed)
 {
    if(c < 32)
    {
       return;
    }
 
    c -= 32;
    memcpy_P(buffer, CH + 7*c, 7);
    m.writeSprite(32, 0, buffer);
    m.setColumn(32 + buffer[0], 0);
 
    for(int i = 0; i < buffer[0] + 1; i++)
    {
       delay(shift_speed);
       m.shiftLeft(false, false);
    }
 }
 
 void printStringWithShift(char* s, int shift_speed)
 {
    while(*s != 0)
    {
       printCharWithShift(*s, shift_speed);
       s++;
    }
 }
 
 void printString(char* s)
 {
    int col = 0;
    while(*s != 0)
    {
       if(*s < 32)
       {
          continue;
       }
       char c = *s - 32;
       memcpy_P(buffer, CH + 7*c, 7);
       m.writeSprite(col, 0, buffer);
       m.setColumn(col + buffer[0], 0);
       col += buffer[0] + 1;
       s++;
    }
 }