- Πρωτόκολλο σειριακής επικοινωνίας RS-485
- RS-485 στο Arduino
- Απαιτούμενα στοιχεία
- Διάγραμμα κυκλώματος
- Προγραμματισμός Arduino UNO & Arduino Nano για RS485 Serial Communication
- Έλεγχος φωτεινότητας LED με σειριακή επικοινωνία 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 Fours.
Χρησιμοποιώντας αυτήν τη μέθοδο
- Το 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 to RS485 απαιτεί τάση 5V και χρησιμοποιεί επίπεδα λογικής 5V έτσι ώστε να μπορεί να διασυνδεθεί με σειριακές θύρες υλικού μικροελεγκτών όπως το Arduino.
Έχει τα ακόλουθα χαρακτηριστικά:
- Τάση λειτουργίας: 5V
- Ενσωματωμένο τσιπ MAX485
- Χαμηλή κατανάλωση ενέργειας για την επικοινωνία RS485
- Πομποδέκτης περιορισμένου ρυθμού Slew
- Ακροδέκτης 5P ύψους 5,08 mm
- Βολική καλωδίωση επικοινωνίας RS-485
- Όλοι οι ακροδέκτες τσιπ έχουν ελεγχθεί μέσω του μικροελεγκτή
- Μέγεθος πίνακα: 44 x 14mm
Pin-Out του RS-485:
Όνομα καρφιτσώματος |
Χρήση |
VCC |
5V |
ΕΝΑ |
Είσοδος δέκτη χωρίς αναστροφή Έξοδος μη αναστρέψιμου προγράμματος οδήγησης |
σι |
Αντιστροφή εισόδου δέκτη Αναστροφή εξόδου προγράμματος οδήγησης |
GND |
GND (0V) |
R0 |
Έξοδος δέκτη (ακίδα RX) |
ΣΧΕΤΙΚΑ ΜΕ |
Έξοδος δέκτη (LOW-Enable) |
DE |
Έξοδος προγράμματος οδήγησης (Υψηλή ενεργοποίηση) |
ΔΙ |
Είσοδος προγράμματος οδήγησης (ακροδέκτης TX) |
Αυτή η μονάδα RS-485 μπορεί εύκολα να διασυνδεθεί με το Arduino. Ας χρησιμοποιήσουμε τις σειριακές θύρες υλικού των Arduino 0 (RX) και 1 (TX) (In UNO, NANO). Ο προγραμματισμός είναι επίσης απλός απλώς χρησιμοποιήστε το Serial.print () για εγγραφή σε RS-485 και Serial. Διαβάστε () για ανάγνωση από RS-485.
Το τμήμα προγραμματισμού εξηγείται αργότερα λεπτομερώς, αλλά πρώτα ας ελέγξουμε τα απαιτούμενα εξαρτήματα και το διάγραμμα κυκλώματος.
Απαιτούμενα στοιχεία
- Arduino UNO ή Arduino NANO (2)
- Μονάδα μετατροπέα MAX485 TTL σε RS485 - (2)
- Ποτενσιόμετρο 10Κ
- Οθόνη LCD 16x2
- LED
- Ψωμί
- Σύνδεση καλωδίων
Σε αυτό το σεμινάριο το Arduino Uno χρησιμοποιείται ως Master και το Arduino Nano χρησιμοποιείται ως Slave. Χρησιμοποιούνται δύο πίνακες Arduino, οπότε απαιτούνται δύο μονάδες RS-485.
Διάγραμμα κυκλώματος
Σύνδεση κυκλώματος μεταξύ του πρώτου RS-485 και του Arduino UNO (Master):
RS-485 |
Arduino UNO |
ΔΙ |
1 (TX) |
DE ΣΧΕΤΙΚΑ ΜΕ |
8 |
R0 |
0 (RX) |
VCC |
5V |
GND |
GND |
ΕΝΑ |
Προς Α του Slave RS-485 |
σι |
Προς Β του Slave RS-485 |
Σύνδεση μεταξύ δεύτερου RS-485 και Arduino Nano (Slave):
RS-485 |
Arduino UNO |
ΔΙ |
D1 (TX) |
DE ΣΧΕΤΙΚΑ ΜΕ |
Δ8 |
R0 |
D0 (RX) |
VCC |
5V |
GND |
GND |
ΕΝΑ |
Προς Α του Master RS-485 |
σι |
Προς Β του Master RS-485 |
Σύνδεση κυκλώματος μεταξύ LCD 16x2 και Arduino Nano:
LCD 16x2 |
Arduino Nano |
VSS |
GND |
VDD |
+ 5V |
V0 |
Στο κεντρικό πείρο ποτενσιόμετρου για έλεγχο αντίθεσης LCD |
RS |
Δ2 |
RW |
GND |
μι |
Δ3 |
Δ4 |
Δ4 |
Δ5 |
Δ5 |
Δ6 |
Δ6 |
Δ7 |
Δ7 |
ΕΝΑ |
+ 5V |
κ |
GND |
Ένα ποτενσιόμετρο 10K συνδέεται στον αναλογικό ακροδέκτη A0 του Arduino UNO για την παροχή αναλογικής εισόδου και ένα LED συνδέεται στον ακροδέκτη D10 του Arduino Nano.
Προγραμματισμός Arduino UNO & Arduino Nano για RS485 Serial Communication
Για τον προγραμματισμό χρησιμοποιούνται και οι δύο πίνακες Arduino IDE. Αλλά βεβαιωθείτε ότι έχετε επιλέξει το αντίστοιχο PORT από Tools-> Port and Board από Tools-> Board.
Πλήρης κωδικός με ένα Demo Video δίνεται στο τέλος αυτού του σεμιναρίου. Εδώ εξηγούμε σημαντικό μέρος του κώδικα. Υπάρχουν δύο προγράμματα σε αυτό το σεμινάριο, ένα για το Arduino UNO (Master) και άλλο για το Arduino Nano (Slave).
Επεξήγηση κώδικα για το Master: Arduino UNO
Στην πλευρά Master, απλώς πάρτε την αναλογική είσοδο στον ακροδέκτη A0 μεταβάλλοντας το ποτενσιόμετρο και στη συνέχεια SerialWrite αυτές τις τιμές στο δίαυλο RS-485 μέσω των σειριακών θυρών υλικού (0,1) του Arduino UNO.
Για να ξεκινήσετε τη σειριακή επικοινωνία στο Hardware Serial Pins (0,1) χρησιμοποιήστε:
Serial.begin (9600);
Για να διαβάσετε την αναλογική τιμή στον ακροδέκτη A0 του Arduino UNO και να τις αποθηκεύσετε σε μεταβλητή χρήση ποτού
int potval = analogRead (pushval);
Πριν γράψετε την τιμή potval στη σειριακή θύρα, οι ακίδες DE & RE του RS-485 πρέπει να είναι ΥΨΗΛΟ που είναι συνδεδεμένος στον ακροδέκτη 8 του Arduino UNO, ώστε να γίνει ο ακροδέκτης 8 ΥΨΟΣ:
digitalWrite (enablePin, HIGH);
Στη συνέχεια, για να βάλετε αυτές τις τιμές στη σειριακή θύρα συνδεδεμένη με τη λειτουργική μονάδα RS-485, χρησιμοποιήστε την ακόλουθη δήλωση
Serial.println (potval);
Επεξήγηση κώδικα για το Slave: Arduino NANO
Στην πλευρά Slave λαμβάνεται ακέραιος αριθμός από το Master RS-485 που είναι διαθέσιμο στη θύρα Serial Hardware του Arduino Nano (Pins -0,1). Απλώς διαβάστε αυτές τις τιμές και αποθηκεύστε σε μια μεταβλητή. Οι τιμές έχουν τη μορφή (0 -1023). Έτσι μετατρέπεται σε (0-255) καθώς χρησιμοποιείται τεχνική PWM για τον έλεγχο της φωτεινότητας των LED
Στη συνέχεια, AnalogWrite αυτές τις τιμές που έχουν μετατραπεί στον ακροδέκτη LED D10 (Πρόκειται για ακίδα PWM) Έτσι, ανάλογα με την τιμή PWM, η φωτεινότητα των LED αλλάζει και επίσης εμφανίζει αυτές τις τιμές στην οθόνη LCD 16x2.
Προκειμένου το RS-485 του Slave Arduino να λάβει τις τιμές από το Master, απλώς κάντε τις ακίδες DE & RE του RS-485 LOW. Έτσι, ο πείρος D8 (enablePin) του Arduino NANO γίνεται ΧΑΜΗΛΟΣ.
digitalWrite (enablePin, LOW);
Και για να διαβάσετε τα ακέραια δεδομένα που είναι διαθέσιμα στο Serial Port και να τα αποθηκεύσετε σε μεταβλητή χρήση
int pwmval = Serial.parseInt ();
Επόμενη τιμή μετατροπής από (0-1023 σε 0-255) και αποθηκεύστε τα σε μια μεταβλητή:
int convert = χάρτης (pwmval, 0,1023,0,255);
Στη συνέχεια, γράψτε την αναλογική τιμή (PWM) στην καρφίτσα D10 όπου είναι συνδεδεμένη η άνοδος LED:
analogWrite (ledpin, μετατροπή);
Για να εκτυπώσετε την τιμή PWM σε οθόνη LCD 16x2 χρησιμοποιήστε
lcd.setCursor (0,0); lcd.print ("PWM FROM MASTER"); lcd.setCursor (0,1); lcd.print (μετατροπή);
Έλεγχος φωτεινότητας LED με σειριακή επικοινωνία RS485
Όταν η τιμή PWM έχει οριστεί στο 0 χρησιμοποιώντας ποτενσιόμετρο, το LED σβήνει.
Και όταν η τιμή PWM έχει οριστεί στα 251 χρησιμοποιώντας ποτενσιόμετρο: Η λυχνία LED ανάβει με πλήρη φωτεινότητα όπως φαίνεται στην παρακάτω εικόνα:
Έτσι, το RS485 μπορεί να χρησιμοποιηθεί για σειριακή επικοινωνία στο Arduino.