การสื่อสารแบบอนุกรมเป็นหนึ่งในวิธีทั่วไปในการแลกเปลี่ยนข้อมูลระหว่างอุปกรณ์อิเล็กทรอนิกส์ อย่างไรก็ตาม เมื่อระยะทางเพิ่มขึ้นหรือสภาพแวดล้อมมีการรบกวนทางแม่เหล็กไฟฟ้า สัญญาณการสื่อสารอาจมีแนวโน้มที่จะเกิดข้อผิดพลาดได้ นั่นคือที่มาของมาตรฐานการสื่อสาร RS485 โดยเสนอทางเลือกที่แข็งแกร่งและมีประสิทธิภาพ Arduino ที่มีความอเนกประสงค์ช่วยให้เราสามารถใช้ประโยชน์จากโปรโตคอลนี้อย่างเต็มที่ด้วยวิธีที่ค่อนข้างง่าย
ในบทความนี้ เราจะดูว่าการสื่อสาร RS485 สามารถนำไปใช้ระหว่าง Arduino หลายๆ ตัวได้อย่างไรโดยใช้โมดูลที่ใช้ MAX485 ในตัว ซึ่งเป็นชิปที่แปลงสัญญาณ TTL (จาก Arduino) เป็น RS485 และในทางกลับกัน ตลอดบทช่วยสอนนี้ เราจะครอบคลุมทั้งแนวคิดพื้นฐานและตัวอย่างเชิงปฏิบัติที่จะช่วยให้คุณใช้การสื่อสารแบบซิมเพล็กซ์ ฮาล์ฟดูเพล็กซ์ และฟูลดูเพล็กซ์ระหว่างไมโครคอนโทรลเลอร์ Arduino และอธิบายวิธีที่คุณสามารถขยายระบบการสื่อสารนี้เพื่อจัดการกับอุปกรณ์หลายตัวในเครื่องเดียว รถบัส RS485
RS485 คืออะไร?
RS485 เป็นมาตรฐานการสื่อสารที่ใช้กันอย่างแพร่หลายในอุตสาหกรรมซึ่งเป็นที่รู้จักในเรื่องของ ความทนทาน และความสามารถในการต้านทาน ระยะไกล การส่งผ่านแม้ในสภาพแวดล้อมทางอุตสาหกรรมที่มีเสียงดัง RS232 แตกต่างจากการสื่อสารแบบอนุกรมประเภทอื่นๆ เช่น RS485 โดยที่อนุญาตให้อุปกรณ์หลายตัวเชื่อมต่อบนบัสเดียวกัน ทำให้เหมาะสำหรับระบบอัตโนมัติทางอุตสาหกรรมและแอปพลิเคชันการควบคุม
โปรโตคอลนี้สามารถทนต่อสัญญาณรบกวนแม่เหล็กไฟฟ้าได้เนื่องจากใช้ ระบบการส่งสัญญาณที่แตกต่างซึ่งหมายความว่าข้อมูลจะถูกส่งผ่านสายสองเส้น A และ B ซึ่งเป็นเวอร์ชันตรงกันข้ามกับแรงดันไฟฟ้า ช่วยให้สามารถตัดเสียงรบกวนที่เกิดขึ้นในสายเคเบิลได้อย่างง่ายดาย เพื่อให้มั่นใจถึงความสมบูรณ์ของสัญญาณ
ข้อดีหลักประการหนึ่งของ RS485 ก็คือ รองรับระยะได้ไกลถึง 1200 เมตร และความเร็วสูงถึง 35 Mbps ในระยะทางสั้นๆ ทำให้เป็นโปรโตคอลในอุดมคติสำหรับการใช้งานทางอุตสาหกรรมและการควบคุมในสภาพแวดล้อมที่จำเป็นต้องใช้สายเคเบิลยาว
โหมดการสื่อสาร RS485

