Χρησιμοποιήστε αυτό το ισχυρό πρωτόκολλο σειριακής επικοινωνίας για να συνδέσετε δύο πλακέτες Arduino και να στείλετε δεδομένα μεταξύ τους.

Ο δίαυλος Controller Area Network (CAN) είναι ένα ισχυρό και αξιόπιστο πρωτόκολλο επικοινωνίας που χρησιμοποιείται ευρέως σε διάφορες βιομηχανικές, αυτοκινητοβιομηχανίες και αεροδιαστημικές εφαρμογές. Έχει σχεδιαστεί για τη μετάδοση δεδομένων μεταξύ μικροελεγκτών και συσκευών μέσω ενός δικτύου διαύλου CAN. Μπορεί να μην το γνωρίζετε ακόμα, αλλά είναι το πράγμα πίσω από αυτές τις τρελές mod ταμπλό αυτοκινήτου που βλέπετε στα μέσα κοινωνικής δικτύωσης.

Θα σας καθοδηγήσουμε στον τρόπο κατασκευής ενός διαύλου CAN με τη λειτουργική μονάδα MCP2515 CAN χρησιμοποιώντας ένα Arduino και ένα breadboard. Θα μεταβούμε επίσης στη βιβλιοθήκη CAN του Arduino και θα δείξουμε πώς να στέλνετε και να λαμβάνετε δεδομένα μέσω του διαύλου CAN.

Τι είναι ένα λεωφορείο CAN;

Ο δίαυλος CAN είναι ένα πρωτόκολλο σειριακής επικοινωνίας που αναπτύχθηκε από τη Bosch τη δεκαετία του 1980. Χρησιμοποιείται ευρέως σε διάφορες εφαρμογές λόγω της υψηλής αξιοπιστίας και στιβαρότητάς του. Επιτρέπει τη μετάδοση δεδομένων μεταξύ συσκευών σε υψηλές ταχύτητες με ελάχιστο λανθάνοντα χρόνο σε δύο μόνο γραμμές: CAN High και CAN Low.

instagram viewer

Το 1994, ο δίαυλος CAN έγινε διεθνές πρότυπο (ISO 11898) που σχεδιάστηκε ειδικά για την ταχεία σειριακή ανταλλαγή δεδομένων μεταξύ ηλεκτρονικών ελεγκτών σε εφαρμογές αυτοκινήτων. Ρίξτε μια ματιά στον ολοκληρωμένο οδηγό μας για τι είναι ένα λεωφορείο CAN και τι ρόλο παίζει στα συστήματα αυτοκινήτων για περισσότερες λεπτομέρειες.

Ένας από τους λόγους για τους οποίους ο δίαυλος CAN είναι τόσο δημοφιλής είναι λόγω των δυνατοτήτων ανίχνευσης και διόρθωσης σφαλμάτων. Το πρωτόκολλο μπορεί να εντοπίσει και να διορθώσει σφάλματα στη μετάδοση δεδομένων. Αυτό το καθιστά ιδανικό για εφαρμογές όπου η ακεραιότητα των δεδομένων είναι κρίσιμης σημασίας, όπως στον βιομηχανικό αυτοματισμό.

Γνωρίζοντας τη μονάδα MCP2515 CAN

Η μονάδα MCP2515 CAN Bus Controller είναι μια συσκευή που παρέχει εξαιρετική υποστήριξη για το ευρέως χρησιμοποιούμενο Πρωτόκολλο CAN έκδοση 2.0B. Αυτή η μονάδα είναι ιδανική για επικοινωνία με υψηλούς ρυθμούς δεδομένων έως και 1Mbps.

Το IC MCP2515 είναι ένας ανεξάρτητος ελεγκτής CAN με διεπαφή SPI που επιτρέπει την επικοινωνία με ένα ευρύ φάσμα μικροελεγκτών. Το IC TJA1050, από την άλλη πλευρά, λειτουργεί ως διεπαφή μεταξύ του IC ελεγκτή MCP2515 CAN και του φυσικού διαύλου CAN.

Για μεγαλύτερη ευκολία, υπάρχει ένας βραχυκυκλωτήρας που σας επιτρέπει να συνδέσετε τον τερματισμό 120 ohm, καθιστώντας ακόμα πιο εύκολη τη σύνδεση των καλωδίων σας στο CAN_H & ΜΠΟΡΩ βίδες για επικοινωνία με άλλες μονάδες CAN.

χαρακτηριστικό

Προσδιορισμός

Πομποδέκτης

TJA1050

Διεπαφή μικροελεγκτή

