- Σειριακή επικοινωνία RS-485
- Απαιτούμενα στοιχεία
- Διάγραμμα κυκλώματος
- Προγραμματισμός STM32F103C8 & Arduino UNO για σειριακή επικοινωνία RS485
- Δοκιμή της επικοινωνίας RS485 μεταξύ STM32F103C8 και Arduino UNO:
Τα πρωτόκολλα επικοινωνίας αποτελούν αναπόσπαστο μέρος ενός ψηφιακού ηλεκτρονικού και ενσωματωμένου συστήματος. Όπου υπάρχει διασύνδεση πολλαπλών μικροελεγκτών και περιφερειακών, το πρωτόκολλο επικοινωνίας πρέπει να χρησιμοποιηθεί για την ανταλλαγή πολλών δεδομένων. Υπάρχουν πολλοί τύποι πρωτοκόλλων σειριακής επικοινωνίας. Το RS485 είναι ένα από τα πρωτόκολλα σειριακής επικοινωνίας και χρησιμοποιείται σε βιομηχανικά έργα και βαριά μηχανήματα.
Μάθαμε για τη σειριακή επικοινωνία RS485 μεταξύ του Arduino Uno και του Arduino Nano στο προηγούμενο σεμινάριο . Αυτό το σεμινάριο αφορά τη χρήση μιας σειριακής επικοινωνίας RS-485 στον μικροελεγκτή STM32F103C8. Εάν είστε νέοι στο STM32 Microcontroller, ξεκινήστε με το Ξεκινώντας με το STM32 χρησιμοποιώντας το Arduino IDE: Blinking 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 Module μπορεί να συνδεθεί με οποιονδήποτε μικροελεγκτή με σειριακή θύρα. Για τη χρήση της μονάδας RS-485 με μικροελεγκτές απαιτείται μια μονάδα που ονομάζεται 5V MAX485 TTL έως RS485, η οποία βασίζεται στο Maxim MAX485 IC, καθώς επιτρέπει σειριακή επικοινωνία σε μεγάλη απόσταση 1200 μέτρων και είναι αμφίδρομη και το μισό διπλό έχει ρυθμό μεταφοράς δεδομένων 2,5 Mbps. Αυτή η μονάδα απαιτεί τάση 5V.
Περιγραφή ακροδέκτη RS-485:
Όνομα καρφιτσώματος |
Περιγραφή |
VCC |
5V |
ΕΝΑ |
Είσοδος δέκτη χωρίς αναστροφή Έξοδος μη αναστρέψιμου προγράμματος οδήγησης |
σι |
Αντιστροφή εισόδου δέκτη Αναστροφή εξόδου προγράμματος οδήγησης |
GND |
GND (0V) |
R0 |
Έξοδος δέκτη (ακίδα RX) |
ΣΧΕΤΙΚΑ ΜΕ |
Έξοδος δέκτη (LOW-Enable) |
DE |
Έξοδος προγράμματος οδήγησης (Υψηλή ενεργοποίηση) |
ΔΙ |
Είσοδος προγράμματος οδήγησης (ακροδέκτης TX) |
Η μονάδα RS485 έχει τα ακόλουθα χαρακτηριστικά:
- Τάση λειτουργίας: 5V
- Ενσωματωμένο τσιπ MAX485
- Χαμηλή κατανάλωση ενέργειας για την επικοινωνία RS485
- Πομποδέκτης περιορισμένου ρυθμού Slew
- Ακροδέκτης 5P ύψους 5,08 mm
- Βολική καλωδίωση επικοινωνίας RS-485
- Όλοι οι ακροδέκτες τσιπ έχουν ελεγχθεί μέσω του μικροελεγκτή
- Μέγεθος πίνακα: 44 x 14mm
Η χρήση αυτής της μονάδας με STM32F103C8 και Arduino UNO είναι πολύ εύκολη. Χρησιμοποιούνται οι σειριακές θύρες υλικού των μικροελεγκτών. Οι σειριακές καρφίτσες υλικού στο STM32 και στο arduino UNO δίνονται παρακάτω.
- Στο STM32F103C8: Καρφίτσες PA9 (TX) & PA10 (RX)
- Στο Arduino Uno: Pin 0 (RX) & 1 (TX)
Ο προγραμματισμός είναι επίσης απλός απλώς χρησιμοποιήστε το Serial.print () για εγγραφή σε RS-485 και Serial. Διαβάστε () για ανάγνωση από RS-485 και οι καρφίτσες DE & RE του RS-485 είναι ΧΑΜΗΛΟ για τη λήψη δεδομένων και γίνεται ΥΨΗΛΟΣ έως εγγραφή δεδομένων στο δίαυλο RS-485.
Απαιτούμενα στοιχεία
- STM32F103C8
- Arduino UNO
- Μονάδα μετατροπέα MAX485 TTL σε RS485 - (2)
- Ποτενσιόμετρο 10Κ
- Κουμπί Push - 3
- LED - 3
- Αντιστάσεις
- Ψωμί
- Σύνδεση καλωδίων
Διάγραμμα κυκλώματος
Σε αυτό το σεμινάριο το STM32F103C8 χρησιμοποιείται ως Master με μία μονάδα RS-485 και το Arduino UNO χρησιμοποιείται ως Slave με μια άλλη μονάδα RS-485.
Σύνδεση κυκλώματος μεταξύ RS-485 και STM32F103C8 (Master):
RS-485 |
STM32F103C8 |
ΔΙ |
PA9 (TX1) |
DE ΣΧΕΤΙΚΑ ΜΕ |
ΡΑ3 |
R0 |
PA10 (RX1) |
VCC |
5V |
GND |
GND |
ΕΝΑ |
Προς Α του Slave RS-485 |
σι |
Προς Β του Slave RS-485 |
STM32F103C8 με πλήκτρο Three Push:
Τρία κουμπιά Push με τρία Pull Down Resistor των 10k συνδέονται στις ακίδες PA0, PA1, PA2 του STM32F103C8.
Σύνδεση κυκλώματος μεταξύ του RS-485 και του Arduino UNO (Slave):
RS-485 |
Arduino UNO |
ΔΙ |
1 (TX) |
DE ΣΧΕΤΙΚΑ ΜΕ |
2 |
R0 |
0 (RX) |
VCC |
5V |
GND |
GND |
ΕΝΑ |
Προς Α του Master RS-485 |
σι |
Προς Β του Master RS-485 |
Χρησιμοποιούνται τρία LED όπου οι άνοδοι των LED με αντίσταση 330 ohms συνδέονται στις ακίδες 4, 7, 8 του Arduino UNO και η Cathode των LED συνδέονται στο GND.
Προγραμματισμός STM32F103C8 & Arduino UNO για σειριακή επικοινωνία RS485
Το Arduino IDE χρησιμοποιείται για την ανάπτυξη και τον προγραμματισμό και των δύο πινάκων, δηλαδή STM32 και Arduino UNO. Αλλά βεβαιωθείτε ότι έχετε επιλέξει το αντίστοιχο PORT από Tools-> Port and Board από Tools-> Board. Εάν βρείτε δυσκολίες ή αμφιβολίες, απλώς ανατρέξτε στον προγραμματισμό του STM32 σας στο ARDUINO IDE. Ο προγραμματισμός για αυτό το σεμινάριο αποτελείται από δύο ενότητες ένα για STM32F103C8 (Master) και άλλο για Arduino UNO (Slave). Και οι δύο κωδικοί θα εξηγηθούν ένας προς έναν παρακάτω.
STM32F103C8 ως MasterΣτην κύρια πλευρά, διαβάζεται η κατάσταση του κουμπιού ώθησης και στη συνέχεια γράφονται σειριακά αυτές οι τιμές στο δίαυλο RS-485 μέσω των σειριακών θυρών υλικού 1 (PA9, PA10) του STM32F103C8. Επίσης δεν απαιτείται εξωτερική βιβλιοθήκη από τώρα. Το Arduino διαθέτει όλη την απαραίτητη βιβλιοθήκη για σειριακή επικοινωνία.
Ξεκινήστε τη σειριακή επικοινωνία χρησιμοποιώντας Hardware Serial Pins (PA9, PA10) στο buadrate του 9600.
Serial1.begin (9600);
Διαβάστε την κατάσταση του μπουτόν στις ακίδες PA0, PA1, PA2 του STM32F103C8 και αποθηκεύστε τα σε μεταβλητό κουμπί1val, button2val, button3val. Η τιμή είναι ΥΨΗΛΗ εάν πατηθεί το κουμπί και ΧΑΜΗΛΟ όταν δεν πατηθεί.
int button1val = digitalRead (κουμπί1); int button2val = digitalRead (κουμπί2); int button3val = digitalRead (κουμπί3);
Πριν από την αποστολή των τιμών κουμπιών στη σειριακή θύρα, οι ακίδες DE & RE του RS-485 πρέπει να είναι ΥΨΗΛΟ που είναι συνδεδεμένοι με τον πείρο PA3 του STM32F103C8 (Για να φτιάξετε τον πείρο PA3 HIGH):
digitalWrite (enablePin, HIGH);
Στη συνέχεια για να βάλετε αυτές τις τιμές στη σειριακή θύρα και να στείλετε τιμές ανάλογα με το κουμπί που πιέζεται χρησιμοποιήστε δήλωση if αλλού και στείλτε την αντίστοιχη τιμή όταν πατήσετε το κουμπί.
Εάν πατηθεί το πρώτο κουμπί τότε η συνθήκη ταιριάζει και η τιμή «1» αποστέλλεται στη σειριακή θύρα όπου είναι συνδεδεμένο το Arduino UNO.
εάν (button1val == HIGH) { int num1 = 1; Serial1.println (αριθμός 1); }
Παρομοίως, όταν πατηθεί το κουμπί 2, η τιμή 2 αποστέλλεται μέσω σειριακής θύρας και όταν πατηθεί το κουμπί 3 η τιμή 3 αποστέλλεται μέσω της σειριακής θύρας.
αλλιώς εάν (button2val == HIGH) { int num2 = 2; Serial1.println (αριθμός 2); } αλλιώς εάν (button3val == HIGH) { int num3 = 3; Serial1.println (αριθμός 3); }
Και όταν δεν πατηθεί κανένα κουμπί, η τιμή 0 αποστέλλεται στο Arduino Uno.
αλλιώς { int num = 0; Serial1.println (αριθμός); }
Αυτό ολοκληρώνει τον προγραμματισμό για να ρυθμίσετε το STM32 ως Master.
Arduino UNO ως SlaveΣτην πλευρά Slave το Arduino UNO λαμβάνει μια ακέραια τιμή που αποστέλλεται από το Master STM32F103C8, το οποίο είναι διαθέσιμο στη Σειριακή θύρα Hardware του Arduino UNO (P0, 1) όπου είναι συνδεδεμένη η μονάδα RS-485.
Απλώς διαβάστε την τιμή και αποθηκεύστε σε μια μεταβλητή. Ανάλογα με την τιμή που λαμβάνεται, το αντίστοιχο LED ανάβει ή απενεργοποιείται συνδεδεμένο στο Arduino GPIO.
Για να λάβετε τις τιμές από το Master, απλώς κάντε τις καρφίτσες DE & RE της μονάδας RS-485 LOW. Έτσι, το pin-2 (enablePin) του Arduino UNO γίνεται LOW.
digitalWrite (enablePin, LOW);
Τώρα απλώς διαβάστε τα ακέραια δεδομένα που είναι διαθέσιμα στο Serial Port και αποθηκεύστε τα σε μια μεταβλητή.
int λήψη = Serial.parseInt ();
Ανάλογα με την τιμή δηλ. (0, 1, 2, 3) που ελήφθη, αντίστοιχα ένα από τα τρία LED ανάβει.
if (λήψη == 1) // Ανάλογα με την τιμή που λαμβάνεται, η αντίστοιχη λυχνία LED ανάβει ή απενεργοποιείται { digitalWrite (ledpin1, HIGH). } αλλιώς εάν (λάβετε == 2) { digitalWrite (ledpin2, HIGH); } αλλιώς εάν (λάβετε == 3) { digitalWrite (ledpin3, HIGH); } αλλιώς { digitalWrite (ledpin1, LOW); digitalWrite (ledpin2, LOW); digitalWrite (ledpin3, LOW); }
Αυτό ολοκληρώνει τον προγραμματισμό και τη διαμόρφωση του Arduino UNO ως Slave. Επίσης, αυτό ολοκληρώνει τις πλήρεις διαμορφώσεις για Arduino UNO και STM32. Το βίντεο εργασίας και όλοι οι κωδικοί επισυνάπτονται στο τέλος αυτού του σεμιναρίου.
Δοκιμή της επικοινωνίας RS485 μεταξύ STM32F103C8 και Arduino UNO:
1. Όταν πιέσετε το κουμπί Push-1, το οποίο είναι συνδεδεμένο στο Master STM32, το LED 1 ανάβει συνδεδεμένο στο Slave Arduino.
2. Όταν πατηθεί το κουμπί Push-2, το οποίο είναι συνδεδεμένο στο Master STM32, το LED 2 Turns ON είναι συνδεδεμένο στο Slave Arduino.
3. Ομοίως, όταν πατηθεί το κουμπί Push-3, το LED 3 ανάβει συνδεδεμένο με το Slave Arduino.
Αυτό ολοκληρώνει την σειριακή επικοινωνία RS485 μεταξύ STM32F103C8 και Arduino UNO. Οι πίνακες Arduino UNO και STM32 είναι ευρέως χρησιμοποιούμενες σανίδες για γρήγορο πρωτότυπο και έχουμε κάνει πολλά χρήσιμα έργα σε αυτούς τους πίνακες. Αν βρείτε αμφιβολίες ή έχετε κάποια πρόταση για εμάς, γράψτε και σχολιάστε παρακάτω.