🧪 新教程持續更新中 · 由機械臂到傳感器,跟隨教程從零搭建
跳到主要內容

PWM 伺服馬達協定、命令與標定 ​

本頁涵蓋 PWM 韌體的序列埠協定、命令、校準和參數精調。接線見 PWM 接線,燒錄見 PWM 快速上手,桌面/網頁控制見 PWM 桌面上位機 / PWM 網頁控制。

以下命令在儲存庫的 AmazingHand-PWM/ 目錄下執行。韌體原始碼:firmware/AmazingHand_Serial/。

1. 命令與手勢一覽 ​

前 11 列為手勢命令,其餘為直驅、選邊、重複、停止和鏈路測試命令。

手勢/命令命令說明
石頭0x01猜拳:全指握拳
剪刀0x02猜拳:食指+中指伸出呈 V 字
布0x03猜拳:全指張開
比讚0x04拇指豎起,其餘握拳
嘲諷10x05搖食指(「不不不」)
嘲諷20x06無名指伸展晃動(替代小指)
張開0x07全指張開
握拳0x08全指閉合
OK0x09OK 手勢
捏合0x0A捏合手勢
指向0x0C食指伸出做「指」動作
直驅0xF0直接控制 8 路伺服馬達角度
設左右手0xF1切換左手/右手模式
重複0xFE重複執行上一次手勢
停止0xFF立即終止目前手勢
NOP0x00鏈路測試

註:命令 0x0B 已停用(原「拇指朝下」與「比讚」動作重複,已移除)。


2. 韌體校準(可選,首次使用建議) ​

伺服馬達中心位和脈寬需按實際機構校準,可直接在韌體原始碼中修改:

  • 編輯 components/hand_servo/hand_servo.c 頂部的 middle_pos[8] 和 min_pw/mid_pw/max_pw[8]。

校準後需重新編譯燒錄。


3. 序列埠通訊協定 ​

3.1 實體層 ​

參數值
介面USB Serial (UART0)
鮑率115200
資料位元8
同位檢查位元無 (None)
停止位元1
流量控制無

3.2 幀格式 ​

主機 → ESP32(命令幀) ​

┌────────┬────────┬──────────┬────────────────┬──────────┐
│  0xAA  │ CMD_ID │ DATA_LEN │ DATA[0 .. N-1] │ CHECKSUM │
│ 1 Byte │ 1 Byte │  1 Byte  │    N Bytes     │  1 Byte  │
└────────┴────────┴──────────┴────────────────┴──────────┘
 幀頭      命令ID    資料長度      資料負載         校驗和
  • 幀頭: 固定 0xAA,標識一幀的開始
  • CMD_ID: 命令編號(見 命令參考)
  • DATA_LEN: 資料負載的位元組數(0-8,超過 8 的幀無效)
  • DATA: 資料負載,長度由 DATA_LEN 決定
  • CHECKSUM: CMD_ID ^ DATA_LEN ^ DATA[0] ^ ... ^ DATA[N-1](XOR 校驗)

如果 DATA_LEN = 0,則 CHECKSUM = CMD_ID。

ESP32 → 主機(回應幀) ​

┌────────┬────────┬────────┬──────────┐
│  0xBB  │ CMD_ID │ STATUS │ CHECKSUM │
│ 1 Byte │ 1 Byte │ 1 Byte │  1 Byte  │
└────────┴────────┴────────┴──────────┘
 幀頭      命令ID    狀態碼    校驗和
  • 幀頭: 固定 0xBB
  • CMD_ID: 原始命令編號
  • STATUS: 狀態碼(見下表)
  • CHECKSUM: CMD_ID ^ STATUS

狀態碼 ​

STATUS含義說明
0x00OK命令已接受,開始執行
0x01無效命令CMD_ID 不在命令表中
0x02參數錯誤資料長度或內容不正確
0x03忙碌手勢執行中,暫不接受新命令
0x10完成手勢執行完畢

3.3 通訊時序 ​

主機                          ESP32
 │                              │
 │──── [AA 01 00 01] ────────→│  發送「石頭」命令
 │                              │
 │←─── [BB 01 00 01] ─────────│  ACK: 命令已接受
 │                              │
 │                      (執行手勢中)
 │                              │
 │←─── [BB 01 10 11] ─────────│  完成: 手勢執行完畢
 │                              │
 │──── [AA 02 00 02] ────────→│  發送「剪刀」命令
 │                              │
 │←─── [BB 02 00 02] ─────────│  ACK
 │                              │

3.4 停止手勢 & 幀逾時 ​

  • 發送 [AA FF 00 FF] 可隨時中斷正在執行的手勢
  • ESP32 在 200ms 內未收完一幀會自動丟棄(防止丟位元組導致永久失步)
  • 校驗和不匹配的幀會被靜默丟棄,上位機應實作逾時重發

3.5 左右手模式 ​

預設右手模式。發送 [AA F1 01 02 F2] 切換左手,[AA F1 01 01 F1] 切回右手。左右手影響拇指的運動方向(石頭/剪刀/比讚/OK/捏合等含拇指手勢)。


4. 命令參考 ​

4.1 手勢命令(0x01–0x0A、0x0C) ​