ในการสื่อสาร RS485 เราสามารถกำหนดค่าระบบได้สามวิธี: แบบซิมเพล็กซ์ ฮาล์ฟดูเพล็กซ์ และฟูลดูเพล็กซ์ แต่ละโครงการมีลักษณะเฉพาะและดำเนินการตามความต้องการของโครงการ
การสื่อสารแบบซิมเพล็กซ์
ในโหมดซิมเพล็กซ์ การสื่อสารจะไปในทิศทางเดียวเท่านั้น นั่นคืออุปกรณ์หนึ่งทำหน้าที่เป็น เครื่องส่งสัญญาณ และอื่น ๆ ที่ชอบ ตัวรับ- สิ่งนี้มีประโยชน์ในสถานการณ์ที่คุณต้องการส่งหรือรับข้อมูลโดยไม่จำเป็นต้องได้รับคำติชม
ตัวอย่างเช่น เราสามารถตั้งค่าระบบที่ Arduino อ่านค่าเซ็นเซอร์และส่งไปยังอุปกรณ์อื่นที่เพียงแค่รับค่าดังกล่าว ในกรณีนี้ เนื่องจากมีเพียงข้อมูลที่เคลื่อนที่ไปในทิศทางเดียว คุณจึงสามารถจ่ายองค์ประกอบการควบคุมเพิ่มเติมบางอย่างได้ ทำให้ระบบง่ายขึ้นและประหยัดมากขึ้น
การสื่อสารแบบฮาล์ฟดูเพล็กซ์
แอปพลิเคชัน RS485 ส่วนใหญ่บน Arduino ได้รับการใช้งานในโหมดฮาล์ฟดูเพล็กซ์เพราะต้องการเพียงเท่านั้น สองเธรดและอนุญาตให้คุณส่งและรับข้อมูลได้แม้ว่าจะไม่พร้อมกันก็ตาม นั่นคือหากอุปกรณ์เครื่องหนึ่งกำลังส่งข้อมูล อุปกรณ์อื่นๆ จะต้องอยู่ในโหมดการรับ และในทางกลับกัน
หากต้องการสลับระหว่างโหมดส่งและรับ ให้ใช้ หมุดเพิ่มเติม (RE/DE) บนโมดูล MAX485 ซึ่งคุณจะควบคุมจากโค้ดเพื่อตรวจสอบว่าอุปกรณ์ควรส่งหรือรับในเวลาใดก็ตาม
โหมดนี้มีประโยชน์อย่างยิ่งหากคุณมีอุปกรณ์หลายเครื่องบนบัสเดียวกันซึ่งจำเป็นต้องสื่อสารระหว่างกัน แต่ไม่พร้อมกัน
การสื่อสารแบบฟูลดูเพล็กซ์
ในโหมดฟูลดูเพล็กซ์ อุปกรณ์สามารถรับส่งข้อมูลได้ในเวลาเดียวกัน อย่างไรก็ตาม หากต้องการใช้ฟูลดูเพล็กซ์ใน RS485 สายบิดเกลียวสองคู่ซึ่งเพิ่มต้นทุนและความซับซ้อนในการเดินสายไฟ นอกจากนี้ คุณจะต้องมีโมดูล MAX485 สองโมดูลสำหรับแต่ละอุปกรณ์เพื่อจัดการช่องส่งและรับแยกกัน
ส่วนประกอบที่จำเป็นสำหรับการสื่อสาร RS485 กับ Arduino
ในการใช้ระบบสื่อสาร RS485 บน Arduino คุณจะต้องมีส่วนประกอบต่อไปนี้:
- Arduino หนึ่งตัวขึ้นไป: Arduino รุ่นใดก็ได้ก็ใช้ได้ แต่ในบทช่วยสอนนี้เราจะใช้ Arduino UNO และ Arduino MEGA เป็นตัวอย่าง
- โมดูล MAX485: โมดูลเหล่านี้ช่วยให้คุณสามารถแปลงสัญญาณ TTL จาก Arduino เป็น RS485 และในทางกลับกัน ราคาถูกมากและหาได้ง่ายในร้านค้าเช่น AliExpress หรือ eBay
- ตัวต้านทานการสิ้นสุด: โดยปกติแล้วตัวต้านทานระหว่าง 120 โอห์มจะวางไว้ที่ปลายแต่ละด้านของบัสเพื่อหลีกเลี่ยงการสะท้อนในสัญญาณ ในระยะทางสั้นๆ สามารถทำได้โดยไม่ต้องใช้อุปกรณ์เหล่านี้ แต่ในการติดตั้งที่นานกว่านั้น สิ่งจำเป็นในการรักษาความสมบูรณ์ของสัญญาณ
- สายคู่บิดเกลียว: ขอแนะนำให้ใช้สายคู่บิดเกลียวเพื่อลดการรบกวนทางแม่เหล็กไฟฟ้า โดยเฉพาะอย่างยิ่งในสภาพแวดล้อมทางอุตสาหกรรมที่มีเสียงดัง
แผนภาพการเชื่อมต่อทั่วไป
เชื่อมต่อโมดูล MAX485 สำหรับ Arduino นั้นค่อนข้างง่าย หมุดที่สำคัญที่สุดคือ A และ B ซึ่งตรงกับสายบัส RS485 พินเหล่านี้ต้องเชื่อมต่อกับอุปกรณ์ทั้งหมดบนบัส นอกจากนี้ โมดูลยังมีพิน RE และ DE ที่ควบคุมว่าโมดูลจะอยู่ในโหมดตัวรับหรือตัวส่งสัญญาณ
โดยทั่วไป การเชื่อมต่อโมดูลกับ Arduino ทำได้ดังนี้:
- VCC และ GND ของโมดูลเชื่อมต่อกับ VCC และ GND บน Arduino
- DI (Data Input) ของโมดูลเชื่อมต่อกับพิน TX ของ Arduino หากโมดูลทำหน้าที่เป็นตัวส่งสัญญาณ
- RO (Receiver Output) ของโมดูลเชื่อมต่อกับ RX pin ของ Arduino หากโมดูลทำหน้าที่เป็นตัวรับ
- ต้องควบคุม DE และ RE จากพินดิจิทัล Arduino เพื่อสลับระหว่างโหมดส่งและรับ
หากคุณต้องการให้โมดูลทำงานเป็นผู้ส่งหรือผู้รับเท่านั้น คุณสามารถเชื่อมต่อ RE และ DE เข้ากับ HIGH หรือ LOW ได้โดยตรง อย่างไรก็ตาม สำหรับการสื่อสารที่ซับซ้อนมากขึ้นซึ่งอุปกรณ์ต้องสลับระหว่างการส่งและรับ วิธีที่ดีที่สุดคือควบคุมพินเหล่านี้จากซอฟต์แวร์
ตัวอย่างโค้ดสำหรับการสื่อสาร RS485
ด้านล่างนี้เป็นตัวอย่างบางส่วนที่ครอบคลุมการกำหนดค่าการสื่อสารต่างๆ ด้วย RS485 บน Arduino
การสื่อสารแบบซิมเพล็กซ์
รหัสผู้ออก
สำหรับระบบซิมเพล็กซ์พื้นฐานที่เรามีผู้ส่งและผู้รับเพียงรายเดียว รหัสสำหรับผู้ส่งอาจมีลักษณะดังนี้:
void setup() { Serial.begin(9600); } void loop() { Serial.write(analogRead(0)); delay(500); }
รหัสตัวรับ
ผู้รับจะอ่านข้อมูลที่มาถึงผ่านพอร์ตอนุกรม:
void setup() { Serial.begin(9600); } void loop() { if (Serial.available()) { int data = Serial.read(); Serial.println(data); } }
การสื่อสารแบบฮาล์ฟดูเพล็กซ์
ในตัวอย่างนี้ เราใช้ระบบฮาล์ฟดูเพล็กซ์โดยที่อุปกรณ์สลับกันระหว่างการส่งและรับข้อมูล
รหัสครู
const int reDePin = 2; void setup() { pinMode(reDePin, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(reDePin, HIGH); Serial.write('H'); delay(100); digitalWrite(reDePin, LOW); if (Serial.available()) { int data = Serial.read(); Serial.println(data); } }
รหัสทาส
const int reDePin = 2; void setup() { pinMode(reDePin, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(reDePin, LOW); if (Serial.available()) { int data = Serial.read(); delay(100); digitalWrite(reDePin, HIGH); Serial.write(data + 1); } }
การสื่อสารแบบฟูลดูเพล็กซ์
หากต้องการใช้การสื่อสารแบบฟูลดูเพล็กซ์ จำเป็นต้องใช้โมดูล MAX485 สองโมดูลต่อ Arduino แต่ละคู่ของโมดูลจะจัดการหนึ่งบรรทัดข้อมูล: หนึ่งบรรทัดสำหรับการส่งและอีกหนึ่งบรรทัดสำหรับการรับ
รหัสจะคล้ายกับตัวอย่างก่อนหน้านี้ แต่ในกรณีนี้ อุปกรณ์ทั้งสองจะรับและส่งพร้อมกันเสมอ
ขยายไปยังอุปกรณ์หลายเครื่องใน RS485
RS485 มีความสามารถในการเชื่อมต่ออุปกรณ์ได้สูงสุด 32 เครื่องบนบัสเดียว และในกรณีพิเศษก็สามารถเข้าถึงได้มากขึ้น ทำให้เป็นตัวเลือกที่ยอดเยี่ยมสำหรับโครงการที่เกี่ยวข้องกับไมโครคอนโทรลเลอร์หรืออุปกรณ์หลายตัว เพื่อระบุแต่ละอุปกรณ์บนเครือข่าย เป็นเรื่องปกติที่จะใช้ที่อยู่หรือ ID สำหรับแต่ละอุปกรณ์
ในกรณีนี้ ต้นแบบจะส่งข้อความพร้อมที่อยู่ของอุปกรณ์ที่ต้องการสื่อสาร และมีเพียงอุปกรณ์นั้นเท่านั้นที่จะรับผิดชอบในการประมวลผลข้อความและให้การตอบกลับ
ที่เพิ่มเข้ามาคือความเป็นไปได้ในการใช้งาน โปรโตคอลที่ซับซ้อนมากขึ้น เช่น MODBUS ซึ่งช่วยให้สามารถสร้างเครือข่ายที่มีประสิทธิภาพและปลอดภัยสูงในอุตสาหกรรม
สำหรับโครงการบ้านหรือแอปพลิเคชันที่มีความต้องการน้อยกว่า คุณสามารถกำหนดตัวระบุให้กับ Arduino แต่ละตัว และให้ตอบกลับเฉพาะข้อความที่ต้องการเท่านั้น