- Εισαγωγή στο CAN
- Σύγκριση CAN με SPI & I2C
- Εφαρμογές πρωτοκόλλου CAN
- Πώς να χρησιμοποιήσετε το πρωτόκολλο CAN στο Arduino
- Απαιτούμενα στοιχεία
- Διάγραμμα κυκλώματος
- Σύνδεση μεταξύ δύο μονάδων MCP2515 CAN
- Προγραμματισμός του Arduino για επικοινωνία CAN
- Επεξήγηση πλευρικού κώδικα πομπού CAN (Arduino Nano)
- CAN Εξήγηση πλευρικού κωδικού δέκτη (Arduino UNO)
- Εργασία της επικοινωνίας CAN στο Arduino
Σήμερα, κάθε μέσο αυτοκίνητο αποτελείται από περίπου 60 έως 100 μονάδες αισθητήρων για την ανίχνευση και την ανταλλαγή πληροφοριών. Με τις κατασκευές αυτοκινήτων που καθιστούν συνεχώς το αυτοκίνητό τους πιο εξυπνότερο με χαρακτηριστικά όπως Αυτόνομη οδήγηση, σύστημα αερόσακων, παρακολούθηση πίεσης ελαστικών, σύστημα ελέγχου κρουαζιέρας κ.λπ., αυτός ο αριθμός αναμένεται να αυξηθεί μόνο. Σε αντίθεση με άλλους αισθητήρες, αυτοί οι αισθητήρες επεξεργάζονται κρίσιμες πληροφορίες και ως εκ τούτου τα δεδομένα από αυτούς τους αισθητήρες πρέπει να κοινοποιούνται χρησιμοποιώντας τυπικά πρωτόκολλα επικοινωνίας αυτοκινήτων. Για παράδειγμα, τα δεδομένα συστήματος ελέγχου ταχύτητας, όπως ταχύτητα, θέση πεταλούδας κ.λπ. είναι ζωτικές τιμές που αποστέλλονται στην ηλεκτρονική μονάδα ελέγχου (ECU)Για να αποφασίσετε το επίπεδο επιτάχυνσης του αυτοκινήτου, μια εσφαλμένη επικοινωνία ή απώλεια δεδομένων εδώ θα μπορούσε να οδηγήσει σε κρίσιμες αποτυχίες. Ως εκ τούτου, σε αντίθεση με τα τυπικά πρωτόκολλα επικοινωνίας όπως UART, SPI ή I2C, οι σχεδιαστές χρησιμοποιούν πολύ αξιόπιστα πρωτόκολλα επικοινωνίας αυτοκινήτων όπως LIN, CAN, FlexRay κ.λπ.
Από όλα τα διαθέσιμα πρωτόκολλα το CAN χρησιμοποιείται κυρίως και είναι δημοφιλές. Έχουμε ήδη συζητήσει τι είναι το CAN και πώς λειτουργεί το CAN. Έτσι, σε αυτό το άρθρο θα εξετάσουμε ξανά τα βασικά και, τέλος, θα ανταλλάξουμε επίσης δεδομένα μεταξύ δύο Arduinos χρησιμοποιώντας την επικοινωνία CAN. Ακούγεται ενδιαφέρον, σωστά! Ας ξεκινήσουμε λοιπόν.
Εισαγωγή στο CAN
Το CAN aka Controller Area Network είναι ένας σειριακός δίαυλος επικοινωνίας σχεδιασμένος για βιομηχανικές και αυτοκινητοβιομηχανίες. Είναι ένα πρωτόκολλο βασισμένο σε μηνύματα που χρησιμοποιείται για την επικοινωνία μεταξύ πολλών συσκευών. Όταν συνδέονται πολλές συσκευές CAN όπως φαίνεται παρακάτω, η σύνδεση σχηματίζει ένα δίκτυο που ενεργεί όπως το κεντρικό νευρικό μας σύστημα, επιτρέποντας σε οποιαδήποτε συσκευή να μιλήσει με οποιαδήποτε άλλη συσκευή στον κόμβο.
Ένα δίκτυο CAN θα αποτελείται από μόνο δύο καλώδια CAN High και CAN Low για αμφίδρομη μετάδοση δεδομένων όπως φαίνεται παραπάνω. Συνήθως, η ταχύτητα επικοινωνίας για CAN κυμαίνεται από 50 Kbps έως 1Mbps και η απόσταση μπορεί να κυμαίνεται από 40 μέτρα σε 1Mbps έως 1000 μέτρα στα 50kpbs.
Μορφή μηνύματος CAN:
Στην επικοινωνία CAN τα δεδομένα μεταδίδονται στο δίκτυο ως συγκεκριμένη μορφή μηνύματος. Αυτή η μορφή μηνύματος περιέχει πολλά τμήματα, αλλά δύο κύρια τμήματα είναι το αναγνωριστικό και τα δεδομένα που βοηθούν στην αποστολή και απάντηση σε μηνύματα στο λεωφορείο CAN.
Αναγνωριστικό ή αναγνωριστικό CAN: Το αναγνωριστικό είναι επίσης γνωστό ως αναγνωριστικό CAN ή επίσης γνωστό ως PGN (αριθμός ομάδας παραμέτρων). Χρησιμοποιείται για την αναγνώριση των συσκευών CAN που υπάρχουν σε ένα δίκτυο CAN. Το μήκος του αναγνωριστικού είναι είτε 11 είτε 29 bit με βάση τον τύπο του πρωτοκόλλου CAN που χρησιμοποιείται.
Τυπικό CAN: 0-2047 (11-bit)
Εκτεταμένο CAN: 0-2 29 -1 (29-bit)
Δεδομένα: Αυτά είναι τα πραγματικά δεδομένα αισθητήρα / ελέγχου που πρέπει να αποστέλλονται από τη μία συσκευή στην άλλη. Τα δεδομένα μεγέθους μπορούν να έχουν μήκος από 0 έως 8 byte.
Κωδικός μήκους δεδομένων (DLC): 0 έως 8 για τον αριθμό των byte δεδομένων που υπάρχουν.
Σύρματα που χρησιμοποιούνται στο CAN:
Το πρωτόκολλο CAN αποτελείται από δύο καλώδια, δηλαδή CAN_H και CAN_L για αποστολή και λήψη πληροφοριών. Και τα δύο καλώδια λειτουργούν ως διαφορική γραμμή, που σημαίνει ότι το σήμα CAN (0 ή 1) αντιπροσωπεύεται από την πιθανή διαφορά μεταξύ CAN_L και CAN_H. Εάν η διαφορά είναι θετική και μεγαλύτερη από μια συγκεκριμένη ελάχιστη τάση, τότε είναι 1 και εάν η διαφορά είναι αρνητική είναι 0.
Κανονικά χρησιμοποιείται καλώδιο συνεστραμμένου ζεύγους για επικοινωνία CAN. Μια απλή αντίσταση 120 ohm χρησιμοποιείται γενικά στα δύο άκρα του δικτύου CAN όπως φαίνεται στην εικόνα, διότι η γραμμή πρέπει να είναι ισορροπημένη και να συνδέεται με το ίδιο δυναμικό.
Σύγκριση CAN με SPI & I2C
Εφόσον έχουμε ήδη μάθει πώς να χρησιμοποιούμε το SPI με το Arduino και το IIC με το Arduino, ας συγκρίνουμε τα χαρακτηριστικά του SPI και του I2C με το CAN
Παράμετρος | SPI | I2C | ΜΠΟΡΩ |
Ταχύτητα | 3Mbps έως 10Mbps | Τυπικό: 100Kbps | 10KBps έως 1MBps Εξαρτάται επίσης από το μήκος του καλωδίου που χρησιμοποιείται |
Γρήγορη: 400 Kbps | |||
Υψηλή ταχύτητα: 3,4Mbps | |||
Τύπος | Σύγχρονος | Σύγχρονος | Ασύγχρονη |
Αριθμός καλωδίων | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 καλώδια (SDA, SCL) | 2 καλώδια (CAN_H, CAN_L) |
Διπλός | Πλήρες διπλό | Μισό διπλό | Μισό διπλό |
Εφαρμογές πρωτοκόλλου CAN
- Λόγω της ευρωστίας και της αξιοπιστίας του πρωτοκόλλου CAN, χρησιμοποιούνται σε βιομηχανίες όπως Αυτοκίνητο, Βιομηχανικά μηχανήματα, Γεωργία, Ιατρικός Εξοπλισμός κ.λπ.
- Καθώς η πολυπλοκότητα της καλωδίωσης μειώνεται στο CAN χρησιμοποιούνται κυρίως σε εφαρμογές αυτοκινήτων όπως το αυτοκίνητο.
- Το χαμηλό κόστος εφαρμογής και επίσης η τιμή των εξαρτημάτων υλικού είναι επίσης μικρότερη.
- Εύκολη προσθήκη και αφαίρεση των συσκευών CAN bus.
Πώς να χρησιμοποιήσετε το πρωτόκολλο CAN στο Arduino
Καθώς το Arduino δεν περιέχει ενσωματωμένη θύρα CAN, χρησιμοποιείται μια μονάδα CAN που ονομάζεται MCP2515. Αυτή η μονάδα CAN συνδέεται με το Arduino χρησιμοποιώντας την επικοινωνία SPI. Ας δούμε περισσότερα για το MCP2515 λεπτομερώς και πώς συνδέεται με το Arduino.
Ενότητα MCP2515 CAN:
Η μονάδα MCP2515 διαθέτει έναν ελεγκτή CAN MCP2515 που είναι πομποδέκτης CAN υψηλής ταχύτητας. Η σύνδεση μεταξύ MCP2515 και MCU γίνεται μέσω SPI. Έτσι, είναι εύκολο να συνδεθείτε με οποιονδήποτε μικροελεγκτή που έχει διασύνδεση SPI.
Για αρχάριους που θέλουν να μάθουν CAN Bus, αυτή η ενότητα θα λειτουργεί ως καλή αρχή. Αυτός ο πίνακας CAN SPI είναι ιδανικός για βιομηχανικούς αυτοματισμούς, οικιακούς αυτοματισμούς και άλλα ενσωματωμένα αυτοκίνητα έργα.
Χαρακτηριστικά και προδιαγραφές του MCP2515:
- Χρησιμοποιεί πομποδέκτη CAN υψηλής ταχύτητας TJA1050
- Διαστάσεις: 40 × 28mm
- Έλεγχος SPI για επέκταση διεπαφής διαύλου πολλαπλών CAN
- Ταλαντωτής κρυστάλλου 8MHZ
- 120Ω αντίσταση τερματικού
- Διαθέτει ανεξάρτητο κλειδί, ένδειξη LED, ένδειξη ισχύος
- Υποστηρίζει λειτουργία CAN 1 Mb / s
- Χαμηλή τρέχουσα λειτουργία αναμονής
- Μπορούν να συνδεθούν έως και 112 κόμβοι
Pinout του MCP2515 CAN Module:
Όνομα καρφιτσώματος |
ΧΡΗΣΗ |
VCC |
Καρφίτσα εισόδου 5V |
GND |
Καρφίτσα γείωσης |
CS |
SPI SLAVE select pin (Ενεργό χαμηλό) |
ΕΤΣΙ |
Υποδοχή εξόδου κύριας εισαγωγής SPI |
ΣΙ |
Υποδοχή εισόδου κύριας εξόδου SPI |
SCLK |
Καρφίτσα ρολογιού SPI |
ΙΝΤ |
Πείρος διακοπής MCP2515 |
Σε αυτό το σεμινάριο ας δούμε πώς να στέλνουμε δεδομένα αισθητήρα υγρασίας & θερμοκρασίας (DHT11) από το Arduino Nano στο Arduino Uno μέσω της μονάδας CAN bus MCP2515.
Απαιτούμενα στοιχεία
- Arduino UNO
- Arduino NANO
- DHT11
- Οθόνη LCD 16x2
- MCP2515 CAN Module - 2
- Ποτενσιόμετρο 10k
- Ψωμί
- Σύνδεση καλωδίων
Διάγραμμα κυκλώματος
Σύνδεση στην πλευρά πομπού CAN:
Στοιχείο - Καρφίτσα |
Arduino Nano |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - CS |
D10 (SPI_SS) |
MPC2515 - SO |
D12 (SPI_MISO) |
MPC2515 - SI |
D11 (SPI_MOSI) |
MPC2515 - SCK |
D13 (SPI_SCK) |
MPC2515 - INT |
Δ2 |
DHT11 - VCC |
+ 5V |
DHT11 - GND |
GND |
DHT11 - ΕΞΩ |
Α0 |
Συνδέσεις κυκλώματος στην πλευρά του δέκτη CAN:
Στοιχείο - Καρφίτσα |
Arduino UNO |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - CS |
10 (SPI_SS) |
MPC2515 - SO |
12 (SPI_MISO) |
MPC2515 - SI |
11 (SPI_MOSI) |
MPC2515 - SCK |
13 (SPI_SCK) |
MPC2515 - INT |
2 |
LCD - VSS |
GND |
LCD - VDD |
+ 5V |
LCD - V0 |
Σε 10Κ κέντρο ποτενσιόμετρου PIN |
LCD - RS |
3 |
LCD - RW |
GND |
LCD - Ε |
4 |
LCD - D4 |
5 |
LCD - D5 |
6 |
LCD - D6 |
7 |
LCD - D7 |
8 |
LCD - Α |
+ 5V |
LCD - Κ |
GND |
Σύνδεση μεταξύ δύο μονάδων MCP2515 CAN
H - CAN High
L - CAN χαμηλή
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
Η |
Η |
μεγάλο |
μεγάλο |
Μόλις έγιναν όλες οι συνδέσεις, το υλικό μου έμοιαζε παρακάτω
Προγραμματισμός του Arduino για επικοινωνία CAN
Πρώτα πρέπει να εγκαταστήσουμε μια βιβλιοθήκη για CAN στο Arduino IDE. Η διεπαφή MCP2515 CAN Module με το Arduino γίνεται ευκολότερη χρησιμοποιώντας την ακόλουθη βιβλιοθήκη.
- Κατεβάστε το αρχείο ZIP της βιβλιοθήκης Arduino CAN MCP2515.
- Από το Arduino IDE: Σκίτσο -> Συμπερίληψη βιβλιοθήκης -> Προσθήκη βιβλιοθήκης.ZIP
Σε αυτό το σεμινάριο η κωδικοποίηση χωρίζεται σε δύο μέρη ένα ως κωδικός πομπού CAN (Arduino Nano) και άλλο ως κωδικός δέκτη CAN (Arduino UNO) και οι δύο βρίσκονται στο κάτω μέρος αυτής της σελίδας. Η εξήγηση για το ίδιο έχει ως εξής.
Πριν γράψετε πρόγραμμα για αποστολή και λήψη δεδομένων, βεβαιωθείτε ότι έχετε εγκαταστήσει τη βιβλιοθήκη ακολουθώντας τα παραπάνω βήματα και ότι η ενότητα CAN MCP2515 έχει αρχικοποιηθεί στο πρόγραμμά σας ως εξής.
Αρχικοποιήστε το MCP2515 CAN Module:
Για να δημιουργήσετε σύνδεση με MCP2515 ακολουθήστε τα βήματα:
1. Ορίστε τον αριθμό pin όπου είναι συνδεδεμένο το SPI CS (10 από προεπιλογή)
MCP2515 mcp2515 (10);
2. Ορίστε ρυθμό baud και συχνότητα ταλαντωτή
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Διαθέσιμα ποσοστά Baud:
CAN_5KBPS, CAN_10KBPS, CAN_20KBPS, CAN_31K25BPS, CAN_33KBPS, CAN_40KBPS, CAN_50KBPS, CAN_80KBPS, CAN_83K3BPS, CAN_95KBPS, CAN_100KBPS, CAN_125KBPS, CAN_200KBPS, CAN_50KBPS, CAN_50KBPS, CAN_250
Διαθέσιμες ταχύτητες ρολογιού:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Ρυθμίστε τις λειτουργίες.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
Επεξήγηση πλευρικού κώδικα πομπού CAN (Arduino Nano)
Στην ενότητα πομπού, το Arduino Nano διασυνδέθηκε με τη μονάδα MCP2515 CAN μέσω ακίδων SPI και το DHT11 στέλνει δεδομένα θερμοκρασίας και υγρασίας στο δίαυλο CAN.
Πρώτα περιλαμβάνονται οι απαιτούμενες βιβλιοθήκες, SPI Library για χρήση SPI Communication, MCP2515 Library για χρήση CAN Communication και DHT Library για χρήση αισθητήρα DHT με Arduino . Προηγουμένως διασυνδέσαμε το DHT11 με τον Arduino.
#περιλαμβάνω
Τώρα ορίζεται το όνομα του DHT11 (OUT pin) που συνδέεται με το A0 του Arduino Nano
# καθορισμός DHTPIN A0
Επίσης, το DHTTYPE ορίζεται ως DHT11.
# καθορισμός DHTTYPE DHT11
Ένας τύπος δεδομένων canMsg struct για αποθήκευση μορφής μηνύματος CAN.
struct can_frame canMsg;
Ορίστε τον αριθμό pin όπου είναι συνδεδεμένο το SPI CS (10 από προεπιλογή)
MCP2515 mcp2515 (10);
Επίσης, αρχικοποιείται το αντικείμενο dht για κλάση DHT με πείρο DHT με Arduino Nano και DHT καθώς DHT11.
DHT dht (DHTPIN, DHTTYPE);
Επόμενο σε ρύθμιση κενού ():
Ξεκινήστε την επικοινωνία SPI χρησιμοποιώντας την ακόλουθη δήλωση
SPI.begin ();
Στη συνέχεια, χρησιμοποιήστε την παρακάτω δήλωση για να αρχίσετε να λαμβάνετε τιμές θερμοκρασίας και υγρασίας από τον αισθητήρα DHT11.
dht.begin ();
Στη συνέχεια το MCP2515 γίνεται RESET χρησιμοποιώντας την ακόλουθη εντολή
mcp2515.reset ();
Τώρα το MCP2515 έχει ρυθμιστεί ταχύτητα 500KBPS και 8MHZ ως ρολόι
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Και το MCP2525 έχει ρυθμιστεί σε κανονική λειτουργία
mcp2515.setNormalMode ();
Στο κενό βρόχο ():
Η ακόλουθη δήλωση λαμβάνει την τιμή υγρασίας και θερμοκρασίας και αποθηκεύεται σε μια ακέραια μεταβλητή h και t.
int h = dht.readHumidity (); int t = dht.readTemperature ();
Στη συνέχεια, το CAN ID δίνεται ως 0x036 (ανάλογα με την επιλογή) και το DLC ως 8 και δίνουμε τα δεδομένα h και t στα δεδομένα και τα δεδομένα και ξεκουράζουμε όλα τα δεδομένα με 0.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // Ενημέρωση τιμής υγρασίας στο canMsg.data = t; // Ενημέρωση τιμής θερμοκρασίας στο canMsg.data = 0x00; // Ξεκουραστείτε όλα με 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
Μετά από όλα, για να στείλουμε το μήνυμα στο CAN BUS χρησιμοποιούμε την ακόλουθη δήλωση.
mcp2515.sendMessage (& canMsg);
Τώρα λοιπόν τα δεδομένα θερμοκρασίας και υγρασίας αποστέλλονται ως μήνυμα στο CAN bus.
CAN Εξήγηση πλευρικού κωδικού δέκτη (Arduino UNO)
Στην ενότητα δέκτη, το Arduino UNO διασυνδέθηκε με την οθόνη LCD MCP2515 και 16x2. Εδώ το Arduino UNO λαμβάνει τη θερμοκρασία και την υγρασία από το CAN bus και εμφανίζει τα δεδομένα που λαμβάνονται σε LCD.
Πρώτα περιλαμβάνονται οι απαιτούμενες βιβλιοθήκες, SPI Library για χρήση SPI Communication, MCP2515 Library για χρήση CAN Communication και LiquidCrsytal Library για χρήση 16x2 LCD με Arduino .
#περιλαμβάνω
Στη συνέχεια καθορίζονται οι ακίδες LCD που χρησιμοποιούνται για τη σύνδεση με το Arduino UNO.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Ένας τύπος δεδομένων δομής δηλώνεται για αποθήκευση μορφής μηνύματος CAN.
struct can_frame canMsg;
Ορίστε τον αριθμό pin όπου είναι συνδεδεμένο το SPI CS (10 από προεπιλογή)
MCP2515 mcp2515 (10);
Σε άκυρη ρύθμιση ():
Αρχικά η οθόνη LCD έχει ρυθμιστεί σε λειτουργία 16x2 και εμφανίζεται ένα μήνυμα καλωσορίσματος.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("CAN ARDUINO"); καθυστέρηση (3000) lcd.clear ();
Ξεκινήστε την επικοινωνία SPI χρησιμοποιώντας την ακόλουθη δήλωση.
SPI.begin ();
Στη συνέχεια το MCP2515 γίνεται RESET χρησιμοποιώντας την ακόλουθη εντολή.
mcp2515.reset ();
Τώρα το MCP2515 έχει ρυθμιστεί ταχύτητα 500KBPS και 8MHZ ως ρολόι.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Και το MCP2525 έχει ρυθμιστεί σε κανονική λειτουργία.
mcp2515.setNormalMode ();
Επόμενο σε κενό βρόχο ():
Η ακόλουθη δήλωση χρησιμοποιείται για τη λήψη του μηνύματος από το λεωφορείο CAN. Εάν ληφθεί μήνυμα εισέρχεται στην κατάσταση if .
εάν (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
Στην περίπτωση εάν τα δεδομένα λαμβάνονται και αποθηκεύονται στο c anMsg , τα δεδομένα που έχουν τιμή υγρασίας και δεδομένα που έχουν τιμή θερμοκρασίας Και οι δύο τιμές αποθηκεύονται σε ακέραιο x και y.
int x = canMsg.data; int y = canMsg.data;
Αφού λάβετε τις τιμές, οι τιμές θερμοκρασίας και υγρασίας εμφανίζονται σε οθόνη LCD 16x2 χρησιμοποιώντας την ακόλουθη δήλωση.
lcd.setCursor (0,0); lcd.print ("Υγρασία:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Temp:"); lcd.print (y); καθυστέρηση (1000) lcd.clear ();
Εργασία της επικοινωνίας CAN στο Arduino
Όταν το υλικό είναι έτοιμο ανεβάστε το πρόγραμμα για πομπό CAN και δέκτη CAN (τα πλήρη προγράμματα δίνονται παρακάτω) στις αντίστοιχες πλακέτες Arduino. Όταν ενεργοποιείτε, θα πρέπει να παρατηρήσετε ότι η τιμή θερμοκρασίας που διαβάζεται από το DHT11 θα σταλεί σε άλλο Arduino μέσω επικοινωνίας CAN και θα εμφανιστεί στην οθόνη LCD του 2ου Arduino όπως μπορείτε να δείτε στην παρακάτω εικόνα. Έχω χρησιμοποιήσει επίσης το τηλεχειριστήριο AC για να ελέγξω εάν η θερμοκρασία που εμφανίζεται στην οθόνη LCD είναι κοντά στην πραγματική θερμοκρασία δωματίου.
Η πλήρης εργασία βρίσκεται στο παρακάτω βίντεο. Εάν έχετε οποιεσδήποτε ερωτήσεις αφήστε τις στην ενότητα σχολίων ή χρησιμοποιήστε τα φόρουμ μας για άλλες τεχνικές ερωτήσεις.