M5Stack으로 LED 매트릭스 패널(HUB-75)을 빛나게 합니다.

17420 단어 LedMatrixM5stackHUB75
이른바 HUB75라는 규격의 LED 패널을 M5Stack으로 빛나게 합니다. 빛나게 하고 뭔가를 하기보다는, LED Matrix Panel의 빛나는 구조에 대해 실험해 보았다는 주지입니다.



참고


  • LED 도트 매트릭스 패널 HUB75 규격에 대해 조사해 보았다
  • ESP32로 64x32 LED 매트릭스 패널 제어

  • HUB75 LED Matrix Panel



    옥외의 높은 곳에, 휘도가 약간 높은 LED 디스플레이가 있으면, 대체로 이 규격의 LED 패널이 사용되고 있습니다(아마). 최근에는 국내에서도 쉽게 구입할 수 있게 되었습니다. 거기의 휘도가 있어, 제어에 필요한 기기도 그만한 가격으로 입수할 수 있기 때문에, 업무용으로서는 꽤 널리 사용되고 있다고 하는 인상입니다.

    HUB75의 사양에 대해서는, 아래의 기사로 상세하게 쓰여져 있으므로, 여기서는 요점만 씁니다.
  • PIC32의 DMA 기능을 이용한 LED 디스플레이 표시 실험

  • 또한 64x64 패널의 경우 HUB75E라는 HUB75를 확장한 규격이 사용되는 경우가 많습니다. HUB75E는 GND 핀을 하나 잡고 대신 열을 지정하는 E 핀을 추가합니다. ABCDE 의 5bit 로 지정하는 것으로, 32 열 (x2=64 열) 지정할 수 있습니다.

    사용한 것


  • M5Stsck
  • 32x64 LED Matrix Panel (HUB75)
  • 30A/5V 안정화 전원

  • LED Matrix Panel 은, 같은 외형을 하고 있어도, 신호 주위의 사양 (핀 배치, HIGH/LOW 의 해석)이 다른 일이 있는 것 같습니다.
  • 참고: Adafruit Learning System: 32x16 and 32x32 RGB LED Matrix

  • 결선




  • LED Matrix 핀 이름: M5Stack GPIO
  • A: 18
  • B: 19
  • C: 21
  • D: 22
  • R1: 16
  • G1: 26
  • B1: 17
  • CLK: 2
  • OE: 23
  • LAT: 5

  • 실제로 결선하려고 하고 나서 깨달았습니다만, M5Stack 의 디폴트로 나와 있는 핀 뿐이라면, 미묘하게 핀수가 부족해 R2, G2, B2 에 결선할 수 없었습니다. 억지로 내놓고 충분하게 할 수도 있습니다만, 실험이므로 우선 이번에는 R2, G2, B2는 없이 했습니다. 이 때문에 패널의 상반부만 빛납니다.

    M5Stack의 18과 19 핀은 LCD에 사용되므로 LED 패널이 빛나는 동안 LCD를 움직이면 버그됩니다. 1, 3의 핀은 시리얼 통신에 사용되고 있으며, 35, 36은 input only이므로 이번 용도에는 사용할 수 없습니다.

    LED Matrix Panel은 5V 동작이지만 M5Stack의 3.3V 출력을 직접 넣어도 문제없이 동작하는 것 같습니다.



    상당히 거칠지만 이런 결선에서도 빛났습니다. 단, 조금이라도 만지면 노이즈가 튀어 깜박입니다.

    전체 점등 프로그램



    실험이므로, 여러가지 쉽도록 Arduino로 써 보았습니다. PIN_R1, PIN_G1, PIN_B1을 HIGH로 설정하거나 LOW로 설정하면 색상을 변경할 수 있습니다.
    
    #define PIN_A   18
    #define PIN_B   19
    #define PIN_C   21
    #define PIN_D   22
    #define PIN_R1  16
    #define PIN_G1  26
    #define PIN_B1  17
    #define PIN_CLK 2
    #define PIN_OE  23
    #define PIN_LAT 5
    
    void setup() 
    {
    
      pinMode( PIN_A, OUTPUT );
      pinMode( PIN_B, OUTPUT );
      pinMode( PIN_C, OUTPUT );
      pinMode( PIN_D, OUTPUT );
      pinMode( PIN_R1, OUTPUT );
      pinMode( PIN_G1, OUTPUT );
      pinMode( PIN_B1, OUTPUT );
      pinMode( PIN_CLK, OUTPUT );
      pinMode( PIN_OE, OUTPUT );
      pinMode( PIN_LAT, OUTPUT );
    
      digitalWrite( PIN_A, LOW );
      digitalWrite( PIN_B, LOW );
      digitalWrite( PIN_C, LOW );
      digitalWrite( PIN_D, LOW );
      digitalWrite( PIN_R1, LOW );
      digitalWrite( PIN_G1, LOW );
      digitalWrite( PIN_B1, LOW );
      digitalWrite( PIN_LAT, LOW );
    
      // OE のみ HIGH で OFF になる
      digitalWrite( PIN_OE,  HIGH );
      digitalWrite( PIN_CLK, LOW );
    }
    
    void loop() 
    {
      int i = 0;
      char d = 0;
    
      for ( d = 0; d < 16; d++ ){
    
        // ラッチはこのタイミングで HIGH にする必要があるぽい
        digitalWrite( PIN_LAT, HIGH ); 
    
        // (R=1,G=1,B=1) 
        digitalWrite( PIN_R1, HIGH );
        digitalWrite( PIN_G1, HIGH );
        digitalWrite( PIN_B1, HIGH );
    
        // R2,G2,B2 も結線できている場合
        // digitalWrite( PIN_R2, HIGH );
        // digitalWrite( PIN_G2, HIGH );
        // digitalWrite( PIN_B2, HIGH );
    
        // RGB データ (R=1,G=1,B=1) を 64ibt 分転送する
        for ( i = 0; i < 64; i++ ){
          digitalWrite( PIN_CLK, HIGH );
          digitalWrite( PIN_CLK, LOW );
        }
    
        // LED を消灯する (データ転送時のちらつきを防ぐ)
        digitalWrite( PIN_OE, HIGH );
    
        // LED パネルの光らせる列を 4bit で指定する
        digitalWrite( PIN_A, ( d & 1 ) );
        digitalWrite( PIN_B, ( d & 2 ) >> 1);
        digitalWrite( PIN_C, ( d & 4 ) >> 2);
        digitalWrite( PIN_D, ( d & 8 ) >> 3);
    
        // 4bit で指定した列に RGB データを転送する
        digitalWrite( PIN_LAT, LOW );
    
        // LED を点灯する
        digitalWrite( PIN_OE,  LOW );
    
      }
    }
    

    중간색 점등 프로그램



    LED가 켜지는 시간의 길이를 조정하여 중간색을 표현해 보는 테스트입니다.
    // setup() と #define は上のプログラムと同じなので省略
    
    // 色調(階調)の設定
    inline void SET_RGB( char r, char g, char b, int j ){
        digitalWrite( PIN_R1, r > j ? HIGH : LOW );
        digitalWrite( PIN_G1, g > j ? HIGH : LOW );
        digitalWrite( PIN_B1, b > j ? HIGH : LOW );
    }
    
    char d = 0;
    void loop()
    {
      int i = 0;
      int j = 0;
    
      for ( j = 0; j < 16; j++ ){ // RGB 16 階調 (16x16x16=4096色)
        for ( d = 0; d < 16; d++ ){
          digitalWrite( PIN_LAT, HIGH );
    
          for ( i = 0; i < 64; i++ ){
            SET_RGB( d, i/4, 15-d, j );
            digitalWrite( PIN_CLK, HIGH );
            digitalWrite( PIN_CLK, LOW );
          }
    
          digitalWrite( PIN_OE, HIGH );
    
          digitalWrite( PIN_A, ( d & 1 ) );
          digitalWrite( PIN_B, ( d & 2 ) >> 1);
          digitalWrite( PIN_C, ( d & 4 ) >> 2);
          digitalWrite( PIN_D, ( d & 8 ) >> 3);
    
          digitalWrite( PIN_LAT, LOW );
    
          digitalWrite( PIN_OE,  LOW );
    
        }
      }
    }
    

    240MHz 동작이라면 256계조라도 할 수 있을 것입니다만, 위의 프로그램으로 256계조로 하면 깜박거렸습니다. 16 계조 정도로 하고, 간신히 깜박거리지 않게 되었습니다. 성실하게 256 계조 한다면, 역시 DMA 등을 사용할 필요가 있을 것 같습니다.

    결론



    여러가지 중도반단이 되어 버렸기 때문에, ESP32 에서도 조금 진지하게 써 정보 추기할 때(언제?).

    좋은 웹페이지 즐겨찾기