SPI (επιτρέπει την ενσωμάτωση διαύλου Multi CAN)

Κρυσταλλικός ταλαντωτής

8 MHz

Λήξη

120Ω

Ταχύτητα

1 Mbps

Κατανάλωση ενέργειας

Λειτουργία αναμονής χαμηλού ρεύματος

Διάσταση

40 x 28 mm

Χωρητικότητα κόμβου

Υποστηρίζει έως και 112 κόμβους

Μπορείτε να λάβετε πρόσθετες πληροφορίες από το Φύλλο δεδομένων MCP2515 σε περίπτωση που χρειάζεστε αυτήν την ενότητα για ένα πιο προηγμένο έργο.

Δομή μηνύματος CAN

Η δομή του μηνύματος CAN αποτελείται από πολλά τμήματα, αλλά τα πιο κρίσιμα τμήματα για αυτό το έργο είναι το αναγνωριστικό και τα δεδομένα. Το αναγνωριστικό, επίσης γνωστό ως CAN ID ή Parameter Group Number (PGN), προσδιορίζει τις συσκευές στο CAN δίκτυο και το μήκος του αναγνωριστικού μπορεί να είναι είτε 11 είτε 29 bit, ανάλογα με τον τύπο του πρωτοκόλλου CAN μεταχειρισμένος.

Εν τω μεταξύ, τα δεδομένα αντιπροσωπεύουν τα πραγματικά δεδομένα αισθητήρα/ελέγχου που μεταδίδονται. Τα δεδομένα μπορούν να έχουν μήκος από 0 έως 8 byte και ο κωδικός μήκους δεδομένων (DLC) υποδεικνύει τον αριθμό των byte δεδομένων που υπάρχουν.

Η βιβλιοθήκη Arduino MCP2515 CAN Bus

Αυτή η βιβλιοθήκη υλοποιεί το Πρωτόκολλο CAN V2.0B, που μπορεί να λειτουργήσει με ταχύτητες έως και 1Mbps. Παρέχει μια διεπαφή SPI που μπορεί να λειτουργήσει σε ταχύτητες έως και 10 MHz ενώ υποστηρίζει τυπικά (11-bit) και εκτεταμένα δεδομένα (29-bit). Επιπλέον, συνοδεύεται από δύο buffer λήψης, που επιτρέπουν την αποθήκευση μηνυμάτων με προτεραιότητα.

Εκκίνηση του διαύλου CAN

Ακολουθεί ο κωδικός εγκατάστασης που θα χρειαστείτε για την προετοιμασία του διαύλου CAN:

#περιλαμβάνω
#περιλαμβάνω

MCP2515 mcp2515(10); // Ορισμός ακίδας CS

κενόςεγκατάσταση(){
ενώ (!Κατα συρροη);
Κατα συρροη.αρχίζουν(9600);
SPI.αρχίζουν(); //Ξεκινά η επικοινωνία SPI

mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}

Αυτό εκκινεί το MCP2515 με ρυθμό μετάδοσης bit CAN 500 Kbps και συχνότητα ταλαντωτή 8 MHz.

MCP2515 CAN Λειτουργικές λειτουργίες

Υπάρχουν τρεις τρόποι λειτουργίας που χρησιμοποιούνται με τον ελεγκτή διαύλου CAN MCP2515:

  • setNormalMode(): ρυθμίζει τον ελεγκτή να στέλνει και να λαμβάνει μηνύματα.
  • setLoopbackMode(): ρυθμίζει τον ελεγκτή να στέλνει και να λαμβάνει μηνύματα, αλλά τα μηνύματα που στέλνει θα λαμβάνονται επίσης από μόνο του.
  • setListenOnlyMode(): ρυθμίζει τον ελεγκτή να λαμβάνει μόνο μηνύματα.

Αυτές είναι κλήσεις λειτουργιών που χρησιμοποιούνται για τη ρύθμιση του τρόπου λειτουργίας του ελεγκτή διαύλου CAN MCP2515.

mcp2515.setNormalMode();

mcp2515.setLoopbackMode();

mcp2515.setListenOnlyMode();

Αποστολή δεδομένων μέσω του διαύλου CAN

Για να στείλετε ένα μήνυμα μέσω του διαύλου CAN, χρησιμοποιήστε το sendMsgBuf() μέθοδος:

ανυπόγραφοαπανθρακώνω δεδομένα[] = {0x01, 0x02, 0x03, 0x04};
CAN.sendMsgBuf(0x01, 0, 4, δεδομένα)·

