- ความแตกต่างระหว่างการสื่อสาร UART และ RS485
- ส่วนประกอบที่จำเป็น
- แผนภาพวงจรสำหรับการสื่อสารแบบใช้สายทางไกล
- MAX485 UART-RS485 Converter โมดูล
- สายเคเบิล Ethernet CAT-6E
- คำอธิบายรหัส Arduino
- สรุป
เราใช้บอร์ดพัฒนาไมโครคอนโทรลเลอร์เช่น Arduino, Raspberry Pi, NodeMCU, ESP8266, MSP430 เป็นต้นมาเป็นเวลานานแล้วในโครงการขนาดเล็กของเราที่ระยะห่างระหว่างเซ็นเซอร์และบอร์ดส่วนใหญ่ไม่เกินสองสามเซนติเมตรที่ระยะสูงสุดและ ในระยะทางเหล่านี้การสื่อสารระหว่างโมดูลเซ็นเซอร์รีเลย์ตัวกระตุ้นและตัวควบคุมต่างๆสามารถทำได้อย่างง่ายดายผ่านสายจัมเปอร์ธรรมดาโดยที่เราไม่ต้องกังวลเกี่ยวกับความผิดเพี้ยนของสัญญาณในตัวกลางและเสียงไฟฟ้าที่เล็ดลอดเข้ามา แต่ถ้าคุณกำลังสร้างระบบควบคุมด้วยบอร์ดพัฒนาเหล่านี้ใน ระยะทางมากกว่า 10 ถึง 15 เมตรคุณควรคำนึงถึงเสียงรบกวนและกำลังสัญญาณเพราะหากคุณต้องการให้ระบบของคุณทำงานได้อย่างน่าเชื่อถือคุณจะไม่สามารถสูญเสีย ข้อมูลขณะถ่ายโอน
มีโปรโตคอลการสื่อสารแบบอนุกรมหลายประเภทเช่น I2C และ SPI ซึ่งสามารถใช้กับ Arduino ได้อย่างง่ายดายและวันนี้เราจะมาดูโปรโตคอลที่ใช้กันมากที่สุดอีกตัวหนึ่งที่เรียกว่า RS485 ซึ่งมักใช้กันมากในสภาพแวดล้อมอุตสาหกรรมที่มีเสียงรบกวนสูงเพื่อถ่ายโอนข้อมูล เป็นระยะทางไกล ในบทช่วยสอนนี้เราจะเรียนรู้เกี่ยวกับโปรโตคอลการสื่อสาร RS485 และวิธีการใช้งานกับ Arduino Nano สองตัวที่เรามีกับเราและวิธีใช้ MAX485 RS485 เป็น โมดูลการแปลง UART ก่อนหน้านี้เราได้ทำการสื่อสาร MAX485 กับ Arduino และ MAX485 Communication กับ Raspberry pi คุณสามารถตรวจสอบได้หากสนใจ
ความแตกต่างระหว่างการสื่อสาร UART และ RS485
เซ็นเซอร์ราคาประหยัดส่วนใหญ่และโมดูลอื่น ๆ เช่น GPS, Bluetooth, RFID, ESP8266 เป็นต้นซึ่งมักใช้กับ Arduino, Raspberry Pi ในตลาดใช้ การสื่อสารแบบ UART TTL เนื่องจากต้องใช้สาย TX (Transmitter) และ RX เพียง 2 สาย (ตัวรับ). ไม่ใช่โปรโตคอลการสื่อสารมาตรฐาน แต่เป็นวงจรทางกายภาพที่คุณสามารถส่งและรับข้อมูลอนุกรมกับอุปกรณ์ต่อพ่วงอื่น ๆ สามารถส่ง / รับข้อมูลแบบอนุกรมได้เท่านั้นดังนั้นก่อนอื่นจึงแปลงข้อมูลแบบขนานเป็นข้อมูลอนุกรมจากนั้นจึงส่งข้อมูล
UART เป็น อุปกรณ์ส่งข้อมูลแบบอะซิงโครนัส ดังนั้นจึงไม่มีสัญญาณนาฬิกาในการซิงค์ข้อมูลระหว่างอุปกรณ์ทั้งสองแทนที่จะใช้บิตเริ่มต้นและหยุดที่จุดเริ่มต้นและจุดสิ้นสุดของแต่ละแพ็กเก็ตข้อมูลตามลำดับเพื่อทำเครื่องหมายส่วนปลายของข้อมูลที่กำลังถ่ายโอน ข้อมูลที่ส่ง UART ถูกจัดเป็นแพ็กเก็ต แต่ละแพ็กเก็ตประกอบด้วยบิตเริ่มต้น 1 บิตข้อมูล 5 ถึง 9 บิต (ขึ้นอยู่กับ UART) บิตพาริตีที่เป็นทางเลือกและบิตหยุด 1 หรือ 2 บิต มีการบันทึกไว้เป็นอย่างดีและใช้กันอย่างแพร่หลายและยังมีบิตพาริตีเพื่อให้สามารถตรวจสอบข้อผิดพลาดได้ แต่มีข้อ จำกัด บางประการเนื่องจาก ไม่สามารถรองรับทาสหลายคนและนายหลายคนได้ และกรอบข้อมูลสูงสุดถูก จำกัด ไว้ที่ 9 บิต สำหรับการถ่ายโอนข้อมูลอัตรารับส่งข้อมูลของทั้ง Master และ Slave จะต้องอยู่ระหว่าง 10% ของกันและกัน ด้านล่างนี้เป็นตัวอย่างของการที่อักขระเป็นตัวส่งผ่านสายข้อมูล UART สัญญาณสูงและต่ำจะวัดเทียบกับระดับ GND ดังนั้นการเลื่อนระดับ GND จะส่งผลร้ายต่อการถ่ายโอนข้อมูล
บนมืออื่น ๆ, RS485 คือการสื่อสารในอุตสาหกรรมมากขึ้นซึ่งได้รับการพัฒนาเป็นเครือข่ายของอุปกรณ์หลาย ๆ ที่ สามารถนำมาใช้ในระยะทางไกลและความเร็วที่สูง เกินไป ทำงานโดยใช้ วิธีการ วัดสัญญาณที่แตกต่างกันมากกว่าการวัดแรงดันไฟฟ้าด้วยพิน GND สัญญาณ RS485 ลอยอยู่และแต่ละสัญญาณจะถูกส่งผ่านสาย Sig + และ Sig-line
เครื่องรับ RS485 จะเปรียบเทียบความแตกต่างของแรงดันไฟฟ้าระหว่างเส้นทั้งสองแทนที่จะเป็นระดับแรงดันไฟฟ้าสัมบูรณ์บนสายสัญญาณ วิธีนี้ใช้ได้ผลดีและป้องกันไม่ให้มีกราวด์ลูปซึ่งเป็นสาเหตุทั่วไปของปัญหาการสื่อสาร ผลลัพธ์ที่ดีที่สุดจะเกิดขึ้นได้หากสาย Sig + และ Sig- บิดเนื่องจากการบิดเป็นโมฆะจะทำให้ผลกระทบของสัญญาณรบกวนแม่เหล็กไฟฟ้าที่ เกิดขึ้นในสายเคเบิลเป็น โมฆะและให้ภูมิคุ้มกันที่ดีขึ้นมากจากเสียงรบกวนซึ่งทำให้ RS485 สามารถส่งข้อมูลได้ถึง 1200 เมตรของช่วง. คู่บิดยังช่วยให้ความเร็วในการส่งสูงกว่าที่เป็นไปได้ด้วยสายตรง ในระยะการส่งข้อมูลขนาดเล็กความเร็วสูงสุด 35Mbps สามารถรับรู้ได้ด้วย RS485 แม้ว่าความเร็วในการส่งจะลดลงตามระยะทาง ที่ความเร็วในการรับส่งข้อมูล 1200 เมตรคุณสามารถใช้ความเร็วในการรับส่งข้อมูลเพียง 100kbps คุณต้องมีสายเคเบิลอีเทอร์เน็ตพิเศษเพื่อรับรู้โปรโตคอลการสื่อสารนี้ มีสายอีเทอร์เน็ตหลายประเภทที่เราสามารถใช้ได้เช่น CAT-4, CAT-5, CAT-5E, CAT-6, CAT-6A เป็นต้นในบทช่วยสอนของเราเราจะใช้สาย CAT-6E ซึ่งมีสาย 24AWG คู่บิด 4 คู่และรองรับได้ถึง 600MHz สิ้นสุดที่ปลายทั้งสองข้างโดยขั้วต่อ RJ45 ระดับแรงดันไฟฟ้าของไลน์โดยทั่วไปจากไดรเวอร์ไลน์คือขั้นต่ำ± 1.5 V ถึงสูงสุดประมาณ± 6 V. ความไวอินพุตของตัวรับคือ± 200 mV เสียงรบกวนในช่วง± 200 mV ถูกปิดกั้นเป็นหลักเนื่องจากการตัดเสียงรบกวนในโหมดทั่วไป ตัวอย่างวิธีการถ่ายโอนไบต์ (0x3E) ผ่านสองบรรทัดของ RS485 Communication
ส่วนประกอบที่จำเป็น
- 2 × MAX485 Converter โมดูล
- 2 × Arduino นาโน
- 2 × 16 * 2 LCD ตัวอักษรและตัวเลข
- 2 × 10k โพเทนชิโอมิเตอร์ที่ปัดน้ำฝน
- สายเคเบิล Cat-6E Ethernet
- Breadboards
- สายจัมเปอร์
แผนภาพวงจรสำหรับการสื่อสารแบบใช้สายทางไกล
ด้านล่างนี้แสดงให้เห็นภาพที่ส่งสัญญาณและตัวรับสัญญาณวงจรสำหรับ Arduino เป็นทางไกลสายการสื่อสาร โปรดทราบว่าทั้งวงจรตัวส่งและตัวรับมีลักษณะเหมือนกันสิ่งเดียวที่แตกต่างคือรหัสที่เขียนไว้ สำหรับการสาธิตเราใช้บอร์ดหนึ่งตัวเป็นตัวส่งและบอร์ดหนึ่งตัวเป็นตัวรับ แต่เราสามารถตั้งโปรแกรมให้บอร์ดทำงานเป็นทั้งตัวส่งและตัวรับได้ด้วยการตั้งค่าเดียวกัน
แผนภาพการเชื่อมต่อสำหรับวงจรข้างต้นแสดงไว้ด้านล่าง
ดังที่คุณเห็นด้านบนมีวงจรสองคู่ใกล้เคียงกันโดยแต่ละวงจรมี Arduino nano, LCD 16 * 2 ตัวอักษรและตัวเลขและตัว แปลง IC MAX485 UART เป็น RS485 เชื่อมต่อกับปลายแต่ละด้านของสาย Ethernet Cat-6E ผ่านขั้วต่อ RJ45 สายเคเบิลที่ฉันใช้ในบทช่วยสอนมีความยาว 25 ม. เราจะส่งข้อมูลบางส่วนจากฝั่งเครื่องส่งผ่านสายเคเบิลจากนาโนซึ่งแปลงเป็นสัญญาณ RS485 ผ่านโมดูล MAX RS485 ที่ทำงานในโหมดมาสเตอร์
ที่จุดสิ้นสุดการรับโมดูลตัวแปลง MAX485 จะทำงานเป็น Slave และรับฟังการส่งจาก Master อีกครั้งจะแปลงข้อมูล RS485 ที่ได้รับเป็นสัญญาณ 5V TTL UART มาตรฐานเพื่ออ่านโดย Nano ที่รับและแสดงบน 16 * เชื่อมต่อ LCD ตัวอักษรและตัวเลข 2 ตัว
MAX485 UART-RS485 Converter โมดูล
โมดูล UART-RS485 Converter นี้มีชิป MAX485 แบบออนบอร์ดซึ่งเป็นตัวรับส่งสัญญาณที่ใช้พลังงานต่ำและ จำกัด อัตราการใช้งานสำหรับการสื่อสาร RS-485 ทำงานที่แหล่งจ่ายไฟ + 5V ตัวเดียวและกระแสไฟฟ้าที่กำหนดคือ 300 μA ทำงานบนการสื่อสารแบบ half-duplex เพื่อใช้ฟังก์ชันในการแปลงระดับ TTL เป็นระดับ RS-485 ซึ่งหมายความว่าสามารถส่งหรือรับได้ตลอดเวลาไม่ใช่ทั้งสองอย่างสามารถบรรลุอัตราการส่งข้อมูลสูงสุด 2.5Mbps ตัวรับส่งสัญญาณ MAX485 ดึงกระแสจ่ายระหว่าง120μAและ500μAภายใต้สภาวะที่ไม่มีการโหลดหรือโหลดเต็มที่เมื่อปิดใช้งานไดรเวอร์ ไดรเวอร์มีข้อ จำกัด สำหรับกระแสลัดวงจรและเอาต์พุตของไดรเวอร์สามารถวางไว้ที่สถานะอิมพีแดนซ์สูงผ่านวงจรปิดระบบระบายความร้อน อินพุตตัวรับมีคุณสมบัติไม่ปลอดภัยซึ่งรับประกันลอจิกเอาต์พุตสูงหากอินพุตเป็นวงจรเปิดนอกจากนี้ยังมีประสิทธิภาพในการป้องกันสัญญาณรบกวนที่แข็งแกร่ง นอกจากนี้ยังมีไฟ LED ออนบอร์ดเพื่อแสดงสถานะปัจจุบันของชิปเช่นว่าชิปถูกขับเคลื่อนหรือส่งหรือรับข้อมูลทำให้ง่ายต่อการดีบักและใช้งาน
แผนภาพวงจรที่ให้ไว้ข้างต้นอธิบายว่า MAX485 IC บนบอร์ดเชื่อมต่อกับส่วนประกอบต่างๆอย่างไรและมีส่วนหัวระยะห่างมาตรฐาน 0.1 นิ้วเพื่อใช้กับเขียงหั่นขนมหากต้องการ
สายเคเบิล Ethernet CAT-6E
เมื่อเราคิดถึงการถ่ายโอนข้อมูลทางไกลเราจะคิดถึงการเชื่อมต่ออินเทอร์เน็ตผ่านสายอีเทอร์เน็ตทันที ปัจจุบันส่วนใหญ่เราใช้ Wi-Fi สำหรับการเชื่อมต่ออินเทอร์เน็ต แต่ก่อนหน้านี้เราเคยใช้สายอีเทอร์เน็ตไปยังคอมพิวเตอร์ส่วนบุคคลแต่ละเครื่องเพื่อเชื่อมต่ออินเทอร์เน็ต เหตุผลหลักที่อยู่เบื้องหลังการใช้สายอีเธอร์เน็ตเหล่านี้ผ่านสายไฟปกติคือให้การป้องกันที่ดีกว่ามากจากเสียงที่เล็ดลอดเข้ามาและการบิดเบือนของสัญญาณในระยะทางไกล พวกเขามี Shielding Jacket เหนือชั้นฉนวนเพื่อป้องกันการรบกวนทางแม่เหล็กไฟฟ้าและสายไฟแต่ละคู่จะถูกบิดเข้าด้วยกันเพื่อป้องกันการก่อตัวของลูปในปัจจุบันและป้องกันเสียงรบกวนได้ดีกว่ามาก มักจะถูกยกเลิกด้วยขั้วต่อ RJ45 8 พินที่ปลายทั้งสองข้าง มีสายอีเทอร์เน็ตหลายประเภทที่เราสามารถใช้ได้เช่น CAT-4, CAT-5,CAT-5E, CAT-6, CAT-6A เป็นต้นในบทช่วยสอนของเราเราจะใช้สาย CAT-6E ซึ่งมีสาย 24AWG 4 คู่บิดเกลียวและสามารถรองรับได้ถึง 600MHz
ภาพแสดงการบิดสายคู่ภายใน Insulation Layer ของสาย CAT-6E
ขั้วต่อ RJ-45 หมายถึงสายเคเบิลอีเธอร์เน็ต CAT-6E
คำอธิบายรหัส Arduino
ในโปรเจ็กต์นี้เราใช้ Arduino Nano สองตัวตัวหนึ่งเป็นตัวส่งและอีกตัวเป็นตัวรับซึ่งแต่ละตัวจะขับจอ LCD ตัวอักษรและตัวเลข 16 * 2 เพื่อแสดงผลลัพธ์ ดังนั้นในรหัส Arduino เราจะเน้นไปที่การส่งข้อมูลและแสดงผลที่ส่งหรือรับข้อมูลบนหน้าจอ LCD
สำหรับด้านเครื่องส่ง:
เราเริ่มต้นด้วยการรวมไลบรารีมาตรฐานสำหรับการขับเคลื่อน LCD และประกาศพิน D8 ของ Arduino Nano เป็นพินเอาต์พุตซึ่งต่อไปเราจะใช้เพื่อประกาศ MAX485 Module เป็นตัวส่งหรือตัวรับ
int enablePin = 8; int potval = 0; # รวม
ตอนนี้มาถึงส่วนการตั้งค่า เราจะดึงพินเปิดใช้งานให้สูงเพื่อให้โมดูล MAX485 อยู่ในโหมดเครื่องส่งสัญญาณ เนื่องจากเป็น IC แบบ half-duplex จึงไม่สามารถส่งและรับได้ในเวลาเดียวกัน นอกจากนี้เราจะเริ่มต้น LCD ที่นี่และพิมพ์ข้อความต้อนรับ
Serial.begin (9600); // เริ่มต้นอนุกรมที่ baudrate 9600: pinMode (enablePin, OUTPUT); lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("เครื่องส่งนาโน"); ล่าช้า (3000); lcd.clear ();
ตอนนี้ในลูปเราเขียนค่าจำนวนเต็มที่เพิ่มขึ้นอย่างต่อเนื่องบนบรรทัด Serial ซึ่งจะถูกส่งไปยังนาโนอื่น ๆ ค่านี้ยังพิมพ์บน LCD สำหรับการแสดงผลและการดีบัก
Serial.print ("ค่าที่ส่ง ="); Serial.println (potval); // Serial Write POTval ไปยัง RS-485 Bus lcd.setCursor (0,0); lcd.print ("มูลค่าที่ส่ง"); lcd.setCursor (0,1); lcd.print (potval); ล่าช้า (1,000); lcd.clear (); หม้อ + = 1;
ด้านรับ:
ที่นี่อีกครั้งเราเริ่มต้นด้วยการรวมไลบรารีมาตรฐานสำหรับการขับเคลื่อน LCD และประกาศพิน D8 ของ Arduino Nano เป็นพินเอาต์พุตซึ่งเราจะใช้ในภายหลังเพื่อประกาศ MAX485 Module เป็นตัวส่งหรือตัวรับ
int enablePin = 8; # รวม
ตอนนี้มาถึงส่วนการตั้งค่า เราจะดึงขาเปิดใช้งานให้สูงเพื่อให้โมดูล MAX485 อยู่ในโหมดรับ เนื่องจากเป็น Half-duplex IC จึงไม่สามารถส่งและรับได้ในเวลาเดียวกัน นอกจากนี้เราจะเริ่มต้น LCD ที่นี่และพิมพ์ข้อความต้อนรับ
Serial.begin (9600); // เริ่มต้นอนุกรมที่ baudrate 9600: pinMode (enablePin, OUTPUT); lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("ตัวรับนาโน"); ล่าช้า (3000); digitalWrite (enablePin, LOW); // (Pin 8 เสมอ LOW เพื่อรับค่าจาก Master)
ตอนนี้ในลูปเราตรวจสอบว่ามีอะไรอยู่ในพอร์ตอนุกรมจากนั้นอ่านข้อมูลและเนื่องจากข้อมูลขาเข้าเป็นจำนวนเต็มเราจึงแยกวิเคราะห์และแสดงบน LCD ที่เชื่อมต่อ
int pwmval = Serial.parseInt (); // รับค่า INTEGER จาก Master ผ่าน RS-485 Serial.print ("I got value"); Serial.println (pwmval); lcd.setCursor (0,0); lcd.print ("มูลค่าที่ได้รับ"); lcd.setCursor (0,1); lcd.print (pwmval); ล่าช้า (1,000); lcd.clear ();
สรุป
การตั้งค่าการทดสอบที่เราใช้สำหรับโครงการนี้มีอยู่ด้านล่าง
การทำงานทั้งหมดของโครงการนี้สามารถพบได้ในวิดีโอที่ลิงก์ด้านล่าง วิธีนี้เป็นหนึ่งในวิธีการที่ง่ายและสะดวกในการถ่ายโอนข้อมูลในระยะทางไกล ในโปรเจ็กต์นี้เราใช้เพียงอัตราการส่งข้อมูลที่ 9600 ซึ่งต่ำกว่าความเร็วในการถ่ายโอนสูงสุดที่เราสามารถทำได้ด้วยโมดูล MAX-485 แต่ความเร็วนี้เหมาะสำหรับโมดูลเซ็นเซอร์ส่วนใหญ่ที่มีอยู่และเราไม่จำเป็นจริงๆ ความเร็วสูงสุดทั้งหมดในขณะที่ทำงานกับ Arduino และบอร์ดพัฒนาอื่น ๆ เว้นแต่คุณจะใช้สายเคเบิลเป็นการเชื่อมต่ออีเธอร์เน็ตและต้องการแบนด์วิดท์และความเร็วในการถ่ายโอนทั้งหมดที่คุณจะได้รับ เล่นด้วยความเร็วในการถ่ายโอนด้วยตัวคุณเองและลองใช้สายเคเบิลอีเธอร์เน็ตประเภทอื่นด้วย หากคุณมีคำถามใด ๆ ทิ้งไว้ในส่วนความคิดเห็นด้านล่างหรือใช้ฟอรัมของเราแล้วเราจะพยายามตอบคำถามให้ดีที่สุด ถึงตอนนั้น adios!