「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スケッチ例**