九州・福岡・東京ときどきIoT

21年間のはてなダイアリー&アメブロからの避難所

「異なるHUB規格に対応した共通制御フレームワーク」を作る


「HUB12」「HUB40」「HUB75」それぞれのモジュールを **ESP32から汎用的に制御したい** 

 

---

# ⚙️ 仕組みの考え方

1. **基本共通点**

   * どのHUB規格も「シフトレジスタ式」で、

     * データ線(RGBなど)
     * 行選択線(A,B,C,D…)
     * CLK(シフトクロック)
     * LAT(ラッチ)
     * OE(出力イネーブル
       を持っています。
   * 制御の流れは共通です:

     1. 1行分のデータをシフト転送
     2. LATで反映
     3. OEをONして点灯
     4. 行アドレスを切替
     5. 次の行へ

2. **違い**

   * **HUB12** → 単色/簡易RGB。データ線が少ない
   * **HUB40** → 古いRGB規格。RGB各1系統
   * **HUB75** → 上下2行同時制御。RGBが2系統(R1/G1/B1, R2/G2/B2)

👉 つまり「HUBごとにデータ線の数とマッピングが違う」だけ。
制御ロジックは同じなので「抽象化」すればESP32で共通制御が可能です。

---

# 🖼️ 各HUBの信号イメージ

### HUB12

```
R, G (RGB簡易)
A, B, C (行アドレス)
CLK, LAT, OE
```

### HUB40

```
R, G, B
A, B, C, D (行アドレス)
CLK, LAT, OE
```

### HUB75

```
R1, G1, B1
R2, G2, B2
A, B, C, D, (E)
CLK, LAT, OE
```

---

# 🔌 ESP32での汎用制御設計

## 1. GPIO割り当ての抽象化

まず「最大構成(HUB75)」に合わせてESP32のGPIOを確保します。
(R1/G1/B1, R2/G2/B2, A〜E, CLK, LAT, OE)

* HUB12では R1 と G1 だけ使う
* HUB40では R1/G1/B1 を使う
* HUB75では全部使う

👉 つまり **共通ピン配置**にして、使わないピンは無視する。

---

## 2. 汎用クラスの設計(疑似コード)

```cpp
class LEDPanel {
  int pinR1, pinG1, pinB1;
  int pinR2, pinG2, pinB2;
  int pinA, pinB, pinC, pinD, pinE;
  int pinCLK, pinLAT, pinOE;

  int hubType; // 12, 40, 75

public:
  LEDPanel(int hub) { hubType = hub; }

  void begin() {
    // GPIOを初期化
    pinMode(pinR1, OUTPUT);
    // ... 他も初期化
  }

  void sendRow(uint8_t* rowData, int row) {
    // 1行分のデータを送信する
    for (int col=0; col<WIDTH; col++) {
      if (hubType == 12) {
        digitalWrite(pinR1, rowData[col] & 0x01);
        digitalWrite(pinG1, rowData[col] & 0x02);
      } else if (hubType == 40) {
        digitalWrite(pinR1, rowData[col] & 0x01);
        digitalWrite(pinG1, rowData[col] & 0x02);
        digitalWrite(pinB1, rowData[col] & 0x04);
      } else if (hubType == 75) {
        // 上段/下段に分けて出力
        digitalWrite(pinR1, rowData[col] & 0x01);
        digitalWrite(pinG1, rowData[col] & 0x02);
        digitalWrite(pinB1, rowData[col] & 0x04);
        digitalWrite(pinR2, rowData[col] & 0x08);
        digitalWrite(pinG2, rowData[col] & 0x10);
        digitalWrite(pinB2, rowData[col] & 0x20);
      }
      pulseCLK(); // クロック
    }
    pulseLAT(); // ラッチ
    setRowAddress(row); // 行アドレス設定
    enableOutput();     // 出力ON
  }
};
```

---

## 3. ESP32の性能活用

* **単純GPIO出力** → 遅い、チラつきやすい
* **I2SやRMTの並列出力** を使うと高速化でき、安定した表示が可能

  * PxMatrix(GPIO直制御) → 手軽だがCPU負荷大
  * SmartMatrix / ESP32-HUB75-MatrixPanel(I2S DMA使用) → 高速安定

👉 汎用性を求めるなら「HUB12/HUB40はGPIO直制御」「HUB75はI2S DMAライブラリ」みたいに分けてもよいです。

---

# ✅ まとめ

* **HUB12/40/75の違い**は「データ線の数と配置」のみ
* **ESP32制御は共通フレームワークで可能**(最大構成を定義し、使わない線を無視)
* 実装は

  * **GPIO直制御**(低速だが簡単、HUB12/40向け)
  * **I2S DMA**(高速で安定、HUB75に必須)
* 「汎用クラス」を作れば、ESP32で複数規格のLEDモジュールを切り替え制御できる

---

👉 次に作るとしたら、

* **実際のESP32用ピン配線例(GPIOマップ付き)**
* **HUB12/HUB40/HUB75を切り替えて動作するArduinoスケッチ例**