remote.html: แต่ละส่วนบนจอส่งคำสั่งอะไร และรับอะไรกลับ
| ส่วนบนจอ | การทำงาน |
|---|---|
| ⚙ ตั้งค่า | Broker URL, prefix, user/password · จำ URL/prefix ไว้ในเครื่อง (ไม่จำรหัสผ่าน) |
| Slider ข้อต่อ | ลากแล้วส่งทุก 120 ms · ถ้าไม่ได้แตะ slider จะขยับตาม state ของแขนจริง |
| ปุ่มตำแหน่ง | กดค้างส่งซ้ำทุก 200 ms · ใช้ IK บน ESP32 · เอื้อมไม่ถึงจะมี toast แจ้ง |
| ท่าที่บันทึกไว้ | อ่านท่าจากหน้า Simulator (เปิดจากเว็บเดียวกัน) แล้วส่งทีละท่า |
| หยุดฉุกเฉิน | ส่ง {"stop":1} ซ้ำ 3 ครั้ง (QoS 1) และหยุดการเล่นท่า · แนะนำสวิตช์ตัดไฟ servo ไว้ใกล้มือ |
สั่งงานได้ 3 ทาง ทุกทางใช้คำสั่ง JSON ชุดเดียวกัน
| Topic MQTT | ทิศทาง | ข้อมูล |
|---|---|---|
| <prefix>/cmd | ผู้สั่ง → ESP32 | {"j":[…]} · {"ik":[x,y,z,p]} · {"grip":v} · {"home":1} |
| <prefix>/state | ESP32 → ผู้สั่ง | มุมปัจจุบัน + moving + deadman (10 Hz ขณะขยับ, 1 Hz ตอนนิ่ง) |
| <prefix>/status | ESP32 → ผู้สั่ง | online / offline (retained + Last Will) |
| <prefix>/reply | ESP32 → ผู้สั่ง | error เช่น {"err":"unreachable"} |
| ทาง | เมื่อไหร่ใช้ | ทดสอบใน Wokwi |
|---|---|---|
| MQTT | อยู่คนละที่ / ผ่านมือถือ 4G | ใช้ได้เลย (Wokwi-GUEST ออกเน็ตได้) |
| WebSocket | อยู่ WiFi เดียวกัน หน่วงต่ำสุด | VS Code: ws://localhost:8181 |
| Serial | debug / ไม่มี WiFi | Serial Monitor ของ Wokwi |
แขนจริง: ESP32 + PCA9685 + ไฟ servo แยก · ใน Wokwi ต่อ servo ตรงที่ GPIO
| ขา ESP32 | ต่อไปที่ | หมายเหตุ |
|---|---|---|
| 3V3 | PCA9685 VCC, OLED VCC | ไฟลอจิกเท่านั้น ห้ามจ่าย servo |
| GND | PCA9685 GND, OLED GND, PSU − | ต้องต่อร่วมกันทั้งหมด |
| GPIO21 | SDA (PCA9685 + OLED) | บัส I2C เดียวกัน |
| GPIO22 | SCL (PCA9685 + OLED) | |
| PSU + | สวิตช์ตัดไฟ (แนะนำ) → PCA9685 V+ | ตัดไฟ servo ได้แม้เว็บ/WiFi ล่ม · dead-man แค่ทำให้แขนค้างท่า ไม่ตัดไฟ |
| CH0–CH5 | Servo J1–J6 | Wokwi: GPIO 13, 12, 14, 27, 26, 25 |
หน้าเว็บนี้กับ firmware ESP32 ใช้ JSON ชุดเดียวกัน (Digital Twin)
{"j":[90,90,135,135,90,80]} · {"ik":[x,y,z,pitch]} · {"grip":110} · {"home":1}ws://IP:81 · Wokwi: ws://localhost:8181<prefix>/cmd → broker → ESP32 subscribe{"err":"unreachable"}{"state":[…],"moving":false,"deadman":false} ส่งกลับทาง WebSocket 10 ครั้ง/วินาที{"hb":1} เกิน 2 วินาที แขนหยุดค้างท่า และไม่รับคำสั่งขยับจนกว่าจะได้ heartbeat ใหม่ (ค้างท่า ไม่ได้ตัดไฟ)