1 · 面板版面整機 ≈ 285 × 186 mm,面板區在觸控屏右側
版面依 mockup:左 PLAYER 直欄、中 4×4 pads(17 mm)、右 SELECT/PAGE 欄、下 transport 列、
底部 bar+encoder ×2。所有語意(哪鍵做什麼、pads 第幾頁)由 Hub 決定 — 面板是 dumb terminal。
2 · 系統架構MCU 與 Dongle 共用,面板 PCB 是被動板
Dongle 1.2.6 只用 9 支 GPIO、單一 Arduino loop,RMT / PCNT / LEDC 全空著 — 面板正好全用硬體外設,
不碰 RF 任何路徑。功能演進只改 Hub Python(面板 firmware 不用重刷)。
3 · 整體連線圖每顆按鍵 / LED 走哪條 signal · 怎麼串 · 各芯片 IO 分配
3.1 · 哪顆芯片管哪些東西
3.2 · 按鍵 matrix — COL / ROW 都是共用線,U1 負責掃描
3.3 · Encoder 怎麼接
按鍵 — 8×5 diode matrix
- 37 鍵(35 實體鍵 + 2 顆 encoder 按壓),8 ROW × 5 COL,尚有 3 個 spare 鍵位
- ROW 由 U1 74HCT595 驅動(只吃 3 支 GPIO),COL ×5 直接回讀進 ESP
- 每鍵串一顆 diode → 任意組合同按都不會誤判(pads 演出中多鍵齊發)
Bar / Status — 595 靜態驅動
- 兩條 bar 各一顆 8 段光條模組(DIP-16),一顆 595 對一條 bar
- 靜態點亮:無掃描、無 refresh、無閃爍,只在數值變化時寫一次
- U2→U3→U4 串成一條,與 U1 共用 DATA/SCLK,用第二條 LATCH 分開;OE 併聯做整體調光
WS2812 — 單 pin 一條 chain
- 只有 35 顆按鍵在 chain 上(功能鍵 19 → pads 16),逐顆 DOUT→DIN
- 經一顆電平轉換(3.3 V → 5 V)進第一顆;順序按實體相鄰排
- 兩段之間留一個 header,分段可獨立更換/檢修
Encoder ×2
- 轉軸 A/B 直接進 ESP,用硬體計數器(PCNT)— 零中斷、零 CPU
- 按壓腳併入 matrix(R2·C4 / R3·C4),不另占 GPIO
- 轉動 → Hub → bar 更新往返 ≈ 20–40 ms;kiosk 顯示與面板 bar 永遠同步
4 · ESP32-S3 Pin Map新增 15 支 · spare 3 支 · 不碰 strapping/PSRAM/radio
| GPIO | 用途 | 備註 |
| 4 / 5 / 6 / 7 | SX1262 SCK / MISO / MOSI / NSS | 既有,不動(跨板統一 pinout) |
| 15 / 16 / 17 | SX1262 BUSY / DIO1 / RST | 既有,不動 |
| 19 / 20 · 43 / 44 | USB D−/D+(對 OPi CDC)· UART0 debug | 既有,不動 |
| 9 / 10 / 11 | 595 bus DATA / SCLK / LATCH_M(row driver #1) | 新增 · matrix |
| 8 / 18 | LATCH_L / OE_L(LEDC PWM)→ LED 595 #2–#4 | 新增 · bar/status |
| 12 / 13 / 14 / 21 / 47 | COL0–COL4(input,外部 10k pull-up) | 新增 |
| 48 | WS2812 DATA(RMT + DMA) | 新增 · 與底板 status-LED 建議腳一致 |
| 1 / 2 · 41 / 42 | ENC1 A/B(PCNT0)· ENC2 A/B(PCNT1) | 新增 |
| 38 / 39 / 40 | spare | 留給未來(matrix 內另有 3 spare 鍵位) |
| 0 / 3 / 45 / 46 · 26–37 | strapping · Flash/PSRAM 禁區 | 面板不觸碰 |
面板 ↔ MCU 的 path / connection 見 §9 連線圖;ribbon 腳位排序由工程師定。
5 · OPi ↔ 面板協議單一固定長度二進位幀 · 全狀態同步 · 週期 + 觸發
設計原則
- 只有一種幀(每個方向各一):不用多種訊息 — 少一種訊息就少一種「漏收 / 解不到 = 沒執行」的失敗模式
- 每幀都是完整狀態,不是變化量:所以幀是冪等的,重複收、漏收、亂序都不會累積錯誤
- 固定慢速心跳(250 ms)+ 按下 / 轉動時立即補一幀:反應即時,同時保證最慢 250 ms 內一定回到正確狀態
- 二進位定長:對齊 MAGIC → 讀固定長度 → 驗 CRC-8;壞幀整個丟棄等下一幀,不會半句解析錯而誤動作
關鍵細節
- Encoder 送累計計數不送增量:漏一幀若送增量 = 亮度永久偏掉;送絕對累計值,Hub 相減即可,下一幀自動補回
- 按鍵送 bitmap 不送事件:Hub 比對前後幀自行判斷按下 / 放開 / 長按 / 雙擊
- 免握手:任一方重啟後,雙方持續送全狀態幀,數百 ms 內自動收斂 — 不需要查詢 / 重繪流程
- 連線監測免費:超過 ~2 s 沒收到對方的週期幀 = 對方掉線,雙方都能立即知道並顯示
面板仍是 dumb terminal。面板只上報「哪些鍵被按著、encoder 轉到多少」,只執行「每顆燈什麼顏色」——
所有語意(哪個鍵代表什麼、pads 第幾頁、亮度換算)都在 Hub Python,並走 kiosk 同一條 action 路徑,
不另開平行入口。功能演進只改 Hub,不用重刷面板韌體。
6 · BOM 摘要(面板 PCB)
| 類別 | 零件 | 用量 |
| Pads | 17×17 mm 方形自復位鍵,內建 WS2812(透光鍵帽) | 16 |
| 功能鍵 | 12×12 mm 同款 | 19 |
| Encoder | EC11 帶 push | 2 |
| Bar / status LED | 8 段 LED 光條模組 DIP-16(20.3×10.2 mm)×2(BRIGHT 琥珀 + VOL 藍)+
限流 330–470 Ω ×16(依色);status 3 mm LED(綠2/藍1/琥珀1)+ 470 Ω ×4;引腳留長頂到面板開窗 | 2+4 |
| 掃描 / bar 驅動 | 74HCT595(#1 row + #2–#4 LED) | 4 |
| Diode / shifter | 1N4148WS ×40(每鍵)· 74AHCT1G125 ×1(與 Node 同 BOM) | 41 |
| 被動 / 保護 | 1000 µF + 100 nF ×N + 10 kΩ ×7 + 33 Ω + RC 去彈跳 · polyfuse 3 A | ~21 |
| 連接 | 2×13 IDC(production)/ DevKitC-1 排母 + SX1262 模組位 + SMA(prototype) | — |
內建 WS2812 按鍵(Taobao「發光按鍵 WS2812 自復位」)鎖 SKU 前先買樣:
鍵帽透光均勻度 / DIN-DOUT 四腳可串聯 / 行程手感盲操作。17 mm 與 12 mm 最好同一家。