- การสื่อสารแบบอนุกรม RS-485
- ส่วนประกอบที่จำเป็น
- แผนภูมิวงจรรวม
- การเขียนโปรแกรม STM32F103C8 และ Arduino UNO สำหรับ RS485 Serial Communication
- การทดสอบการสื่อสาร RS485 ระหว่าง STM32F103C8 และ Arduino UNO:
โปรโตคอลการสื่อสารเป็นส่วนสำคัญของอุปกรณ์อิเล็กทรอนิกส์ดิจิทัลและระบบฝังตัว เมื่อใดก็ตามที่มีการเชื่อมต่อของไมโครคอนโทรลเลอร์และอุปกรณ์ต่อพ่วงหลายตัวจะต้องใช้โปรโตคอลการสื่อสารเพื่อแลกเปลี่ยนข้อมูลจำนวนมาก โปรโตคอลการสื่อสารแบบอนุกรมมีให้เลือกหลายประเภท RS485 เป็นหนึ่งในโปรโตคอลการสื่อสารแบบอนุกรมและใช้ในโครงการอุตสาหกรรมและเครื่องจักรกลหนัก
เราได้เรียนรู้เกี่ยวกับการสื่อสารแบบอนุกรม RS485 ระหว่าง Arduino Uno และ Arduino Nano ในการกวดวิชาก่อนหน้านี้ กวดวิชานี้เป็นเรื่องเกี่ยวกับการใช้RS-485 การสื่อสารแบบอนุกรมใน STM32F103C8 ไมโครคอนโทรลเลอร์ หากคุณยังใหม่กับไมโครคอนโทรลเลอร์ STM32 ให้เริ่มต้นด้วยการเริ่มต้นกับ STM32 โดยใช้ Arduino IDE: LED กะพริบและตรวจสอบโครงการ STM32 ทั้งหมดที่นี่
ในบทช่วยสอนนี้ Master STM32F103C8 มีปุ่มกดสามปุ่มที่ใช้เพื่อควบคุมสถานะของ LED สามดวงที่มีอยู่ที่ Slave Arduino Uno โดยใช้การสื่อสารแบบอนุกรม RS-485
เริ่มต้นด้วยการทำความเข้าใจการทำงานของการสื่อสารแบบอนุกรม RS-485
การสื่อสารแบบอนุกรม RS-485
RS-485 เป็นโปรโตคอลการสื่อสารแบบอนุกรมแบบอะซิงโครนัสซึ่งไม่ต้องใช้นาฬิกา ใช้เทคนิคที่เรียกว่าสัญญาณที่แตกต่างเพื่อถ่ายโอนข้อมูลไบนารีจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่ง
วิธีการถ่ายโอนสัญญาณดิฟเฟอเรนเชียลคืออะไร ??
วิธีสัญญาณดิฟเฟอเรนเชียลทำงานโดยการสร้างแรงดันแตกต่างโดยใช้ 5V บวกและลบ มันมีhalf-duplexสื่อสารเมื่อใช้สองสายและFull-Duplexสื่อสารเมื่อใช้สี่ สาย
โดยใช้วิธีนี้:
- RS-485 รองรับอัตราการถ่ายโอนข้อมูลที่สูงขึ้นสูงสุด 30Mbps
- นอกจากนี้ยังให้ระยะการถ่ายโอนข้อมูลสูงสุดเมื่อเทียบกับโปรโตคอล RS-232 ถ่ายโอนข้อมูลได้สูงสุด 1200 เมตร
- ข้อได้เปรียบหลักของ RS-485 เหนือ RS-232 คือทาสหลายตัวที่มี Master เดียวในขณะที่ RS-232 รองรับเฉพาะทาสเดี่ยว
- สามารถมีอุปกรณ์ได้สูงสุด 32 เครื่องที่เชื่อมต่อกับโปรโตคอล RS-485
- ข้อดีอีกอย่างของRS-485 คือไม่มีสัญญาณรบกวนเนื่องจากใช้วิธีการส่งสัญญาณที่แตกต่างกัน
- RS-485 เร็วกว่าเมื่อเทียบกับโปรโตคอล I2C
RS-485 โมดูลสามารถเชื่อมต่อกับไมโครคอนโทรลเลอร์ที่มีพอร์ตอนุกรม สำหรับการใช้โมดูล RS-485 กับไมโครคอนโทรลเลอร์โมดูลที่เรียกว่า5V MAX485 TTL ถึง RS485 ซึ่งใช้ Maxim MAX485 ICเป็นสิ่งจำเป็นเนื่องจากช่วยให้สามารถสื่อสารแบบอนุกรมได้ในระยะทางยาว 1200 เมตรและเป็นแบบสองทิศทางและ half duplex มีอัตราการถ่ายโอนข้อมูล 2.5 Mbps. โมดูลนี้ต้องการแรงดันไฟฟ้า 5V
RS-485 Pin Description:
ชื่อพิน |
คำอธิบาย |
VCC |
5V |
ก |
อินพุตตัวรับแบบไม่กลับด้าน เอาต์พุตไดรเวอร์ที่ไม่กลับด้าน |
ข |
Inverting ตัวรับอินพุต การเปลี่ยนเอาต์พุตไดรเวอร์ |
GND |
GND (0 โวลต์) |
R0 |
ตัวรับสัญญาณออก (ขา RX) |
RE |
เอาต์พุตตัวรับ (เปิดใช้งานต่ำ) |
DE |
เอาต์พุตไดรเวอร์ (เปิดใช้งานสูง) |
DI |
อินพุตไดรเวอร์ (พิน TX) |
โมดูล RS485 มีคุณสมบัติดังต่อไปนี้:
- แรงดันไฟฟ้า: 5V
- ชิป MAX485 ออนบอร์ด
- การใช้พลังงานต่ำสำหรับการสื่อสาร RS485
- ตัวรับส่งสัญญาณ จำกัด อัตราการเคลื่อนที่
- เทอร์มินัล 2P pitch 5.08 มม
- สายสื่อสาร RS-485 ที่สะดวก
- หมุดทั้งหมดของชิปถูกนำไปสู่การควบคุมผ่านไมโครคอนโทรลเลอร์
- ขนาดบอร์ด: 44 x 14 มม
การใช้โมดูลนี้กับ STM32F103C8 และ Arduino UNO นั้นง่ายมาก ใช้พอร์ตอนุกรมฮาร์ดแวร์ของไมโครคอนโทรลเลอร์ พินอนุกรมฮาร์ดแวร์ใน STM32 และ arduino UNO ได้รับด้านล่าง
- ใน STM32F103C8: Pins PA9 (TX) และ PA10 (RX)
- ใน Arduino Uno: Pin 0 (RX) & 1 (TX)
การเขียนโปรแกรมทำได้ง่ายเพียงแค่ใช้Serial.print ()เพื่อเขียนไปยัง RS-485 และSerial.Read ()เพื่ออ่านจาก RS-485 และหมุดDE & REของ RS-485 ถูกสร้างขึ้นต่ำเพื่อรับข้อมูลและทำให้สูงถึง เขียนข้อมูลไปยังบัส RS-485
ส่วนประกอบที่จำเป็น
- STM32F103C8
- Arduino UNO
- MAX485 TTL เป็น RS485 Converter Module - (2)
- โพเทนชิออมิเตอร์ 10K
- ปุ่มกด - 3
- LED - 3
- ตัวต้านทาน
- เขียงหั่นขนม
- การเชื่อมต่อสายไฟ
แผนภูมิวงจรรวม
ในบทช่วยสอนนี้STM32F103C8 ใช้เป็น Master กับโมดูล RS-485 หนึ่งโมดูลและ Arduino UNO ใช้เป็น Slave กับโมดูล RS-485อื่น
การเชื่อมต่อวงจรระหว่าง RS-485 และ STM32F103C8 (Master):
RS-485 |
STM32F103C8 |
DI |
PA9 (TX1) |
DE RE |
PA3 |
R0 |
PA10 (RX1) |
VCC |
5V |
GND |
GND |
ก |
ถึง A ของ Slave RS-485 |
ข |
ถึง B ของ Slave RS-485 |
STM32F103C8 พร้อมปุ่มกดสามปุ่ม:
ปุ่มกดสามปุ่มพร้อมตัวต้านทานแบบดึงลงสามตัวที่ 10k เชื่อมต่อกับพิน PA0, PA1, PA2 ของ STM32F103C8
การเชื่อมต่อวงจรระหว่าง RS-485 และ Arduino UNO (Slave):
RS-485 |
Arduino UNO |
DI |
1 (TX) |
DE RE |
2 |
R0 |
0 (RX) |
VCC |
5V |
GND |
GND |
ก |
ถึง A ของ Master RS-485 |
ข |
ถึง B ของ Master RS-485 |
ใช้ LED สามดวงโดยที่แอโนดของ LED ที่มีตัวต้านทาน 330 โอห์มเชื่อมต่อกับพิน 4, 7, 8 ของ Arduino UNO และแคโทดของ LED เชื่อมต่อกับ GND
การเขียนโปรแกรม STM32F103C8 และ Arduino UNO สำหรับ RS485 Serial Communication
Arduino IDE ใช้สำหรับการพัฒนาและการเขียนโปรแกรมของทั้งสองบอร์ดเช่น STM32 และ Arduino UNO แต่ให้แน่ใจว่าคุณได้เลือกพอร์ตที่เกี่ยวข้องจากTools-> พอร์ตและคณะกรรมการจากTools-> คณะกรรมการ หากคุณพบปัญหาหรือข้อสงสัยเพียงอ้างอิงการเขียนโปรแกรม STM32 ของคุณใน ARDUINO IDE การเขียนโปรแกรมสำหรับบทช่วยสอนนี้ประกอบด้วยสองส่วนหนึ่งสำหรับ STM32F103C8 (Master) และอื่น ๆ สำหรับ Arduino UNO (Slave) รหัสทั้งสองจะอธิบายทีละรหัสด้านล่าง
STM32F103C8 เป็น Masterในด้าน Master สถานะของปุ่มกดจะถูกอ่านแล้วเขียนค่าเหล่านั้นไปยังบัส RS-485 แบบอนุกรมผ่าน Hardware Serial Ports 1 (PA9, PA10) ของ STM32F103C8 นอกจากนี้ยังไม่มีไลบรารีภายนอกที่จำเป็นในตอนนี้ Arduino มีไลบรารีที่จำเป็นทั้งหมดสำหรับการสื่อสารแบบอนุกรม
เริ่มการสื่อสารแบบอนุกรมโดยใช้ Hardware Serial Pins (PA9, PA10) ที่อัตรา 9600
Serial1.begin (9600);
อ่านสถานะของปุ่มกดที่พิน PA0, PA1, PA2 ของ STM32F103C8 และเก็บไว้ในตัวแปร button1val, button2val, button3val ค่าจะสูงหากกดปุ่มและ LOW เมื่อไม่ได้กด
int button1val = digitalRead (button1); int button2val = digitalRead (button2); int button3val = digitalRead (button3);
ก่อนส่งค่าปุ่มไปยังพอร์ตอนุกรมพิน DE & RE ของ RS-485 ควรเป็น HIGH ที่เชื่อมต่อกับพิน PA3 ของ STM32F103C8 (เพื่อสร้างพิน PA3 HIGH):
digitalWrite (enablePin, สูง);
ถัดไปเพื่อใส่ค่าเหล่านั้นใน Serial Port และส่งค่าขึ้นอยู่กับว่ากดปุ่มใดใช้คำสั่ง if else และส่งค่าที่เกี่ยวข้องเมื่อกดปุ่ม
หากกดปุ่มแรกเงื่อนไขจะตรงกันและค่า '1' จะถูกส่งไปยังพอร์ตอนุกรมที่เชื่อมต่อกับ Arduino UNO
ถ้า (button1val == สูง) { int num1 = 1; Serial1.println (num1); }
ในทำนองเดียวกันเมื่อกดปุ่ม 2 ค่า 2 จะถูกส่งผ่านพอร์ตอนุกรมและเมื่อกดปุ่ม 3 ค่า 3 จะถูกส่งผ่านพอร์ตอนุกรม
อื่นถ้า (button2val == สูง) { int num2 = 2; Serial1.println (num2); } else if (button3val == สูง) { int num3 = 3; Serial1.println (num3); }
และเมื่อไม่มีการกดปุ่มค่า 0 จะถูกส่งไปยัง Arduino Uno
อื่น ๆ { int num = 0; Serial1.println (num); }
เสร็จสิ้นการเขียนโปรแกรมเพื่อกำหนดค่า STM32 เป็น Master
Arduino UNO เป็น Slaveในด้าน Slave Arduino UNO จะรับค่าจำนวนเต็มที่ส่งมาจาก Master STM32F103C8ซึ่งมีอยู่ที่พอร์ต Hardware Serial ของ Arduino UNO (P0, 1) ที่เชื่อมต่อโมดูล RS-485
เพียงแค่อ่านค่าและเก็บไว้ในตัวแปร ขึ้นอยู่กับค่าที่ได้รับ LED ที่เกี่ยวข้องจะเปิดหรือปิดเชื่อมต่อกับ Arduino GPIO
จะได้รับค่าจากโทเพียงแค่ทำให้หมุด DE และ RE ของ RS-485 โมดูลต่ำดังนั้น pin-2 (enablePin) ของ Arduino UNO จึงถูกสร้างขึ้นเป็น LOW
digitalWrite (enablePin, LOW);
ตอนนี้เพียงแค่อ่านข้อมูลจำนวนเต็มที่มีอยู่ที่ Serial Port และเก็บไว้ในตัวแปร
int รับ = Serial.parseInt ();
ขึ้นอยู่กับค่าเช่น (0, 1, 2, 3) ที่ได้รับไฟ LED หนึ่งในสามดวงที่เกี่ยวข้องจะเปิดอยู่
ถ้า (รับ == 1) // ขึ้นอยู่กับค่าที่ได้รับ LED ที่เกี่ยวข้องจะเปิดหรือปิด { digitalWrite (ledpin1, HIGH); } else if (รับ == 2) { digitalWrite (ledpin2, HIGH); } else if (รับ == 3) { digitalWrite (ledpin3, HIGH); } else { digitalWrite (ledpin1, LOW); digitalWrite (ledpin2, LOW); digitalWrite (ledpin3, LOW); }
เสร็จสิ้นการเขียนโปรแกรมและกำหนดค่า Arduino UNO เป็น Slave นอกจากนี้ยังเสร็จสิ้นการกำหนดค่าที่สมบูรณ์สำหรับ Arduino UNO และ STM32 วิดีโอการใช้งานและรหัสทั้งหมดแนบท้ายบทช่วยสอนนี้
การทดสอบการสื่อสาร RS485 ระหว่าง STM32F103C8 และ Arduino UNO:
1. เมื่อกดปุ่ม -1 ซึ่งเชื่อมต่อกับ Master STM32 แล้ว LED 1 จะเปิดการเชื่อมต่อกับ Slave Arduino
2. เมื่อกดปุ่ม -2 ซึ่งเชื่อมต่อกับ Master STM32 แล้ว LED 2 จะเปิดขึ้นโดยเชื่อมต่อกับ Slave Arduino
3. ในทำนองเดียวกันเมื่อกดปุ่ม Push-3 ไฟ LED 3 จะเปิดเชื่อมต่อกับ Slave Arduino
นี้เสร็จสิ้นการสื่อสารแบบอนุกรม RS485 ระหว่าง STM32F103C8 และ Arduino UNO บอร์ด Arduino UNO และ STM32 เป็นบอร์ดที่ใช้กันอย่างแพร่หลายสำหรับการสร้างต้นแบบอย่างรวดเร็วและเราได้ทำโครงการที่มีประโยชน์มากมายบนบอร์ดเหล่านี้ หากคุณพบข้อสงสัยหรือมีข้อเสนอแนะใด ๆ สำหรับเราโปรดเขียนและแสดงความคิดเห็นด้านล่าง