ถ้าคุณต่อ 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 ขาเดียว

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#define DE_PIN 4

void preTransmission()  { digitalWrite(DE_PIN, HIGH); }  // ส่ง
void postTransmission() { digitalWrite(DE_PIN, LOW);  }  // กลับมารับ

void setup() {
  pinMode(DE_PIN, OUTPUT);
  digitalWrite(DE_PIN, LOW);
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
}

⚠️ ถ้าปล่อยขา RE ลอยไว้ ตัวรับจะปิดตลอดเวลา ผลคือส่งคำสั่งออกไปได้แต่ไม่เคยได้ยินอะไรกลับมาเลย — เป็นอีกอาการที่ทำให้คนเข้าใจผิดว่าอุปกรณ์ปลายทางไม่ตอบ

ระวังถ้าจะใช้ชิปเปล่า

ผมลองเอา SN75176BP (ชิป DIP-8 เปล่า ๆ) ต่อตรงกับ ESP32-C3 โดยไม่ใส่ตัวต้านทานอะไรเลย ผลคือ:

  • อ่านสำเร็จแค่ 42% แล้วพลาดยาวต่อเนื่อง
  • หลายรีจิสเตอร์อ่านไม่ออกเลย ได้ค่าว่างกลับมา

สาเหตุคือชิปเปล่าไม่มีอะไรอยู่บน PCB ช่วยเลย — ไม่มีวงจร fail-safe bias และตอนส่งทุกครั้งที่ DE ขึ้น HIGH ขา RE ก็ขึ้นตามด้วย ทำให้ขา RO กลายเป็นสถานะลอย (Hi-Z) ขา RX ของ ESP32 จึงรับสัญญาณรบกวนเข้าบัฟเฟอร์ปนกับคำตอบจริง

ถ้าจำเป็นต้องใช้ชิปเปล่าจริง ๆ ต้องเติมสามอย่างนี้:

ตำแหน่งค่าหน้าที่
RO → 3.3V10 kΩ pull-upสำคัญที่สุด กันขาลอยตอนส่ง
A → 3.3V680 Ωfail-safe bias
B → GND680 Ωfail-safe bias

(ถ้าใส่ตัวต้านทานปิดปลายสาย 120 Ω ด้วย ต้องลด bias ลงเหลือ 390 Ω)

พูดตรง ๆ คือ ซื้อโมดูลสำเร็จรูปคุ้มกว่าเยอะ เพราะเขาใส่พวกนี้มาให้บนบอร์ดแล้ว

เช็กลิสต์ก่อนโทษว่าของเสีย

  1. เลี้ยงโมดูลด้วย 3.3V หรือยัง (ไม่ใช่ 5V + ตัวแบ่งแรงดัน)
  2. ถ้าโมดูลมีขา RE/DE — ต่อ RE ชนกับ DE แล้วหรือยัง
  3. ต่อ GND ร่วม กับอุปกรณ์ปลายทางแล้วหรือยัง — สาย A/B สองเส้นอย่างเดียวไม่พอ ข้อนี้คนพลาดบ่อยมากเวลาอุปกรณ์อยู่คนละตู้
  4. สลับสาย A กับ B ลองดู (ผิดขั้วไม่พังแต่ไม่ทำงาน)
  5. baud rate / parity / stop bit ตรงกับปลายทางไหม
  6. ทดสอบบนบอร์ดที่จะใช้จริง ไม่ใช่บอร์ด 5V

ข้อ 1 กับข้อ 6 คือสองข้อที่ผมเสียเวลาไปมากที่สุด หวังว่าจะช่วยให้คุณข้ามไปได้เลยครับ


ถ้ามีอาการแปลก ๆ ที่ไม่ตรงกับข้างบน เล่าให้ฟังได้ครับ ผมอยากรู้ว่ามีเคสไหนที่ยังไม่เคยเจอบ้าง