Αυτό στέλνει ένα μήνυμα με το αναγνωριστικό 0x01 και ένα ωφέλιμο φορτίο δεδομένων {0x01, 0x02, 0x03, 0x04}. Η πρώτη παράμετρος είναι το CAN ID, η δεύτερη είναι η προτεραιότητα του μηνύματος, η τρίτη είναι το μήκος του ωφέλιμου φορτίου δεδομένων και η τέταρτη είναι το ίδιο το ωφέλιμο φορτίο δεδομένων.

ο sendMsgBuf() Η μέθοδος επιστρέφει μια τιμή που υποδεικνύει εάν το μήνυμα στάλθηκε με επιτυχία ή όχι. Μπορείτε να ελέγξετε αυτήν την τιμή καλώντας το checkError() μέθοδος:

αν (CAN.checkError()) {
Κατα συρροη.println("Σφάλμα κατά την αποστολή μηνύματος.");
}

Αυτό ελέγχει εάν παρουσιάστηκε σφάλμα κατά τη μετάδοση του μηνύματος και εκτυπώνει ένα μήνυμα σφάλματος εάν είναι απαραίτητο.

Λήψη δεδομένων από το CAN Bus

Για να λάβετε ένα μήνυμα μέσω του διαύλου CAN, μπορείτε να χρησιμοποιήσετε το readMsgBuf() μέθοδος:

ανυπόγραφοαπανθρακώνω λεν = 0;
ανυπόγραφοαπανθρακώνω buf[8];
ανυπόγραφοαπανθρακώνω canID = 0;

αν (CAN.checkReceive()) {
CAN.readMsgBuf(&len, buf);
canID = CAN.getCanId();
}

Αυτό ελέγχει εάν ένα μήνυμα είναι διαθέσιμο στο δίαυλο CAN και στη συνέχεια διαβάζει το μήνυμα στο buf πίνακας. Το μήκος του μηνύματος αποθηκεύεται στο λεν μεταβλητή και το αναγνωριστικό του μηνύματος αποθηκεύεται στο canID μεταβλητός.

Μόλις λάβετε ένα μήνυμα, μπορείτε να επεξεργαστείτε το ωφέλιμο φορτίο δεδομένων όπως απαιτείται. Για παράδειγμα, θα μπορούσατε να εκτυπώσετε το ωφέλιμο φορτίο δεδομένων στη σειριακή οθόνη:

Κατα συρροη.Τυπώνω("Ελήφθηκε μήνυμα με ταυτότητα");
Κατα συρροη.Τυπώνω(canID, HEX);
Κατα συρροη.Τυπώνω("και δεδομένα: ");

Για (ενθ i = 0; i < len; i++) {
Κατα συρροη.Τυπώνω(buf[i], HEX);
Κατα συρροη.Τυπώνω(" ");
}

Κατα συρροη.println();

Αυτό εκτυπώνει το αναγνωριστικό του ληφθέντος μηνύματος και το ωφέλιμο φορτίο δεδομένων στη σειριακή οθόνη.

Πώς να συνδέσετε έναν πομποδέκτη διαύλου CAN σε ένα Breadboard

Για να δημιουργήσετε έναν δίαυλο CAN για τη σύνδεση δύο συσκευών σε αυτό το παράδειγμα έργου, θα χρειαστείτε:

  • Δύο μικροελεγκτές (δύο πλακέτες Arduino Nano για αυτό το παράδειγμα)
  • Δύο μονάδες MCP2515 CAN
  • Ένα breadboard
  • Καλώδια βραχυκυκλωτήρα
  • Μια μονάδα οθόνης LCD 16x2 I2C
  • Αισθητήρας υπερήχων HC-SR04

Για αυτό το παράδειγμα έργου, τέσσερις βιβλιοθήκες χρησιμοποιούνται στο σκίτσο του Arduino. Υπάρχει το NewPing βιβλιοθήκη, η οποία παρέχει μια εύχρηστη διεπαφή για τον αισθητήρα υπερήχων, καθώς και το Βιβλιοθήκη SPI, που διευκολύνει την επικοινωνία μεταξύ της πλακέτας Arduino και του ελεγκτή διαύλου CAN MCP2515. ο LiquidCrystal_I2C Η βιβλιοθήκη χρησιμοποιείται για τη μονάδα εμφάνισης.

Τέλος, υπάρχει το βιβλιοθήκη mcp2515 για διασύνδεση με το τσιπ MCP2515, επιτρέποντάς μας να μεταδίδουμε εύκολα δεδομένα μέσω του δικτύου διαύλου CAN.

Ρύθμιση υλικού (Παράδειγμα HC-SR04)