這些命令無需資料負載 (DATA_LEN=0),ESP32 收到後立即執行對應手勢。

命令HEX 幀回應說明
石頭AA 01 00 01BB 01 00 01 → BB 01 10 11全指握拳
剪刀AA 02 00 02BB 02 00 02 → BB 02 10 12食指+中指伸出
布AA 03 00 03BB 03 00 03 → BB 03 10 13全指張開
比讚AA 04 00 04BB 04 00 04 → BB 04 10 14拇指豎起
嘲諷1AA 05 00 05BB 05 00 05 → BB 05 10 15搖食指(約 2.5s)
嘲諷2AA 06 00 06BB 06 00 06 → BB 06 10 16無名指晃動(約 2.5s)
張開AA 07 00 07BB 07 00 07 → BB 07 10 17全指張開
握拳AA 08 00 08BB 08 00 08 → BB 08 10 18全指閉合
OKAA 09 00 09BB 09 00 09 → BB 09 10 19OK 手勢
捏合AA 0A 00 0ABB 0A 00 0A → BB 0A 10 1A捏合手勢
指向AA 0C 00 0CBB 0C 00 0C → BB 0C 10 1C食指伸出做「指」動作

4.2 直驅命令 (0xF0) ​

直接控制 8 路伺服馬達角度,8 位元組資料分別對應伺服馬達 1-8,每位元組取值範圍 0-180。

範例:全部伺服馬達歸中位(90°)

發送: AA F0 08 5A 5A 5A 5A 5A 5A 5A 5A F8
       │  │  │  └── 8 個 0x5A (90°) ──┘  │
       │  │  │                            └── CHECKSUM
       │  │  └── DATA_LEN = 8
       │  └── CMD_DIRECT_DRIVE
       └── 幀頭

校驗和 = F0 ^ 08 ^ 5A ^ 5A ^ 5A ^ 5A ^ 5A ^ 5A ^ 5A ^ 5A = F8

8 個相同的 0x5A 兩兩 XOR 得 0x00,最終 0xF0 ^ 0x08 ^ 0x00 = 0xF8

範例:食指張開(伺服馬達1=170°, 伺服馬達2=10°),其餘歸中(90°)

發送: AA F0 08 AA 0A 5A 5A 5A 5A 5A 5A 58
               └─170°  └─10°

4.3 設左右手 (0xF1) ​

1 位元組資料:0x01 = 右手,0x02 = 左手。

設右手: AA F1 01 01 F1
設左手: AA F1 01 02 F2

4.4 控制命令 ​

命令HEX 幀說明
NOPAA 00 00 00鏈路測試,立即返回 BB 00 00 00
重複AA FE 00 FE重複執行上一次手勢
停止AA FF 00 FF立即終止目前手勢

4.5 回應速查 ​

收到無效命令時(以 0xFC 這個不存在的命令為例):

發送: AA FC 00 FC
回應: BB FC 01 FD    (STATUS=0x01 無效命令)

校驗和驗證: FC ^ 00 = FC,回應 FC ^ 01 = FD


5. 手勢參數精調 ​

5.1 參數位置 ​

每個手勢的角度偏移量用 #define 巨集定義,無需改邏輯程式碼,只調數值。

  • ESP-IDF 版:components/hand_gestures/hand_gestures.c 頂部「手勢參數(使用者可調)」區

5.2 參數含義 ​

c
// 例:石頭手勢
#define ROCK_IDX_OFF1    70    // 食指關節1 偏移量
#define ROCK_IDX_OFF2   -70    // 食指關節2 偏移量
  • 正值 = 彎曲握緊,負值 = 伸展打開
  • 每根手指 2 個偏移量,相對 middle_pos(預設 90°)
  • 差動結構:兩伺服馬達並排、軸心共線;同向旋轉產生左右側擺,反向旋轉產生屈伸;兩個偏移角之和對應側擺,之差對應屈伸。

5.3 調參步驟 ​

  1. 找到對應手勢的 #define 巨集
  2. 修改數值(增大 → 幅度更大;減小 → 幅度更小)
  3. 重新編譯燒錄,用上位機測試效果
  4. 反覆微調直到動作自然

6. 常見問題 ​

Q1: 上位機連不上序列埠? ​

  1. 確認 ESP32 已透過 Type-C 連接電腦
  2. 檢查裝置管理員中的 COM 埠號是否與 GUI 選擇一致
  3. 確認鮑率 115200
  4. 斷開其他佔用序列埠的軟體

Q2: 發送命令沒反應? ​

  1. 先發 AA 00 00 00(NOP),應收到 BB 00 00 00
  2. 確認韌體已燒錄且目標晶片是 ESP32-S3
  3. 檢查接線(GND 是否共地)

Q3: 手勢動作幅度不對或方向反了? ​

進入手勢參數精調(見 第 5 節)調整對應巨集。

Q4: 左右手模式影響哪些手勢? ​

石頭/剪刀/比讚/OK/捏合等含拇指的手勢,切換左右手後拇指鏡像方向。

Q5: 手指卡住、伸不出來? ​

所有收縮類手勢執行前會自動「先全手展開再收攏」,避免手指被上一手勢擋住。若仍卡住,檢查機械裝配或減小收縮幅度。

相關頁面 ​