- โปรโตคอลการสื่อสารแบบอนุกรม RS-485
- RS-485 ใน Arduino
- ส่วนประกอบที่จำเป็น
- แผนภูมิวงจรรวม
- การเขียนโปรแกรม Arduino UNO และ Arduino Nano สำหรับการสื่อสารแบบอนุกรม RS485
- การควบคุมความสว่างของ LED ด้วย Serial Communication RS485
การเลือกโปรโตคอลการสื่อสารสำหรับการสื่อสารระหว่างไมโครคอนโทรลเลอร์และอุปกรณ์ต่อพ่วงเป็นส่วนสำคัญของระบบฝังตัว เป็นสิ่งสำคัญเนื่องจากประสิทธิภาพโดยรวมของแอปพลิเคชันที่ฝังไว้นั้นขึ้นอยู่กับวิธีการสื่อสารเนื่องจากเกี่ยวข้องกับการลดต้นทุนการถ่ายโอนข้อมูลที่เร็วขึ้นการครอบคลุมระยะทางไกลเป็นต้น
ในบทช่วยสอนก่อนหน้านี้เราได้เรียนรู้เกี่ยวกับโปรโตคอลการสื่อสาร I2C และโปรโตคอลการสื่อสาร SPI ใน Arduino ขณะนี้มีโปรโตคอลการสื่อสารแบบอนุกรมอื่นที่เรียกว่า RS-485โปรโตคอลนี้ใช้การสื่อสารแบบอนุกรมแบบอะซิงโครนัส ข้อได้เปรียบหลักของ RS-485 คือการถ่ายโอนข้อมูลทางไกลระหว่างอุปกรณ์สองเครื่อง และมักใช้ในสภาพแวดล้อมอุตสาหกรรมที่มีเสียงดังไฟฟ้า
ในบทช่วยสอนนี้เราจะเรียนรู้เกี่ยวกับการสื่อสารแบบอนุกรม RS-485 ระหว่าง Arduinos สองตัวจากนั้นสาธิตโดยการควบคุมความสว่างของ LED ที่เชื่อมต่อกับ Slave Arduino จาก Master Arduino โดยการส่งค่า ADC ผ่านโมดูล RS-485 โพเทนชิออมิเตอร์ 10k ใช้เพื่อเปลี่ยนค่า ADC ที่ Master Arduino
เริ่มต้นด้วยการทำความเข้าใจการทำงานของการสื่อสารแบบอนุกรม RS-485
โปรโตคอลการสื่อสารแบบอนุกรม RS-485
RS-485 เป็นโปรโตคอลการสื่อสารแบบอนุกรมแบบอะซิงโครนัสซึ่งไม่ต้องใช้สัญญาณนาฬิกา ใช้เทคนิคที่เรียกว่าสัญญาณที่แตกต่างเพื่อถ่ายโอนข้อมูลไบนารีจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่ง
วิธีการถ่ายโอนสัญญาณส่วนต่างนี้คืออะไร ??
วิธีสัญญาณดิฟเฟอเรนเชียลทำงานโดยการสร้างแรงดันแตกต่างโดยใช้ 5V บวกและลบ มันมีhalf-duplexสื่อสารเมื่อใช้สองสายและFull-Duplexต้อง4 สี่ สาย
โดยใช้วิธีนี้
- RS-485 รองรับอัตราการถ่ายโอนข้อมูลที่สูงขึ้นสูงสุด 30Mbps
- นอกจากนี้ยังให้ระยะการถ่ายโอนข้อมูลสูงสุดเมื่อเทียบกับโปรโตคอล RS-232 ถ่ายโอนข้อมูลได้สูงสุด 1200 เมตร
- ข้อได้เปรียบหลักของ RS-485 เหนือ RS-232 คือทาสหลายตัวที่มี Master เดียวในขณะที่ RS-232 รองรับเฉพาะทาสเดี่ยว
- สามารถมีอุปกรณ์ได้สูงสุด 32 เครื่องที่เชื่อมต่อกับโปรโตคอล RS-485
- ข้อดีอีกอย่างของ RS-485 คือมันมีภูมิคุ้มกันต่อเสียงรบกวนเนื่องจากใช้วิธีการส่งสัญญาณที่แตกต่าง
- RS-485 เร็วกว่าเมื่อเทียบกับโปรโตคอล I2C
RS-485 ใน Arduino
สำหรับการใช้ RS-485 ใน Arduino จำเป็นต้องใช้โมดูลที่เรียกว่า5V MAX485 TTL ถึง RS485 ซึ่งใช้ Maxim MAX485 ICเนื่องจากอนุญาตให้มีการสื่อสารแบบอนุกรมในระยะทางยาว 1200 เมตรและเป็นแบบสองทิศทาง ในโหมด half duplex มีอัตราการถ่ายโอนข้อมูล 2. 5Mbps
โมดูล 5V MAX485 TTL ถึง RS485ต้องการแรงดันไฟฟ้า 5V และใช้ระดับลอจิก 5V เพื่อให้สามารถเชื่อมต่อกับพอร์ตอนุกรมฮาร์ดแวร์ของไมโครคอนโทรลเลอร์เช่น Arduino
มีคุณสมบัติดังต่อไปนี้:
- แรงดันไฟฟ้า: 5V
- ชิป MAX485 ออนบอร์ด
- การใช้พลังงานต่ำสำหรับการสื่อสาร RS485
- ตัวรับส่งสัญญาณ จำกัด อัตราการเคลื่อนที่
- เทอร์มินัล 2P pitch 5.08 มม
- สายสื่อสาร RS-485 ที่สะดวก
- หมุดทั้งหมดของชิปถูกนำไปสู่การควบคุมผ่านไมโครคอนโทรลเลอร์
- ขนาดบอร์ด: 44 x 14 มม
Pin-Out ของ RS-485:
ชื่อพิน |
ใช้ |
VCC |
5V |
ก |
อินพุตตัวรับแบบไม่กลับด้าน เอาต์พุตไดรเวอร์ที่ไม่กลับด้าน |
ข |
Inverting ตัวรับอินพุต การเปลี่ยนเอาต์พุตไดรเวอร์ |
GND |
GND (0 โวลต์) |
R0 |
ตัวรับสัญญาณออก (ขา RX) |
RE |
เอาต์พุตตัวรับ (เปิดใช้งานต่ำ) |
DE |
เอาต์พุตไดรเวอร์ (เปิดใช้งานสูง) |
DI |
อินพุตไดรเวอร์ (พิน TX) |
โมดูล RS-485 นี้สามารถเชื่อมต่อกับ Arduino ได้อย่างง่ายดาย มาใช้พอร์ตอนุกรมฮาร์ดแวร์ของ Arduino 0 (RX) และ 1 (TX) (ใน UNO, NANO) การเขียนโปรแกรมทำได้ง่ายเพียงใช้ Serial.print () เพื่อเขียนไปยัง RS-485 และ Serial.Read () เพื่ออ่านจาก RS-485
ส่วนการเขียนโปรแกรมจะอธิบายโดยละเอียดในภายหลัง แต่ก่อนอื่นให้ตรวจสอบส่วนประกอบที่ต้องการและแผนภาพวงจร
ส่วนประกอบที่จำเป็น
- Arduino UNO หรือ Arduino NANO (2)
- MAX485 TTL เป็น RS485 Converter Module - (2)
- โพเทนชิออมิเตอร์ 10K
- จอ LCD 16x2
- LED
- เขียงหั่นขนม
- การเชื่อมต่อสายไฟ
ในบทช่วยสอนนี้Arduino Uno ใช้เป็น Master และ Arduino Nano ใช้เป็น Slave ที่นี่ใช้บอร์ด Arduino สองชุดดังนั้นจึงต้องใช้โมดูล RS-485 สองโมดูล
แผนภูมิวงจรรวม
การเชื่อมต่อวงจรระหว่าง RS-485 และ Arduino UNO (Master) ตัวแรก:
RS-485 |
Arduino UNO |
DI |
1 (TX) |
DE RE |
8 |
R0 |
0 (RX) |
VCC |
5V |
GND |
GND |
ก |
ถึง A ของ Slave RS-485 |
ข |
ถึง B ของ Slave RS-485 |
การเชื่อมต่อระหว่าง RS-485 ตัวที่สองและ Arduino Nano (Slave):
RS-485 |
Arduino UNO |
DI |
D1 (เท็กซัส) |
DE RE |
D8 |
R0 |
D0 (RX) |
VCC |
5V |
GND |
GND |
ก |
ถึง A ของ Master RS-485 |
ข |
ถึง B ของ Master RS-485 |
การเชื่อมต่อวงจรระหว่าง LCD 16x2 และ Arduino Nano:
16x2 LCD |
Arduino นาโน |
VSS |
GND |
VDD |
+ 5V |
V0 |
ไปยังพินกลางโพเทนชิออมิเตอร์เพื่อควบคุมความเปรียบต่างของ LCD |
อาร์เอส |
D2 |
RW |
GND |
จ |
D3 |
D4 |
D4 |
D5 |
D5 |
D6 |
D6 |
D7 |
D7 |
ก |
+ 5V |
เค |
GND |
โพเทนชิออมิเตอร์ 10K เชื่อมต่อกับ Analog Pin A0 ของ Arduino UNO เพื่อให้อินพุตแบบอะนาล็อกและ LED เชื่อมต่อกับพิน D10 ของ Arduino Nano
การเขียนโปรแกรม Arduino UNO และ Arduino Nano สำหรับการสื่อสารแบบอนุกรม RS485
สำหรับการเขียนโปรแกรมบอร์ด Arduino IDE ใช้ แต่ให้แน่ใจว่าคุณได้เลือกพอร์ตที่เกี่ยวข้องจากTools-> พอร์ตและคณะกรรมการจากTools-> คณะกรรมการ
โค้ดที่สมบูรณ์พร้อมวิดีโอสาธิตจะได้รับในตอนท้ายของบทช่วยสอนนี้ เรากำลังอธิบายส่วนสำคัญของโค้ด มีสองโปรแกรมในบทช่วยสอนนี้โปรแกรมหนึ่งสำหรับ Arduino UNO (Master) และอื่น ๆ สำหรับ Arduino Nano (Slave)
คำอธิบายรหัสสำหรับ Master: Arduino UNO
ในด้าน Master เพียงแค่ใช้อินพุตอนาล็อกที่พิน A0 โดยเปลี่ยนโพเทนชิออมิเตอร์จากนั้น SerialWrite ค่าเหล่านั้นไปยังบัส RS-485 ผ่าน Hardware Serial Ports (0,1) ของ Arduino UNO
ในการเริ่มการสื่อสารแบบอนุกรมที่ Hardware Serial Pins (0,1) ให้ใช้:
Serial.begin (9600);
การอ่านค่าอนาล็อกที่ A0 ขาของ Arduino UNO และเก็บไว้ในตัวแปร potval ใช้งาน:
int potval = analogRead (pushval);
ก่อนที่จะเขียนค่า potval ไปยังพอร์ตอนุกรมพิน DE & RE ของ RS-485 ควรเป็นHIGHที่เชื่อมต่อกับพิน 8 ของ Arduino UNO เพื่อสร้างพิน 8 สูง:
digitalWrite (enablePin, สูง);
ถัดไปเพื่อใส่ค่าเหล่านั้นใน Serial Port ที่เชื่อมต่อกับโมดูล RS-485 ให้ใช้คำสั่งต่อไปนี้
Serial.println (potval);
คำอธิบายรหัสสำหรับ Slave: Arduino NANO
ในฝั่ง Slave จะได้รับค่าจำนวนเต็มจาก Master RS-485 ที่มีอยู่ที่พอร์ต Hardware Serial ของ Arduino Nano (Pins -0,1) เพียงแค่อ่านค่าเหล่านั้นและเก็บไว้ในตัวแปร ค่าอยู่ในรูปของ (0 -1023) ดังนั้นจึงถูกแปลงเป็น (0-255) เนื่องจากใช้เทคนิค PWM เพื่อควบคุมความสว่างของ LED
จากนั้น AnalogWrite ค่าที่แปลงเหล่านั้นไปยังขา LED D10 (เป็นพิน PWM) ดังนั้นขึ้นอยู่กับค่า PWM ความสว่างของ LED จะเปลี่ยนไปและยังแสดงค่าเหล่านั้นในจอ LCD 16x2
เพื่อให้ทาส Arduino ของ RS-485 จะได้รับค่าจากโทเพียงให้หมุด DE และ RE ของ RS-485 LOWดังนั้นพิน D8 (enablePin) ของ Arduino NANO จึงถูกสร้างขึ้นเป็น LOW
digitalWrite (enablePin, LOW);
และเพื่ออ่านข้อมูลจำนวนเต็มที่มีอยู่ที่ Serial Port และเก็บไว้ในการใช้ตัวแปร
int pwmval = Serial.parseInt ();
ถัดไปแปลงค่าจาก (0-1023 ถึง 0-255) และเก็บไว้ในตัวแปร:
int แปลง = แผนที่ (pwmval, 0,1023,0,255);
จากนั้นเขียนค่าอนาล็อก (PWM) เพื่อปักหมุด D10 ที่ขั้วบวก LED เชื่อมต่อ:
analogWrite (ledpin, แปลง);
ในการพิมพ์ค่า PWM เหล่านั้นในจอ LCD 16x2 ให้ใช้
lcd.setCursor (0,0); lcd.print ("PWM จาก MASTER"); lcd.setCursor (0,1); lcd.print (แปลง);
การควบคุมความสว่างของ LED ด้วย Serial Communication RS485
เมื่อตั้งค่า PWM ไว้ที่ 0 โดยใช้โพเทนชิออมิเตอร์ไฟ LED จะดับลง
และเมื่อตั้งค่า PWM ไว้ที่ 251 โดยใช้โพเทนชิออมิเตอร์: LED จะเปิดขึ้นพร้อมความสว่างเต็มที่ดังแสดงในภาพด้านล่าง
ดังนั้นนี้เป็นวิธีที่RS485 สามารถใช้สำหรับการสื่อสารแบบอนุกรมใน Arduino