Σε αυτό το έργο χρησιμοποιώντας αισθητήρα HC-SR04 και LCD, μια πλακέτα Arduino Nano θα λειτουργεί ως δέκτης, ενώ η άλλη Arduino ως αποστολέας. Συνδέστε τα εξαρτήματα του αποστολέα σας σύμφωνα με το παρακάτω διάγραμμα καλωδίωσης:

Εδώ είναι το διάγραμμα για το κύκλωμα του δέκτη:

Τέλος, συνδέστε τους δύο κόμβους μεταξύ τους χρησιμοποιώντας το CAN_H και ΜΠΟΡΩ γραμμές όπως φαίνεται:

Όταν συνδέετε τις μονάδες, είναι σημαντικό να βεβαιωθείτε ότι η τάση τροφοδοσίας είναι εντός του καθορισμένου εύρους και ότι η ΜΠΟΡΕΙ Ο Χ και ΜΠΟΡΩ οι ακίδες είναι σωστά συνδεδεμένες με το δίαυλο.

Προγραμματισμός της μονάδας διαύλου CAN MCP2515

Σημειώστε ότι κατά τον προγραμματισμό της μονάδας MCP2515, είναι σημαντικό να χρησιμοποιείτε τον σωστό ρυθμό μετάδοσης bit για να διασφαλίσετε την επιτυχή επικοινωνία με άλλες συσκευές CAN στο δίκτυο.

Κωδικός αποστολέα:

#περιλαμβάνω
#περιλαμβάνω
#περιλαμβάνω

MCP2515 mcp2515(10);
συνθψηφιόλεξη trigPin = 3;
συνθψηφιόλεξη echoPin = 4;
NewPing υποβρύχιο ραντάρ(trigPin, echoPin, 200);

structcan_framecanMsg;

κενόςεγκατάσταση(){
Κατα συρροη.αρχίζουν(9600);
mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}

κενόςβρόχος(){
ανυπόγραφοενθ απόσταση = sonar.ping_cm();
canMsg.can_id = 0x036; //Αναγνωριστικό CAN ως 0x036
canMsg.can_dlc = 8; //Μήκος δεδομένων CAN ως 8
canMsg.data[0] = απόσταση; //Ενημέρωση τιμής υγρασίας σε [0]
canMsg.data[1] = 0x00; //Ξεκουράστε όλα με 0
canMsg.data[2] = 0x00;
canMsg.data[3] = 0x00;
canMsg.data[4] = 0x00;
canMsg.data[5] = 0x00;
canMsg.data[6] = 0x00;
canMsg.data[7] = 0x00;

mcp2515.sendMessage(&canMsg);//Στέλνει το μήνυμα CAN
καθυστέρηση(100);
}

Κωδικός παραλήπτη:

#περιλαμβάνω
#περιλαμβάνω
#περιλαμβάνω

MCP2515 mcp2515(10);
LiquidCrystal_I2C οθόνη υγρού κρυστάλλου(0x27,16,2);
structcan_framecanMsg;

κενόςεγκατάσταση(){
Κατα συρροη.αρχίζουν(9600);

mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
lcd.init();
lcd.backlight();
οθόνη υγρού κρυστάλλου.setCursor(0, 0);
οθόνη υγρού κρυστάλλου.Τυπώνω("MUO CAN TUTORIAL");
καθυστέρηση(3000);
οθόνη υγρού κρυστάλλου.Σαφή();
}

κενόςβρόχος(){
αν (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) // Για λήψη δεδομένων
{
ενθ απόσταση = canMsg.data[0];
οθόνη υγρού κρυστάλλου.setCursor(0,0);
οθόνη υγρού κρυστάλλου.Τυπώνω("Απόσταση: ");
οθόνη υγρού κρυστάλλου.Τυπώνω(απόσταση);
οθόνη υγρού κρυστάλλου.Τυπώνω("εκ ");
}
}

Μεταφέρετε τα έργα σας Arduino στο επόμενο επίπεδο

Ο συνδυασμός του διαύλου CAN και του Arduino παρέχει μια ισχυρή πλατφόρμα για τη δημιουργία ή εκμάθηση εξελιγμένων δικτύων επικοινωνίας που χρησιμοποιούνται σε διάφορες εφαρμογές. Αν και μπορεί να φαίνεται να είναι μια απότομη καμπύλη εκμάθησης, το να έχετε τη δική σας εγκατάσταση σε ένα breadboard είναι ένας πολύ εύχρηστος τρόπος για να μάθετε τα σχοινιά της χρήσης ενός δικτύου διαύλου CAN σε πολύπλοκα έργα DIY.