SSブログ

4連8x8ドットマトリックスLEDで遊ぶ [Arduino]

quadmatrix-1.jpg

だいぶ前に購入した4連8x8ドットマトリックスLED。
74HC595のようにshiftOutでデータをどんどん送りだすだけだと思っていたらそうではなかった。
MAX7219という7seg(+ドットで計8個の)LEDを8連にしたものを操作するICを8x8ドットマトリックスLEDに応用しているみたい。

Webを調べていると、基本的にはライブラリーを使うらしい。

GitHub - MajicDesigns_MD_MAX72XX LED Matrix Library
https://github.com/MajicDesigns/MD_MAX72XX
GitHub - MajicDesigns_MD_Parola Library for modular scrolling LED matrix text displays
https://github.com/MajicDesigns/MD_Parola

しかし一度立ち止まって考えてみたい。
4連8x8ドットマトリックスLEDでやることって何なのか。
 ・文字の表示(ニュースみたいに文字が流れるもの)
 ・文字の表示(時計とか点滅する文字とか全書き換えするもの)
くらいではないのか?
前者の「文字が流れるもの」ならば1byte=8ドットを1ラインとしてデータを流していく感じ。
後者の「全書き換えするもの」でも高々32byteで大したデータ量でもないため32ライン分一括で流すという感じでなんとかなりそう。
ライブラリのような大げさなものを使わず、簡単なソースで行けるような感じにしたいということで仕上げてみました。

参考:
MAX7219 データシート
和:https://pdfserv.maximintegrated.com/jp/ds/1339J.pdf
英:https://www.analog.com/media/en/technical-documentation/data-sheets/MAX7219-MAX7221.pdf
8x8 LED Matrix - Using Arduino _ LEDs and Multiple
https://forum.arduino.cc/t/8x8-led-matrix/274527/11



拙いソースです。
// Quadruple Matrix LED Driven by MAX7219
uint8_t CLK = 13;       // to MAX7219 CLOCK
uint8_t CS  = 10;       // to MAX7219 LOAD(~CS)
uint8_t DAT = 11;       // to MAX7219 DIN
uint8_t POS =  0;       // display start position of array
uint8_t LINE[32] = {    // line image in scroll
  0b00111100, 0b00000010, 0b00000000, 0b01000000, 0b00111100, 0b00000000, 0b00001000, 0b00010000,
  0b00100001, 0b01010010, 0b10001100, 0b00000000, 0b01000000, 0b10001110, 0b10000000, 0b10000000,
  0b01001110, 0b00000000, 0b00001000, 0b01111110, 0b00010000, 0b00111000, 0b00000100, 0b00011000,
  0b00000000, 0b01000100, 0b10011110, 0b10000100, 0b10011100, 0b10100100, 0b01011010, 0b00000000};

void setup() {
  pinMode( CLK, OUTPUT );
  pinMode( CS , OUTPUT );
  pinMode( DAT, OUTPUT );
  ledOut( 0x0F00, 0x0F00, 0x0F00, 0x0F00 );     // Display Test(0xXF): Normal Operation (0)
  ledOut( 0x0B07, 0x0B07, 0x0B07, 0x0B07 );     // Scan Limit  (0xXB): Display all digits (7)
  ledOut( 0x0A01, 0x0A01, 0x0A01, 0x0A01 );     // Intensity   (0xXA): Luminance (0-F)
  ledOut( 0x0900, 0x0900, 0x0900, 0x0900 );     // Decode Mode (0xX9): No decode (00)
  ledOut( 0x0C01, 0x0C01, 0x0C01, 0x0C01 );     // Shutdown    (0xXC): Normal Operation (0)
}

void loop() {
  refreshLED();
  delay(200);
  ++POS %= 32;
}

void ledOut( uint16_t d0, uint16_t d1, uint16_t d2, uint16_t d3 ) {
  uint16_t d[]={ d0, d1, d2, d3 };
  digitalWrite( CS, LOW );
  for(uint8_t n=0; n<4; n++) {
    shiftOut( DAT, CLK, MSBFIRST, d[n]>>8 );
    shiftOut( DAT, CLK, MSBFIRST, d[n]    );
  }
  digitalWrite( CS, HIGH );
}

void refreshLED() {
  uint8_t d[4];
  for(uint8_t m=0; m<8; m++) {            // matrix LED data line
    for(uint8_t b=0; b<8; b++) {          // bit
      for(uint8_t n=0; n<4; n++) {        // Number of LEDs
        d[n] = d[n]<<1 | LINE[(b+n*8+POS)%32]>>m & 1;
      }
    }
    ledOut( (m+1<<8)+d[0], (m+1<<8)+d[1], (m+1<<8)+d[2], (m+1<<8)+d[3] );
  }
}


quadmatrix-2.jpg

表示データをパソコン側で用意できると便利になりそう。

タグ:Matrix LED
nice!(0)  コメント(0) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。