ถ้าคุณต่อ ESP32 เข้ากับ RS-485 แล้วอ่านค่าไม่ได้ อ่านได้บ้างไม่ได้บ้าง หรือค่าเพี้ยนแบบไม่มีเหตุผล — ก่อนจะสั่งโมดูลใหม่ ลองเช็คเรื่องเดียวนี้ก่อนครับ
กฎข้อเดียวที่สำคัญที่สุด
เลี้ยงโมดูล RS-485 ด้วย 3.3V เสมอเมื่อใช้กับ ESP32 — ห้ามใช้ 5V แล้วต่อตัวแบ่งแรงดัน
ผมทดสอบซ้ำกับโมดูล 3 แบบ บนบอร์ด 3 รุ่น ได้ข้อสรุปตรงกันทุกครั้งว่า ตัวแปรที่ชี้เป็นชี้ตายคือแรงดันเลี้ยง ไม่ใช่ยี่ห้อหรือรุ่นของโมดูล
| วิธีต่อ | ผลที่ได้ |
|---|---|
| เลี้ยง 3.3V → ขา RO/RXD เข้า GPIO ตรง | ✅ สัญญาณสวิงเต็ม 3.3V อ่านได้นิ่ง |
| เลี้ยง 5V + ตัวแบ่งแรงดันลงมา 3.3V | ❌ สัญญาณถูกกดลงมาใกล้เส้นตัดสิน บิตเพี้ยน |
เหตุผลคือตัวแบ่งแรงดันไม่ได้แค่ลดแรงดัน แต่ทำให้ขอบสัญญาณลาดลงด้วย พอความเร็ว 9600 bps ขึ้นไปและมีสายยาว ๆ ค่าที่ ESP32 อ่านได้จะไปวนอยู่ใกล้แรงดันเส้นตัดสินระหว่าง 0 กับ 1 — บางบิตผ่าน บางบิตไม่ผ่าน กลายเป็นอาการ “อ่านได้บ้างไม่ได้บ้าง” ที่หาสาเหตุยากที่สุด
โดยเฉพาะ ESP32-C3 ที่มีเส้นตัดสินอยู่ราว 2.48V ยิ่งไวกับเรื่องนี้มาก
บทเรียนที่ทำให้เกือบทิ้งของดี
ผมมีโมดูล MAX485 สีน้ำเงินแบบ 4 ขา (VCC/TXD/RXD/GND ควบคุมทิศทางอัตโนมัติในตัว) เอามาทดสอบกับ Arduino UNO แล้วอ่านไม่ผ่านสักครั้ง ในขณะที่โมดูลตัวอื่นทดสอบบน UNO ตัวเดียวกันผ่านฉลุย
ผมสรุปตอนนั้นว่า “โมดูลตัวนี้เสีย” เพราะคุมตัวแปรครบแล้ว — บอร์ดเดียวกัน สายเดียวกัน โค้ดเดียวกัน เหลือแค่ตัวโมดูลที่ต่างกัน
ข้อสรุปนั้นผิดครับ
พอเอามาเลี้ยง 3.3V ต่อกับ ESP32-C3 แล้วอ่านมิเตอร์จริง ผลคือ อ่านผ่าน 100% ครบทุกรีจิสเตอร์ ตั้งแต่ครั้งแรก
สิ่งที่ผมพลาดคือ UNO ทำงานที่ 5V ล้วน ซึ่งไม่ใช่ปลายทางจริงของงาน การ “คุมตัวแปรครบ” บนแพลตฟอร์มที่ไม่ใช่ของจริง ไม่ได้แปลว่าข้อสรุปจะใช้ได้กับของจริง
ก่อนตัดสินว่าโมดูลเสีย ให้ลองเลี้ยง 3.3V บนบอร์ดที่จะใช้จริงก่อนเสมอ
เลือกโมดูลให้ตรงงาน
โมดูล RS-485 แบ่งเป็นสองกลุ่มใหญ่ตามวิธีสลับทิศทางรับ/ส่ง
กลุ่มที่ 1 — ควบคุมทิศทางอัตโนมัติ
มี 4 ขา: VCC, GND, TXD, RXD ไม่ต้องใช้ GPIO เพิ่ม เขียนโค้ดเหมือนใช้ Serial ธรรมดา
เหมาะกับ: มิเตอร์ไฟฟ้า เซนเซอร์ โมดูล I/O — อุปกรณ์ที่ตอบกลับตามจังหวะปกติ
- บอร์ดสีดำ “RS485_TTL UART with Automatic Direction Control” — ตัวที่ผมใช้เป็นหลัก มี TVS diode กันไฟกระชากในตัว ลากสายได้ไกลเกือบกิโลเมตร
- โมดูลสีน้ำเงิน MAX485 + CD4069 (4 ขา) — ราคาถูกกว่ามาก และใช้ได้ดีจริง ถ้าเลี้ยง 3.3V
กลุ่มที่ 2 — ต้องคุมทิศทางเอง (มีขา RE/DE)
โมดูล MAX485 แบบ 6 ขา หรือชิปเปล่าอย่าง SN75176BP ต้องใช้ GPIO อีกขาสั่งสลับรับ/ส่งเอง
เหมาะกับ: อินเวอร์เตอร์และ soft starter บางรุ่น (ABB เป็นตัวอย่างที่ชัด) ซึ่งจังหวะการตอบไม่เข้ากับวงจร auto-direction ทำให้ต้องคุมเองถึงจะคุยรู้เรื่อง
การต่อ: RE ต้องชนกับ DE แล้วต่อเข้า GPIO ขาเดียว
| |
⚠️ ถ้าปล่อยขา RE ลอยไว้ ตัวรับจะปิดตลอดเวลา ผลคือส่งคำสั่งออกไปได้แต่ไม่เคยได้ยินอะไรกลับมาเลย — เป็นอีกอาการที่ทำให้คนเข้าใจผิดว่าอุปกรณ์ปลายทางไม่ตอบ
ระวังถ้าจะใช้ชิปเปล่า
ผมลองเอา SN75176BP (ชิป DIP-8 เปล่า ๆ) ต่อตรงกับ ESP32-C3 โดยไม่ใส่ตัวต้านทานอะไรเลย ผลคือ:
- อ่านสำเร็จแค่ 42% แล้วพลาดยาวต่อเนื่อง
- หลายรีจิสเตอร์อ่านไม่ออกเลย ได้ค่าว่างกลับมา
สาเหตุคือชิปเปล่าไม่มีอะไรอยู่บน PCB ช่วยเลย — ไม่มีวงจร fail-safe bias และตอนส่งทุกครั้งที่ DE ขึ้น HIGH ขา RE ก็ขึ้นตามด้วย ทำให้ขา RO กลายเป็นสถานะลอย (Hi-Z) ขา RX ของ ESP32 จึงรับสัญญาณรบกวนเข้าบัฟเฟอร์ปนกับคำตอบจริง
ถ้าจำเป็นต้องใช้ชิปเปล่าจริง ๆ ต้องเติมสามอย่างนี้:
| ตำแหน่ง | ค่า | หน้าที่ |
|---|---|---|
| RO → 3.3V | 10 kΩ pull-up | สำคัญที่สุด กันขาลอยตอนส่ง |
| A → 3.3V | 680 Ω | fail-safe bias |
| B → GND | 680 Ω | fail-safe bias |
(ถ้าใส่ตัวต้านทานปิดปลายสาย 120 Ω ด้วย ต้องลด bias ลงเหลือ 390 Ω)
พูดตรง ๆ คือ ซื้อโมดูลสำเร็จรูปคุ้มกว่าเยอะ เพราะเขาใส่พวกนี้มาให้บนบอร์ดแล้ว
เช็กลิสต์ก่อนโทษว่าของเสีย
- เลี้ยงโมดูลด้วย 3.3V หรือยัง (ไม่ใช่ 5V + ตัวแบ่งแรงดัน)
- ถ้าโมดูลมีขา RE/DE — ต่อ RE ชนกับ DE แล้วหรือยัง
- ต่อ GND ร่วม กับอุปกรณ์ปลายทางแล้วหรือยัง — สาย A/B สองเส้นอย่างเดียวไม่พอ ข้อนี้คนพลาดบ่อยมากเวลาอุปกรณ์อยู่คนละตู้
- สลับสาย A กับ B ลองดู (ผิดขั้วไม่พังแต่ไม่ทำงาน)
- baud rate / parity / stop bit ตรงกับปลายทางไหม
- ทดสอบบนบอร์ดที่จะใช้จริง ไม่ใช่บอร์ด 5V
ข้อ 1 กับข้อ 6 คือสองข้อที่ผมเสียเวลาไปมากที่สุด หวังว่าจะช่วยให้คุณข้ามไปได้เลยครับ
ถ้ามีอาการแปลก ๆ ที่ไม่ตรงกับข้างบน เล่าให้ฟังได้ครับ ผมอยากรู้ว่ามีเคสไหนที่ยังไม่เคยเจอบ้าง